首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
 您现在的位置: 中国IT实验室 >> 游戏开发 >> 游戏开发文档 >> 正文
State模式在J2ME游戏设计中的应用
来源:ChinaItLab 作者: 时间:2005-4-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(); //以主菜单开始
  
    }
  
  
【责编:admin】

中国IT教育热线咨询

相关文章
dx8中关于用索引缓冲渲染索引图元
作为一个状态机的OpenGL
OGRE中的四元数与旋转
[RGSS]Sprite类方法教学
[RGSS]去掉“战斗|逃跑”选项
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
 基础入门  开发文档
 最新推荐
  多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它......
游戏引擎演化史
在Windows上安装OGRE的方法
关于滤镜遮罩概念,Sobel 遮罩
游戏开发新手入门之Windows编程
游戏开发新手入门之位图化图形
教你实现卡通渲染的另类勾边方法
游戏设计大师谈如何成为一名游戏设
Visual C#编写 3D游戏框架示例
真正的 Java 学习从入门到精通
游戏开发经验——游戏开发的基本常
  为什么要研究攻击行为在人类有记载的5600年的历史中,共计发生了14,400次战争;今天,平均一天要发生............
游戏开发中显示对话的特殊句法
游戏原型设计的介绍
网络游戏中的攻击行为
谈动作类游戏的必要条件
规则的多元分析模式
载入位图文件到DirectDraw
Archer Game Suite 是什么?
浅谈游戏企划-新手入门篇
暴雪称霸游戏业界的六大秘密绝招
骨骼动画及示例Skinned Mesh的解析
  培训中心