正文

[转]6 GAME API 32006-08-07 09:30:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/17355.html

分享到:

 /**

    *  画布重画事件,替代Canvas中的paint()事件, 根据不同的游戏状态(gameState)画出游戏画面

    *  本方法由thread每次重新启动, 最后执行flushGraphics()重画缓冲区

    */

   public synchronized void paintCanvas(Graphics g){

      

       if(gameState == GAME_INIT){

           //游戏第一次启动

           //设置为全屏模式并清屏

           this.setFullScreenMode(true);

          

           g.setColor(255, 255, 255);

           g.fillRect(0, 0, mainWidth, mainHeight);

          

           if(!COMMAND_ADD_FLAG){

               //添加响应命令及监听器

               this.addCommand(pauseCommand);

               this.addCommand(exitCommand);

               this.setCommandListener(this);

               COMMAND_ADD_FLAG = true;

           }

          

           if(fishCollectionVector != null){

               fishCollectionVector = null;

               fishCollectionVector = new Vector();

           }

          

           if(this.layerManager != null){

               this.layerManager = null;

               this.layerManager = new LayerManager();

 

               if(userViewWindow){

                   this.layerManager.setViewWindow(xViewWindow, yViewWindow, wViewWindow, hViewWindow);

               }

           }

          

           if(mySub != null){

               mySub = null;

               mySub = new Sub(this, SubMIDlet.createImage("/res/sub.png"), getWidth() / 3, getHeight() / 3, layerManager);

              

           }

          

           //创建背景图层

           this.createSandBackground();

           this.createSunkenBoat();

          

           this.createFishCollection(0, FishCollection.NUM_FISH_TYPES);

           this.createMysub();

           this.createSeaBackground();

 

          

           mySub.setPosition(getWidth() / 3, getHeight() / 3);

           gameState = GAME_RUN;

          

       }else if(gameState == GAME_RUN){

           //游戏处于运行状态

           //提供游戏运行标识Flag,保证对用户操作的响应和"敌人"的运行动作只有在运行的时候生效

           //在性能过耗(可用内存不到当前内存总量的4/5时),进行垃圾回收GC

          

           if(rt.freeMemory() < (rt.totalMemory() * 4 / 5)){

               rt.gc();

           }

          

          

       }else if(gameState == GAME_SUSPEND){

           //下一轮游戏

          

           //更新数据

           mySub.setHpLife(15);

           mySub.setPosition(mainWidth / 3, mainHeight / 3);

           if(PLAYER_LEVEL >= 4){

               gameState = GAME_OVER;

           }else{

               PLAYER_LEVEL ++;

               controller.EventHandler(Controller.EVENT_NEXTROUND);

              

               //目前游戏只设计了四级关卡

               ENEMY_MAX       = PLAYER_LEVEL * 10; 

               ENEMY_CURRENT   = 0;

               TRIGGER_COUNT   = 0;

               TICK_COUNT      = 0;

               ENEMY_CURRENT_LIMIT = PLAYER_LEVEL * 2;

              

               Layer layer = null;

               //暂时删除layerManager中所有文件,清空鱼雷与敌人潜艇数据

               //为更新图层做准备

               this.tinfishCollectionVector.removeAllElements();

               this.enemyCollectionVector.removeAllElements();

               this.fishCollectionVector.removeAllElements();

              

              

//             for(int i = 0; i < layerManager.getSize(); i++){

//                 layer = layerManager.getLayerAt(i);

//                 layerManager.remove(layer);

//             }

              

              

               layer = null;

              

               //更新海底图层数据

               this.SEABACK_DENSITY = (SEABACK_DENSITY + 1) % 4;

               gameState = GAME_INIT;

               this.unActive();

              

           }

 

       }else if(gameState == GAME_OVER){

           //游戏结束

           threadAlive = false;

           controller.EventHandler(Controller.EVENT_MENU_GAMEOVER);

           gameState = this.GAME_INIT;

          

       }

      

       //在缓冲区重画

       this.layerManager.paint(g, 0, (getHeight() - WORLD_HEIGHT) / 2);

       this.flushGraphics();

   }

 

  

   public void commandAction(Command command, Displayable display) {

       if(command == startCommand){

          

           if(this.gameState == GAME_OVER){

               gameState = GAME_INIT;

           }else{

               gameState = GAME_RUN;

           }

          

           this.removeCommand(this.startCommand);

           this.addCommand(pauseCommand);

          

       }else if(command == pauseCommand){

           gameState = GAME_PAUSE;

          

           this.removeCommand(this.pauseCommand);

           this.addCommand(startCommand);

          

       }else if(command == exitCommand){

           gameState = GAME_OVER;

          

       }

   }

  

   /**

    * 创建海底沙地背景图层

    */

   protected void createSandBackground(){

       Image bottomTitles = SubMIDlet.createImage("/res/bottom.png");

      

       //将图片bottomTitles切成指定大小(TILE_WIDTH, TILE_HEIGHT)

       //创建一个指定维数(1, WIDTH_IN_TILES)的背景数组

       TiledLayer layer   = new TiledLayer(WIDTH_IN_TILES, 1,

               bottomTitles, TILE_WIDTH, TILE_HEIGHT);

      

       for(int column = 0; column < WIDTH_IN_TILES; column++){

           //将海底图层数组中的每个小格用原始图片的第i块来填充

           int i = SubMIDlet.createRandom(NUM_DENSITY_LAYER_TILES) + 1;

           layer.setCell(column, 0, i);

       }

       layer.setPosition(0, WORLD_HEIGHT - bottomTitles.getHeight());

       layerManager.append(layer);

      

       bottomTitles = null;

   }

  

  

   /**

    * 创建海底水层背景图片

    */

   protected void createSeaBackground(){

      

       if(this.SEABACK_DENSITY >= 4){

           SEABACK_DENSITY = 0;

       }

      

       Image image = SubMIDlet.createImage("/res/densityLayer" + this.SEABACK_DENSITY + ".png");

      

       layerSeaback = new TiledLayer(WIDTH_IN_TILES, HEIGHT_IN_TILES,

               image, TILE_WIDTH, TILE_HEIGHT);

      

       for(int row = 0; row < HEIGHT_IN_TILES; row++){

           for(int column = 0; column < WIDTH_IN_TILES; column++){

               layerSeaback.setCell(column, row, SubMIDlet.createRandom(NUM_DENSITY_LAYER_TILES) + 1);

           }

       }

       layerSeaback.setPosition(0, 0);

       layerManager.append(layerSeaback);

      

       image = null;

   }

 

   /**

    * 创建沉船图层

    */

   protected void createSunkenBoat(){

       Image imageSunkenBoat = SubMIDlet.createImage("/res/sunkenBoat.png");

       //出现的沉船数量

       int numSunkenBoats = 1 + (WORLD_WIDTH / (3 * imageSunkenBoat.getWidth()));

      

       Sprite sunkenBoat;

       int bx = 0;

       for(int i = 0; i < numSunkenBoats; i++){

           sunkenBoat = new Sprite(imageSunkenBoat, imageSunkenBoat.getWidth(), imageSunkenBoat.getHeight());

           sunkenBoat.setTransform(this.rotations[SubMIDlet.createRandom(this.rotations.length)]);

          

           //随机定义沉船位置

           bx = (WORLD_WIDTH - imageSunkenBoat.getWidth()) / numSunkenBoats;

          

           bx = (i * bx) + SubMIDlet.createRandom(bx);

          

           sunkenBoat.setPosition(bx, WORLD_HEIGHT - imageSunkenBoat.getHeight());

          

           //添加图层

           this.layerManager.append(sunkenBoat);

           //mySub.addCollideable(sunkenBoat);

       }

       imageSunkenBoat = null;

   }

 

   /**

    * 创建玩家潜艇

    */

   protected void createMysub(){

       this.layerManager.append(mySub);

   }

  

  

   /**创建鱼群背景

    * @param startId

    * @param endId

    */

   protected void createFishCollection(int startId, int endId){

       for(int id = startId; id < endId; id++){

           int w  = WORLD_WIDTH / 4;

           int h  = WORLD_HEIGHT / 4;

           int x  = SubMIDlet.createRandom(WORLD_WIDTH - w);

           int y  = SubMIDlet.createRandom(WORLD_HEIGHT - h);

           int vx = FishCollection.randomVelocity(TILE_WIDTH / 4);

           int vy = FishCollection.randomVelocity(TILE_HEIGHT / 4);

          

           //初始化鱼类图层, 同时把图层添加到图层管理器上

           FishCollection fishCollection = new FishCollection(layerManager, id, x, y, w, h,

                   vx, vy, 0, 0, WORLD_WIDTH, WORLD_HEIGHT);

          

           this.fishCollectionVector.addElement(fishCollection);

       }

   }

  

   /**重新设置图层显示区域

    * @param x          玩家潜艇位置x

    * @param y          玩家潜艇位置y

    * @param width      玩家潜艇宽

    * @param height     玩家潜艇高

    */

   public void adjustViewWindow(int xSub, int ySub, int width, int height) {

       if (this.userViewWindow)

        {

            xViewWindow = xSub + (width / 2) - (wViewWindow / 2);

            if (xViewWindow < 0)

            {

                xViewWindow = 0;

            }

            if (xViewWindow > (WORLD_WIDTH - wViewWindow))

            {

                xViewWindow = WORLD_WIDTH - wViewWindow;

            }

 

            yViewWindow = ySub + (height / 2) - (hViewWindow / 2);

            if (yViewWindow < 0)

            {

                yViewWindow = 0;

            }

            if (yViewWindow > (WORLD_HEIGHT - hViewWindow))

            {

                yViewWindow = WORLD_HEIGHT - hViewWindow;

            }

 

            layerManager.setViewWindow(xViewWindow,

                                       yViewWindow,

                                       wViewWindow,

                                       hViewWindow);

        }

   }

  

    /** 获取玩家潜艇

     * @return 返回 mySub

     */

    public Sub getMySub() {

        return mySub;

    }

    /**

     * @return 返回 threadAlive

     */

    public boolean isThreadAlive() {

        return threadAlive;

    }

    /**

     * @param threadAlive 要设置的 threadAlive

     */

    public void setThreadAlive(boolean threadAlive) {

        this.threadAlive = threadAlive;

    }

   

    public void active(){

        this.showNotify();

    }

   

    public void unActive(){

        this.hideNotify();

    }

}

 

6.6    小结

MIDP 2.0添加的游戏API大大简化了MIDP游戏的开发,使得开发者能够更关注游戏的逻辑和底层架构,同时还提高了游戏性能。遗憾的是,目前支持MIDP 2.0的手机还不多,使用MIDP 2.0 Game API编写的游戏无法在MIDP 1.0平台上运行。

 

本章节关注了基本的GAME API的使用,作为一名游戏开发人员熟练掌握这些系统提供的API是一个基本功,但仅仅有这些是不够的。游戏开发中还有很多话题,大大超出了基本API的使用。读者们应该大量的阅读和实践才能一窥游戏开发的全貌。如果需要更多的资料请参阅www.j2medev.com文章区之游戏开发专题的文章,会给你更大的收获。

阅读(2508) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册