Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > JAVA Micro Edition > Программирование

Программирование Вопросы связанные с программированием в JAVA

Ответ
 
Опции темы
Старый 23.07.2006, 18:22   #1
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Сообщение и снова нифига не работает

Я думаю, что у меня опять та-же проблема... но поскольку ни IDE, ни в процессе выполнения никакой ошибки не выскакивает, и по моей примитивной логике все нормально, прошу совета...

есть у меня три файла:

main.java
import java.io.IOException;
import java.util.*;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Main extends MIDlet implements CommandListener
{
    public Main midlet = this;
    public static Display MD = null;
    public static Timer timer = null;
    public static GameC GC = null;
    public static Graphics MG = null;
    public static MainLoop ML = null;
    public static Image TestTile = null;
    public static Spr SprC = null;
    
    int i,j;

    public void startApp()
    {
        GC = new GameC();
               
        GC.CreateScreen();
        MG = GC.CreateScreen();
        Display.getDisplay(this).setCurrent(GC);

        GC.addCommand(new Command("Exit", Command.EXIT, 1));
        GC.setCommandListener(this);

        TimerTask TT = new MainLoop();
        timer = new Timer();
        timer.schedule( TT, 0, 500 );
        try {
            TestTile = Image.createImage("/Tank1red.png");
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        
        SprC = new Spr(TestTile,20,20);
        
    }
    
    public void pauseApp()
    {
    }
    
    public void destroyApp(boolean unconditional)
    {
    }

    public void commandAction(Command command, Displayable displayable) {
       if (command.getCommandType() == Command.EXIT) {
       destroyApp(true);
       notifyDestroyed();
      }
    }

}
class MainLoop extends TimerTask {

    public static GameC GC = null;
    public static Display MD = null;
    public static Graphics MG = null;
    public static Spr SprC = null;
    public static Image TestTile = null;


    int i=0,j=0;    

    public static Main midlet = null;

    
    public void run() {

        //System.out.println(3);
        //midlet.SprC.paintSprite(MG);
        //midlet.GC.paint(MG);
        //midlet.SprC.paint(MG);
        midlet.GC.PAll();
        
    }
    
}
Spr.java
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.*;


public class Spr extends Sprite

{

    public static GameC GC = null;
    public static Spr SprC = null;
    public static Image TestTile = null;
    public static Graphics MG = null;
    
    public Spr(Image image, int x,int y)
    {
        super(image, x, y); 
   
    }
    
    public void paintSprite(Graphics MG)
    {
        paint(MG);
    }
    
}
GameC.java
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.Graphics;

public class GameC extends GameCanvas {
    
    static int i=0,j=0;
    public static GameC GC = null;
    public static Display MD = null;
    public static Graphics MG = null;
    public static Main midlet = null;
    
    public GameC() {
        super(true);
    }
    
    public Graphics CreateScreen() {
        return getGraphics();
    }
    
    public static void PAll() {

        midlet.MG.setColor(128,128,128);
        

        if (i>100) {i=0;j=+10;}
        if (j>100) {i=0;j=0;}
        i+=10;
        
        midlet.MG.fillRect(i,j,10,10);


        midlet.GC.flushGraphics();

    }
    


    
}
если все это дело откомпилить и запустить, то всё работает... на экране рисуюццо квадратики... гут... но как нарисовать спрайт? раскомментирую "midlet.SprC.paintSprite(MG);" или "midlet.SprC.paint(MG);" то сразу все виснет... опять видать чето "нестатичное" вызываеццо... и что я проследить не могу... вроде все статичное... плиз хелп!
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 23.07.2006, 22:43   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Re: и снова нифига не работает

class MainLoop extends TimerTask {

    public static GameC GC = null;
    public static Display MD = null;
    public static Spr SprC = null;
    public static Image TestTile = null;


    int i=0,j=0;    

    public static Main midlet = null;

    
    public void run() {

        System.out.println(3);
        midlet.SprC.paintSprite(midlet.MG);
        midlet.GC.paint(midlet.MG);
        midlet.SprC.paint(midlet.MG);
        midlet.GC.PAll();
        
    }
    
}
Попробуй вот так
У тебя инициализирован класс Graphics MG только в классе Main, на который указывает статичная переменная неинициализированного экземпляра класса Main midlet.
Вобщем незачем объявлять статичные неинициализированные экземпляры нужных тебе классов в каждом классе... это можно сделать для удобства, но если ты не присваиваешь им ссылки на существующий экземпляр класса, то соответственно ничего работать не будет...

В классе class Main extends MIDlet implements CommandListener у тебя инициализирутся экземпляр класса public static Graphics MG = null; вот так: MG = GC.CreateScreen();, так как этот экземпляр является статичным, то он доступен из всех остальных экземпляров любых классов, вызывающих его после его создания... у тебя же получается, что ты в классе class Spr extends Sprite создаешь неинициализированный экземпляр класса public static Graphics MG = null; и пытаешься его использовать... несмотря на то что он статичный, он не инициализирован... поэтому ничего и не работает
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 24.07.2006, 10:51   #3
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Re: и снова нифига не работает

в принципе достаточно объявить по одной статической переменной для каждого класса в Main и тогда не будет путаницы с неприсвоенными значениями. Например к дисплею удобно обращаться
publlic static Display display;
один раз присвоив ему значение в startApp()
И тогда просто Main.display.getCurrent();
(Offline)
 
Ответить с цитированием
Старый 24.07.2006, 12:10   #4
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Радость Re: и снова нифига не работает

да, все это хорошо, только все как не работало так и продолжает не работать... видно есть еще гдето загвоздка...

превратил MainLoop в
class MainLoop extends TimerTask {


    int i=0,j=0;    

    public static Main midlet = null;

    
    public void run() {

        System.out.println(3);
        //midlet.SprC.paintSprite(midlet.MG);
        //midlet.GC.paint(midlet.MG);
        midlet.SprC.paint(midlet.MG);
        //midlet.GC.PAll();
        
    }
    
}
один фиг не работает... и я вот не пойму... ну GameCanvas ведь работает... какого х**** спрайтам надо...
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 24.07.2006, 15:14   #5
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Re: и снова нифига не работает

вообще-то по-умному берется LayerManager, вешается на GameCanvas. А уже к LM добавляются спрайты и они автоматически будут отрисовываться по flushGraphics. У меня в либе для МР именно так сделано и все четко работает. Стоит ли изобретать велосипед?
(Offline)
 
Ответить с цитированием
Старый 24.07.2006, 17:23   #6
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Re: и снова нифига не работает

хммм... пасиб! попробую...

у меня просто книги путевой нету... а в хелпе полазил.. хз нафиг его сделали... функций я там путевых не нашел... и забил на него...

__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 25.07.2006, 11:13   #7
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Re: и снова нифига не работает

уже не помню где качал: ГорнаковС_ПрограммированиеМобильныхТелефоновНаJava 2MicroEdition_2004_ДмкПресс_331с.djvu
довольно толково для начала и на русском.
(Offline)
 
Ответить с цитированием
Старый 28.07.2006, 00:18   #8
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Сообщение Re: и снова нифига не работает

есть у меня такое... только хз чем эти djvu открывать...


мне LayerManager не подойдет, мне надо будет одновременно до сотни спрайтов держать на экране (технику, пули и т.п.)...

короче универсальными функциями тут выкоблучиваться надо... проще самому описать... буду сам вырисовывать на экран спрайты какие нужно...

самое интересное оно почемуто заработало... а вот почему я до сих пор понять не могу... стоит всеголишь все поновой переписать...

main.java
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class Main extends MIDlet implements CommandListener {
    public Main main = this;
    
    public static Display MD = null;
    public static Timer timer = null;
    public static GameC GC = null;
    public static Graphics MG = null;
    public static MainLoop ML = null;
    public static Spr SprC = null;

    
    public static Image TestTile;
    
    public void startApp() {
        
        GC = new GameC();
        MG = GC.CreateScreen();
        Display.getDisplay(this).setCurrent(GC);
        GC.addCommand(new Command("Exit", Command.EXIT, 1));
        GC.setCommandListener(main);
        
        try {
            TestTile = Image.createImage("/Tank1red.png");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        SprC = new Spr(TestTile,20,20);
        
        
        TimerTask TT = new MainLoop();
        timer = new Timer();
        timer.schedule( TT, 0, 500 );
        
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command command, Displayable displayable) {
       if (command.getCommandType() == Command.EXIT) {
        destroyApp(true);
        notifyDestroyed();
       }
       
    }
}

class MainLoop extends TimerTask {

    int i=0,j=0;    

    public static Main main = null;

    public void run() {

        System.out.println(3);
        main.SprC.paint(main.MG);
        main.GC.flushGraphics();

        
        
    }
    
}

GameC.java
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class GameC extends GameCanvas {
    
    public static Main main = null;
        
    public GameC() {
        super(true);
    }
    
    public Graphics CreateScreen() {
        return getGraphics();
    }

}

Spr.java
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

public class Spr extends Sprite {
    
    public static Main main = null;
    
    
    public Spr(Image image, int x,int y)
    {
        super(image, x, y); 
   
    }
    
}
хз... теперь без проблем спрайты рисовать можно
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 09.08.2006, 20:20   #9
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Re: и снова нифига не работает

Сообщение от PAX
В классе class Main extends MIDlet implements CommandListener у тебя инициализирутся экземпляр класса public static Graphics MG = null; вот так: MG = GC.CreateScreen();, так как этот экземпляр является статичным, то он доступен из всех остальных экземпляров любых классов, вызывающих его после его создания... у тебя же получается, что ты в классе class Spr extends Sprite создаешь неинициализированный экземпляр класса public static Graphics MG = null; и пытаешься его использовать... несмотря на то что он статичный, он не инициализирован... поэтому ничего и не работает
как он доступен? через midlet.MG ? так можно вроде бы к любой переменной обратиться... а как из другого класса обратиться именно к той переменной, не к значению которое можно передать путем public Graphics MG = midlet.MG, а к самой переменной... потому что получается что я теперь насоздавал новых переменных и если ко всем писать "полные имена", начиная от midlet, то это сильно накладно получаеццо... и если ченить новое записать в эту переменную, то при выходе из класса все потеряется, поскольку фактически была проинициализирована новая переменная и в нее записано значение...

короче вопрос: как показать в какомнить классе что такая переменная уже объявлена в другом классе, и как ее юзать, чтоб не писать постоянно полное имя
__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 10.08.2006, 02:25   #10
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Re: и снова нифига не работает

статические переменные не уничтожаются. они создаются в единственном экземпляре для класса, а не для объекта этого класса. и обращение класс.переменная - самое нормальное. а вот если плодить везде локальные переменные и передавть ссылки то умрешь просто.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
И снова о выборе... turBO 3D-программирование 2 18.11.2009 00:16
Снова муз. impersonalis Болтовня 12 31.03.2009 16:18
Снова и снова. magpro 3D-программирование 24 23.12.2007 21:59
снова Irr DarkKnight C++ 19 06.09.2007 21:17
Я снова тут ;) SubZer0 Болтовня 5 02.09.2006 10:30


Часовой пояс GMT +4, время: 11:43.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com