头大了,求教关于showNotify() 和 hideNotify()的问题
我现在要做的是一个过场动画。要把主画面切换掉,换成一个显示信息的页面,然后再调回来,但是现在调回来得时候失效了,paint() 没有执行了
…………
上面一堆初始化的东西,然后调用游戏的主循环
当满足条件进入下一关的时候切换游戏画面,问题就是出现在画面调回来得时候 gameState=GAME_SUSPEND;
public synchronized void run() {
while(threadAlive){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(gameState == GAME_RUN){
input();
if(TICK_COUNT%((5-SPEED)*2)==0)
{
snaketick();
}
tick();
TICK_COUNT ++;
if(score> =PLAYER_LEVEL*1)
{
gameState=GAME_SUSPEND;
}
}
paint(graphics);
}
}
…………
这里是 paint()的方法 我以前用同样的方法做过2D游戏的切换,没有问题,我这边渲染的是world,不知道有没有什么不同,不过我想因该不是这个问题,gameState=GAME_SUSPEND 以后 在paint()里面会把 gameState 变成 GAME_INIT,这样他在调回来的时候会重新初始化一些参数,没有重新加栽地图(不过我也重新加栽地图过,也一样无效)
public synchronized void paint(Graphics g)
{
if(gameState == GAME_INIT){
if(!COMMAND_ADD_FLAG){
//添加响应命令及监听器
this.addCommand(pauseCommand);
this.addCommand(exitCommand);
this.setCommandListener(this);
COMMAND_ADD_FLAG = true;
}
……
gameState = GAME_RUN;
}else if(gameState == GAME_RUN){
if(rt.freeMemory() < (rt.totalMemory() * 4 / 5)){
rt.gc();
}
}else if(gameState == GAME_SUSPEND){
rt.gc();
if(PLAYER_LEVEL > = 4){
gameState = GAME_OVER;
}else{
PLAYER_LEVEL ++;
controller.EventHandler(Controller.EVENT_NEXTROUND);
gameState = GAME_INIT;
this.unActive();
}
}else if(gameState == GAME_OVER){
……
}
draw3D(g);
draw2D(g);
flushGraphics();
}
public void draw3D(Graphics g){
try{
graphics3D.bindTarget(g);
graphics3D.render(world);
}
catch(Exception e)
{System.out.println( "bindTarget error ");}
finally
{graphics3D.releaseTarget(); }
}
private void draw2D(Graphics g) {
graphics.setFont(Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.setColor(255,0,0);
g.drawString( "Score : "+score, mainWidth/2 ,30,Graphics.BASELINE | Graphics.HCENTER);
}
//隐藏和激活
在showNotify()的后面加上过paint() 也依然没有画面
public void active(){
this.showNotify();
}
public void unActive(){
this.hideNotify();
}
下面是Controller类的内容
……
case EVENT_NEXTROUND:{
//开启一个新的线程,显示下一轮字样
//原先画布线程则更换地图信息
Thread t = new Thread(){
public void run(){
StringBuffer sbf = new StringBuffer( "Round " + (SnakeCanvas.PLAYER_LEVEL));
//显示信息的内容
display.setCurrent(new InfoCanvas(sbf){});
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// snakeCanvas是我的主游戏画面,这里调用snakeCanvas.active();后游戏就失效了
display.setCurrent(snakeCanvas);
snakeCanvas.active();
}
};
t.start();
break;
}
每次调用snakeCanvas.active(); 后,程序确定会调用到active()里面的内容,但是调用以后我发现paint()就不执行了 threadAlive确定是true
如果我不调用那个显示信息的页面,直接调用 snakeCanvas.unActive(); 然后在EVENT_NEXTROUND 调用snakeCanvas.active(); 就是没有切换画面,隐藏显示,一切都是正常的。
我调用信息画面后snakeCanvas.active(); 要重新调游戏主画面,gameState=GAME_INIT里面有添加 command 的操作,可以看到添加的command,但上面的画面还是过场的信息
而且我这个时候添加在while(threadAlive){ …… System.out.println( "IsRunning ");} print也停掉了(即使我调用snakeCanvas.unActive();的时候他都在print,但就是调用snakeCanvas.active(); 的时候停了)
画面就停留在上面过场信息,下面几个已经添加的command
主要的内容就是这些了,我有哪里说的不清楚地都可以问我,我现在头大..
[解决办法]
能不能注释再详细点 文章长了 看起来理解度下降
[解决办法]
还好我用2。0
UP下