|
Программирование Вопросы связанные с программированием в JAVA |
23.07.2006, 18:22
|
#1
|
Администратор
Регистрация: 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
|
Unity/C# кодер
Регистрация: 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; и пытаешься его использовать... несмотря на то что он статичный, он не инициализирован... поэтому ничего и не работает
|
(Offline)
|
|
24.07.2006, 10:51
|
#3
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Re: и снова нифига не работает
в принципе достаточно объявить по одной статической переменной для каждого класса в Main и тогда не будет путаницы с неприсвоенными значениями. Например к дисплею удобно обращаться
publlic static Display display;
один раз присвоив ему значение в startApp()
И тогда просто Main.display.getCurrent();
|
(Offline)
|
|
24.07.2006, 12:10
|
#4
|
Администратор
Регистрация: 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
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Re: и снова нифига не работает
вообще-то по-умному берется LayerManager, вешается на GameCanvas. А уже к LM добавляются спрайты и они автоматически будут отрисовываться по flushGraphics. У меня в либе для МР именно так сделано и все четко работает. Стоит ли изобретать велосипед?
|
(Offline)
|
|
24.07.2006, 17:23
|
#6
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Re: и снова нифига не работает
хммм... пасиб! попробую...
у меня просто книги путевой нету... а в хелпе полазил.. хз нафиг его сделали... функций я там путевых не нашел... и забил на него...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
25.07.2006, 11:13
|
#7
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Re: и снова нифига не работает
уже не помню где качал: ГорнаковС_ПрограммированиеМобильныхТелефоновНаJava 2MicroEdition_2004_ДмкПресс_331с.djvu
довольно толково для начала и на русском.
|
(Offline)
|
|
28.07.2006, 00:18
|
#8
|
Администратор
Регистрация: 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
|
Администратор
Регистрация: 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
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Re: и снова нифига не работает
статические переменные не уничтожаются. они создаются в единственном экземпляре для класса, а не для объекта этого класса. и обращение класс.переменная - самое нормальное. а вот если плодить везде локальные переменные и передавть ссылки то умрешь просто.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
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, время: 09:52.
|