📄 通过游戏代码学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 + -