Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Переход


Автор: fare 1.8.2006, 09:01
Помогите, мне нужно перейти из одного класса GameCanvas,  при нажатии кнопки, в другой класс GameCanvas, который нах-ся в другом файле! Возможно ли это?

Автор: 02077461 1.8.2006, 10:26
Ты сам-то понял что сказал?.
GameCanvas, ето класс, он храниться в файле. Может ты имеешь ввиду что у тебя в двух разных файлах храняться разные классы, наследованные от GameCanvas? Тогда надо сделать последовательно
Код

...
setCurrent( new my.package.MyCanvas1());
....
setCurrent( new my.package.MyCanvas2());
...

Автор: fare 9.8.2006, 00:57
Простите за долгое отсутсвие! Ну да не правельно выразился! 02077461 Спасибо за помощь. smile 

Автор: fare 11.8.2006, 23:24
02077461, рано сказал спасибо.
Подскажи правельно ли я делаю?
Мне надо перейти из класса f в класс а.
Код

класс а находится в файле а.java

package a;
public class a extends GameCanvas implements Runnable
{
...
...
...
}

класс f находится в файле f.java

import a.*
public class f extends GameCanvas implements Runnable
{
...
...
...
if((keyStates & FIRE_PRESSED) !=0)
{
setCurrent(new a());
}
}


Выдает ошибку в классе а хотя он был раньше правельный.
Пишет что ошибка в классе а.а, хотя он у меня просто а. 
В чем может быть проблема? Может кто сталкивался

Автор: AndriyTyurnikov 12.8.2006, 21:30
Недостаточно данных =)
Дай код классов и текст (эффекты) ошибки

Автор: Dancer 14.8.2006, 09:27
если a.a() - то конечно же в конструкторе проблема. Возможно у тебя нету конструктора без параметров. Но, как правильно сказали ранее - без кода не ясно.
И ещё одно!!!!! (уже не декомпилированный ли ты код используешь?!)
очень на это похоже - все эти a, f, и т.д.
Ты мог не всё так просто декомпилить. И не факт что у тебя твой код будет обратно компилиться нормально!


Автор: fare 17.8.2006, 14:49
Я пишу программу с нуля.

Автор: fare 17.8.2006, 22:09
Код

класс f находится в файле f.java
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;


public class f extends GameCanvas implements Runnable
{
private b menu;
private b kursor;
boolean z;
int index = 1;
private Display display;

public f() throws IOException
{
super(true);
setFullScreenMode(true);
Image s = Image.createImage("/menu.png");
menu = new b (s,176,208);
menu.setPosition(0,0);
Image o = Image.createImage("/kursor.png");
kursor = new b(o,23,23);
}


public void start()
{
z=true;
Thread t = new Thread(this);
t.start();
}


public void stop(){z = false;}


public void run()
{
Graphics g = getGraphics();
while(z)
{
inputKey();
index();
init(g);
try{Thread.sleep(50);}
catch(java.lang.InterruptedException zxz) {};
}
}


private void inputKey()
{
int keyStates = getKeyStates();
if((keyStates & UP_PRESSED) !=0) 
{
index-=1;
}
if((keyStates & DOWN_PRESSED) !=0) 
{
index+=1;
}
if((keyStates & FIRE_PRESSED) !=0)
{
switch(index)
{
case 1:
setCurrent( new a());


break;
default:
break;
}
}
}


public void index()
{
if(index>5){index=1;}
if(index<1){index=5;}
switch(index)
{
case 1:
kursor.setPosition(145,27);
break;
case 2:
kursor.setPosition(145,58);
break;
case 3:
kursor.setPosition(145,89);
break;
case 4:
kursor.setPosition(145,120);
break;
case 5:
kursor.setPosition(145,151);
break;
default:
break;
}
}


private void init(Graphics g)
{
g.setColor(17,13,193);
g.fillRect(0,0,getWidth(),getHeight());
menu.paint(g);
kursor.paint(g);
flushGraphics();
};
}


класс а находится в файле а.java
package a;
import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;


public class a extends GameCanvas implements Runnable
{
private TiledLayer fon;
private b sam;
private b oblako;
private LayerManager lm;
boolean z;
int p;
int g=1;
private b dot;
int k=30;
random Random;

public a() throws IOException
{
super(true);
setFullScreenMode(true);
fon=Fon();
Image s = Image.createImage("/sam.png");
sam = new b (s,31,31);
sam.setPosition(getWidth()/2,getHeight()/2);
sam.defineReferencePixel(11,11);
Image o = Image.createImage("/oblako.png");
oblako = new b(o,20,20);
oblako.defineReferencePixel(20,20);
oblako.setPosition(0,50);
Image d = Image.createImage("/dot.png");
dot = new b(d,5,5);

}


public TiledLayer Fon() throws IOException
{
Image f = Image.createImage("/fon.png");
fon = new TiledLayer(8,8,f,25,25);
int [] pole = 
{
6,6,6,6,6,6,6,6,
5,5,5,5,5,5,5,5,
4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,
7,11,10,9,8,12,10,8,
1,1,1,1,1,1,1,1,
};
for(int i = 0;i<pole.length;i++)
{
fon.setCell(i%8,i/8,pole[i]);
}
return fon;
}


public void start()
{
z=true;
Thread t= new Thread(this);
t.start();
}


public void stop(){z = false;}


public void run()
{
Graphics g = getGraphics();
while(z)
{
oblako();
inputKey();
init(g);
try{Thread.sleep(50);}
catch(java.lang.InterruptedException zxz) {};
}
}


private void inputKey()
{
int x=sam.getRefPixelX();
int y=sam.getRefPixelY();
int keyStates = getKeyStates();
if((keyStates & LEFT_PRESSED) !=0) {sam.nextFrame();}
if((keyStates & RIGHT_PRESSED) !=0) {sam.prevFrame();}
if((keyStates & FIRE_PRESSED) !=0) {dot.setPosition(x,y);}
}





public void sampolet()
{
int x=sam.getRefPixelX();
int y=sam.getRefPixelY();
Random = new random();
int fr;
int i;
if(x<15)
{
fr = Random.get(6,19);
sam.setFrame(fr);
}
if(x>161)
{
 i = Random.get(0,2);
switch(i)
{
case 0:
fr = Random.get(18,24);
sam.setFrame(fr);
break;
case 1:
fr = Random.get(0,7);
sam.setFrame(fr);
break;
default:
break;
}
}
if(y<15)
{
fr = Random.get(0,13);
sam.setFrame(fr);
}
if(y>193)
{
 i = Random.get(0,2);
 switch(i)
 {
 case 0:
 fr = Random.get(12,24);
 sam.setFrame(fr);
 break;
 default:
 break;
 }
 }
}

public void oblako()
{
oblako.move(1,0);
int x=oblako.getRefPixelX();
int y=oblako.getRefPixelY();
if(x>getWidth()+20)
{
oblako.setPosition(0,30);
}
}

private void init(Graphics g)
{
g.setColor(17,13,193);
g.fillRect(0,0,getWidth(),getHeight());
fon.paint(g);
dot.paint(g);
sam.paint(g);
oblako.paint(g);
flushGraphics();
};
}




Автор: 02077461 18.8.2006, 12:45
Во-первых, расскажи, когда выскакивает ошибка. При компиляции, или при работе?..
Во-вторых, убери throws IOException и оберни в try{}catch все Image.createImage("/sam.png");  в конструкторе класса a и приведи лог консоли, где пишеться про ошибку.

Автор: fare 20.8.2006, 10:26
Цитата(02077461 @  18.8.2006,  12:45 Найти цитируемый пост)
приведи лог консоли, где пишеться про ошибку.

C:\JAVA\WTK21\apps\Samolet\src\a.java:11: cannot resolve symbol

symbol  : class b 

location: class a.a

private b oblako;



И вот так с любым объектом любого класса.

Автор: redrick 22.8.2006, 12:22
как компилируешь ? какой коммандой ?

вот полезная весчь
http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/javac.html
Код

SEARCHING FOR TYPES

    When compiling a source file, the compiler often needs information about a type it does not yet recognize. The compiler needs type information for every class or interface used, extended, or implemented in the source file. This includes classes and interfaces not explicitly mentioned in the source file but which provide information through inheritance.

    For example, when you subclass java.applet.Applet, you are also using Applet's ancestor classes: java.awt.Panel, java.awt.Container, java.awt.Component, and java.awt.Object.

    When the compiler needs type information, it looks for a source file or class file which defines the type. The compiler searches first in the bootstrap and extension classes, then in the user class path. The user class path is defined by setting the CLASSPATH environment variable or by using the -classpath command line option. (For details, see Setting the Class Path). If you use the -sourcepath option, the compiler searches the indicated path for source files; otherwise the compiler searches the user class path both for class files and source files. You can specify different bootstrap or extension classes with the -bootclasspath and -extdirs options; see Cross-Compilation Options below.

    A successful type search may produce a class file, a source file, or both. Here is how javac handles each situation:

        * Search produces a class file but no source file: javac uses the class file.

        * Search produces a source file but no class file: javac compiles the source file and uses the resulting class file.

        * Search produces both a source file and a class file: javac determines whether the class file is out of date. If the class file is out of date, javac recompiles the source file and uses the updated class file. Otherwise, javac just uses the class file.

          javac considers a class file out of date only if it is older than the source file. 

    Note that javac can silently compile source files not mentioned on the command line. Use the -verbose option to trace automatic compilation. 

Автор: fare 27.8.2006, 22:55
Все исправил, все компилируется, запускается и при нажатии на кнопку при котором должен быть переход в другой класс пишет:
Uncaught exception java/lang/NullPointerException.
В чем теперь ошибка? smile 
Код остался почти без изменений.

Автор: javastic 28.8.2006, 08:29
Скорее всего ты обращаешься к методу объекта который не создан.

Автор: fare 29.8.2006, 21:28
Да я допустил глупую ошибку. 
Все исправил, теперь другая проблема. Не хочет работать хоть тресни  smile 
Код

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class MainGame extends MIDlet implements CommandListener
{
private Command exit = new Command("Выход", Command.EXIT, 0);
private Display display;
private Menu mr;
private Igra igra;
public MainGame() { }

public void startApp()
{
try
{
igra = new Igra();
mr = new Menu();
mr.start();
mr.setCommandListener(this);
display.getDisplay(this).setCurrent(mr);
}catch(java.io.IOException zxz) {}
}


public Display getDisplay()
{
return display;
}


protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {if(mr != null) mr.stop();}


public void MenuShow()
{
display.setCurrent(mr);
}


public void IgraShow()
{
display.setCurrent(igra);
}


public void commandAction(Command c, Displayable d)
{
if(c == exit)
{
destroyApp(false);
notifyDestroyed();
}
}}


Короче я пытаюсь обратится из другого класса в класс MainGame и вызвать метод IgraShow - для запуска игры. Но после запуска и нажатия на кнопку мне пишет:
Uncaught exception java/lang/SecurityException: Application not authorized to access the restricted API.
В чем теперь трабла? smile 

Автор: javastic 30.8.2006, 09:38
А меню отображается (mr) ?

Автор: fare 30.8.2006, 20:15
Да mr запускается и курсор работает так как надо! А при выборе новой игры выскакивает эта ошибка.

Автор: javastic 31.8.2006, 09:08
Тогда конструктор для класса Igra в студию, похоже там что-то не так.

Автор: fare 31.8.2006, 20:50
javastic, да понимаешь если не запускать mr, а сразу обратиться к классу Igra, то все работает, а вот именно если переходить из mr в Igra, то тогда и возникают проблемы. smile 


Код

import java.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;


public class a extends GameCanvas implements Runnable
{
private TiledLayer fon;
private b sam;
private b oblako;
private LayerManager lm;
boolean z;
int p;
int g=1;
private b dot;
int k=30;
random Random;

public a() throws IOException
{
super(true);
setFullScreenMode(true);
fon=Fon();
Image s = Image.createImage("/sam.png");
sam = new b (s,31,31);
sam.setPosition(getWidth()/2,getHeight()/2);
sam.defineReferencePixel(11,11);
Image o = Image.createImage("/oblako.png");
oblako = new b(o,20,20);
oblako.defineReferencePixel(20,20);
oblako.setPosition(0,50);
Image d = Image.createImage("/dot.png");
dot = new b(d,5,5);

}


public TiledLayer Fon() throws IOException
{
Image f = Image.createImage("/fon.png");
fon = new TiledLayer(8,8,f,25,25);
int [] pole = 
{
6,6,6,6,6,6,6,6,
5,5,5,5,5,5,5,5,
4,4,4,4,4,4,4,4,
3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,
7,11,10,9,8,12,10,8,
1,1,1,1,1,1,1,1,
};
for(int i = 0;i<pole.length;i++)
{
fon.setCell(i%8,i/8,pole[i]);
}
return fon;
}


public void start()
{
z=true;
Thread t= new Thread(this);
t.start();
}


public void stop(){z = false;}


public void run()
{
Graphics g = getGraphics();
while(z)
{
oblako();
inputKey();
init(g);
try{Thread.sleep(50);}
catch(java.lang.InterruptedException zxz) {};
}
}


private void inputKey()
{
int x=sam.getRefPixelX();
int y=sam.getRefPixelY();
int keyStates = getKeyStates();
if((keyStates & LEFT_PRESSED) !=0) {sam.nextFrame();}
if((keyStates & RIGHT_PRESSED) !=0) {sam.prevFrame();}
if((keyStates & FIRE_PRESSED) !=0) {dot.setPosition(x,y);}
}





public void sampolet()
{
int x=sam.getRefPixelX();
int y=sam.getRefPixelY();
Random = new random();
int fr;
int i;
if(x<15)
{
fr = Random.get(6,19);
sam.setFrame(fr);
}
if(x>161)
{
 i = Random.get(0,2);
switch(i)
{
case 0:
fr = Random.get(18,24);
sam.setFrame(fr);
break;
case 1:
fr = Random.get(0,7);
sam.setFrame(fr);
break;
default:
break;
}
}
if(y<15)
{
fr = Random.get(0,13);
sam.setFrame(fr);
}
if(y>193)
{
 i = Random.get(0,2);
 switch(i)
 {
 case 0:
 fr = Random.get(12,24);
 sam.setFrame(fr);
 break;
 default:
 break;
 }
 }
}

public void oblako()
{
oblako.move(1,0);
int x=oblako.getRefPixelX();
int y=oblako.getRefPixelY();
if(x>getWidth()+20)
{
oblako.setPosition(0,30);
}
}

private void init(Graphics g)
{
g.setColor(17,13,193);
g.fillRect(0,0,getWidth(),getHeight());
fon.paint(g);
dot.paint(g);
sam.paint(g);
oblako.paint(g);
flushGraphics();
};
}


класс а это и есть класс Igra просто я его переименовал.

Автор: javastic 1.9.2006, 09:02
Мнда... не понятно, что-то не то. smile

Автор: fare 4.9.2006, 21:20
Вопрос решен. Спасибо всем кто откликнулся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)