⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 通过游戏代码学j2me(六).txt

📁 j2me游戏制作学习 资料
💻 TXT
字号:
通过游戏代码学J2ME(六)
游戏的主要控制类: cortrol.java


package npc7776;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
/***************************************
*类功能介绍:游戏的主要控制程序
***************************************/

public class cortrol
    extends GameCanvas
    implements CommandListener, Runnable {
  Image imgs;                 //图片
  Graphics g;                 //画布   
  Plane plane;                //飞机  
  backdrop back;              //背景
  bullet bullet;              //子弹
  Thread thread = null;        //线程
  planemain mainScreen;       //主屏幕 

  public cortrol(planemain mainScreen) {
    super(true);
    this.mainScreen= mainScreen;
    g = this.getGraphics();
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    plane = new Plane(imgs, 24, 24, this.getWidth(), this.getHeight());
    bullet = new bullet();
    back = new backdrop(this.getWidth(),this.getHeight());

    thread = new Thread(this);
    thread.start();
  }

  private void jbInit() throws Exception {
    imgs = Image.createImage("/res/planes.png");

    setCommandListener(this);

    addCommand(new Command("Exit", Command.EXIT, 1));
  }
// 命令
  public void commandAction(Command command, Displayable displayable) {

    if (command.getCommandType() == Command.EXIT) {

      mainScreen.goBack();
    }
  }
//按键控制
  public void keyInput() {
      plane.hf();
    if ( (this.getKeyStates() & this.LEFT_PRESSED) != 0) {
      plane.moveLeft();
    }
    if ( (this.getKeyStates() & this.RIGHT_PRESSED) != 0) {
      plane.moveRight();
    }
    if ( (this.getKeyStates() & this.UP_PRESSED) != 0) {
      plane.moveUp();
    }
    if ( (this.getKeyStates() & this.DOWN_PRESSED) != 0) {
      plane.moveDown();
    }
    if ( (this.getKeyStates() & this.FIRE_PRESSED) != 0) {
      bullet.addBullet(plane.x, plane.y, 24);
    }
  }
  public void stop(){
    thread = null;
  }
// 清屏
  public void clear() {
    g.setColor(255,255,255);
    g.fillRect(0, 0, this.getWidth(), this.getHeight());
  }

  public void run() {
    while (true) {
      clear();

      keyInput();
      back.dramSlef(g);
      plane.drawSelf(g);
      bullet.drawSelf(g);
      bullet.move();

      this.flushGraphics();
      try {
        thread.sleep(100);
      }
      catch (Exception e) {}

    }
  }

}


结合以前写的这里大部分都可以看懂,主要来讲下线程和按键。

在 JAVA中,线程主用于实现一些并发任务,如果要定义一个作为线程运行的类,就必
须实现Runnable接口,重载void run()方法,并在run方法内实现线程的运算,然后创
建一个线程Thread 对象,并启动线程.J2ME的线程Thread类是JDK线程类的一个精简
版本, 定义了线程控制方法,用于实现对线程的控制.上面例子中 
thread = new Thread(this) 是给cortrol对象创建一个线程Thread对象,
thread.start()            就是启动线程 
thread.sleep(100)         这是在run()里的线程休眠,括号内的100 为参数,表示
                          的休眠时间, 以毫秒计算,当线程强行中断的时候会抛
     出异常.


设备上的按键在逻辑上被分为俩类:标准按键keyCode 和游戏按键gameAction,这些键
值都作为Canvas的静态常量进行定义.这里介绍下游戏按键.

游戏按键由以下值组成:

UP  DOWN LEFT RIGHT : 方向按键.

FIRE GAME_A GAME_B GAME_C GAME_D : 开火键和4个游戏按键.

标准按键是物理上的定义,因为标准按键在不同的设备上都是固定的.而游戏按键是逻辑
上的定义,由设备自行定义.比如:某些手机的数字5,0,7,9会被映射到4个方向,对于某些
有方向键盘的设备,其中方向键盘就是会被映射到4个方向.上面这些是Canvas,下面介绍
在MIDP v2.0里的GameCanvas中定义的处理键盘事件,在GameCanvas中定义了静态常量表
示每个键是否被按下,具有下面这些值:

UP_PRESSED DOWN_PRESSED LEFT_PRESSED RIGHT_PRESSED:上,下,左,右键

GAME_A_PRESSED GAME_B_PRESSED GAME_C_PRESSED GAME_D_PRESSED:A,B,C,D游戏键

如果要检查特定的按键是否被按下,就需要检查将getKeyStates()返回的值与这些键值进
行按位与(&)并根据计算结果来判断.注意:为了程序能在不同的设备上运行,就一定要考虑
不同设备间键盘布局的特点,在开发程序的时不要假设按键的布局方式.

简单的游戏就这样做出来了,效果是在一个背景图上有一个可以控制的飞机,可以打子弹,虽
然内容简单,但是从中可以学到很多J2ME的知识,有什么不对和不足的地方请大家给予帮助.
整理一下发一篇完整的上来.

还有一点: import 那里最好是把能用上的类插入,不要用*来代替.今天运行了一下,700多个
class...... 汗,应该优化程序.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -