• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

State模式在J2ME游戏设计中的应用(需要源代码留下e-mail)

发布: 2007-7-01 18:47 | 作者: admin | 来源: | 查看: 14次 | 进入软件测试论坛讨论

领测软件测试网   
游戏设计中的状态转换是一个既是非常重要又十分复杂的部分。我前几天做移植的时候看到一个public void keyPressed(int keyCode)中间竟然有着近2000千行的代码,这样的话冗长的代码不仅不符合OO的思更加严重的是会打扰我们的程序思路。这两天运用State模式做了一个J2ME游戏中的状态转换由于只是一个实验的例子所以只做了开始菜单和帮助的转换,在这个框架下再加入其他的状态实际就是十分的简单的了。

现在DEMO中只有两个状态,两种状态下keyPressed和paint的功能是不同的,我们用状态模式来实现各种状态下的keyPressed和paint的功能功能。 

首先定义抽象状态State接口,这个接口指定了keyPressed和paint的行为 
public interface State { 
    public void onKeyPressed(int keyCode,StateManage _current); 

    public void paint(Graphics g); 
} 
State接口keyPressed和paint方法,我们实现两个子类HelpMenuState和MainMenuState,分别表示主菜单状态和HELP菜单的状态,并实现具体的onKeyPressed和paint方法: 
public class MainMenuState implements State { 
    /**省略变量的声明和初使化部分*/ 
    public void onKeyPressed(int keyCode, StateManage _current) { 
       switch (whichMenu) { 
       case 0: 
           mainMenuKeyPressed(keyCode,_current); 
           break; 
       case 1: 
           break; 
       } 
    } 

    private void mainMenuKeyPressed(int keyCode,StateManage _current) { 
       switch (keyCode) { 
       case 1: //KEY_UP = 1; 
           menuIndex = menuIndex <= 0 ? menuMain.length - 1 : --menuIndex; 
           break; 
       case 6://KEY_DOWN = 6; 
           menuIndex = menuIndex >= menuMain.length - 1 ? 0 : ++menuIndex; 
           break; 
       case 8://KEY_MIDDLE = 8; 
           if (menuIndex == 2) 
           _current.setState(new HelpMenuState()); 
           break; 
       } 
    } 

    public void paint(Graphics g) { 
       switch (whichMenu) { 
       case 0: 
           drawMainMenu(g); 
           break; 
       } 
    } 

    private void drawMainMenu(Graphics g) { 
       g.drawImage(imgMenu, 0, 0, 0); 
       g.setColor(0, 0, 0); 
       g.setFont(GameInfo.FONT_LARGE); 
       for (int i = 0; i < menuMain.length; i++) 
           g.drawString(menuMain[i], 120, 70 + i * 20, Graphics.TOP 
                  | Graphics.HCENTER); 
       g.drawImage(imgIndex, 60, 65 + 20 * menuIndex, 0); //画index图 
       g.setColor(255, 0, 0); 
       g.drawString(menuMain[menuIndex], 120, 70 + 20 * menuIndex, 
              Graphics.TOP | Graphics.HCENTER); 
    } 
} 

public class HelpMenuState implements State { 

    /**省略变量的声明和初使化部分*/ 
    public void onKeyPressed(int keyCode, StateManage _current) { 
       switch (whichMenu) { 
       case 0: 
           helpMenuKeyPressed(keyCode, _current); 
           break; 
       case 1: 
           break; 
       } 
    } 

    public void helpMenuKeyPressed(int keyCode, StateManage _current) { 
       switch (keyCode) { 
       case 1: //KEY_UP = 1; 
           menuIndex = menuIndex <= 0 ? helpMenuString.length - 1 
                  : --menuIndex; 
           break; 
       case 6://KEY_DOWN = 6; 
           menuIndex = menuIndex >= helpMenuString.length - 1 ? 0 
                  : ++menuIndex; 
           break; 
       case 8://KEY_MIDDLE = 8; 
           if (menuIndex == 4) { 
              _current.setState(new MainMenuState()); 
           } 
           break; 
       } 
    } 

    public void paint(Graphics g) { 
       drawHelp(g); 
    } 

    private void drawHelp(Graphics g) { 
       for (int i = 0; i <= 15; i++) { 
           for (int j = 0; j <= 10; j++) { 
              g.drawImage(img, 0 + 24 * i, 0 + 24 * j, 0); 
           } 
       } 
       g.setColor(251, 220, 48); 
       g.setFont(GameInfo.FONT_LARGE); 
       g.drawString("<< HELP >>", 120, 40, Graphics.TOP | Graphics.HCENTER); 

       for (int i = 0; i < helpMenuString.length; i++) 
           g.drawString(helpMenuString[i], 120, 80 + i * 25, Graphics.TOP 
                  | Graphics.HCENTER); 
       g.setColor(255, 0, 0); 
       g.drawString(helpMenuString[menuIndex], 120, 80 + 25 * menuIndex, 
              Graphics.TOP | Graphics.HCENTER); 
    } 
} 
最后,定义StateManage,StateManage的实例作为状态转换的控制器: 
public class StateManage { 
    State _current; 
    public StateManage(){ 
       _current = new MainMenuState(); //以主菜单开始 
    } 

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网