首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

头大了,求教关于showNotify() 和 hideNotify()的有关问题

2012-01-23 
头大了,求教关于showNotify() 和 hideNotify()的问题我现在要做的是一个过场动画。要把主画面切换掉,换成一

头大了,求教关于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下

热点排行