forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Программирование (http://forum.boolean.name/forumdisplay.php?f=54)
-   -   и снова нифига не работает (http://forum.boolean.name/showthread.php?t=1185)

SubZer0 23.07.2006 18:22

и снова нифига не работает
 
Я думаю, что у меня опять та-же проблема... но поскольку ни 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);" то сразу все виснет... опять видать чето "нестатичное" вызываеццо... и что я проследить не могу... вроде все статичное... плиз хелп! :''((

pax 23.07.2006 22:43

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; и пытаешься его использовать... несмотря на то что он статичный, он не инициализирован... поэтому ничего и не работает ;)

Piligrim 24.07.2006 10:51

Re: и снова нифига не работает
 
в принципе достаточно объявить по одной статической переменной для каждого класса в Main и тогда не будет путаницы с неприсвоенными значениями. Например к дисплею удобно обращаться
publlic static Display display;
один раз присвоив ему значение в startApp()
И тогда просто Main.display.getCurrent();

SubZer0 24.07.2006 12:10

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 ведь работает... какого х**** спрайтам надо... :dontknow:

Piligrim 24.07.2006 15:14

Re: и снова нифига не работает
 
вообще-то по-умному берется LayerManager, вешается на GameCanvas. А уже к LM добавляются спрайты и они автоматически будут отрисовываться по flushGraphics. У меня в либе для МР именно так сделано и все четко работает. Стоит ли изобретать велосипед?

SubZer0 24.07.2006 17:23

Re: и снова нифига не работает
 
хммм... пасиб! попробую...

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

:)

Piligrim 25.07.2006 11:13

Re: и снова нифига не работает
 
уже не помню где качал: ГорнаковС_ПрограммированиеМобильныхТелефоновНаJava 2MicroEdition_2004_ДмкПресс_331с.djvu
довольно толково для начала и на русском.

SubZer0 28.07.2006 00:18

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);
 
    }
   
}

хз... теперь без проблем спрайты рисовать можно :)

SubZer0 09.08.2006 20:20

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, то это сильно накладно получаеццо... и если ченить новое записать в эту переменную, то при выходе из класса все потеряется, поскольку фактически была проинициализирована новая переменная и в нее записано значение...

короче вопрос: как показать в какомнить классе что такая переменная уже объявлена в другом классе, и как ее юзать, чтоб не писать постоянно полное имя :)

Piligrim 10.08.2006 02:25

Re: и снова нифига не работает
 
статические переменные не уничтожаются. они создаются в единственном экземпляре для класса, а не для объекта этого класса. и обращение класс.переменная - самое нормальное. а вот если плодить везде локальные переменные и передавть ссылки то умрешь просто.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot