📄 fight_canvas.java
字号:
package ch08;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class Fight_Canvas
extends GameCanvas
implements Runnable, CommandListener {
//代表程序是否运行的状态
boolean running;
//存储构成动画的各图像帧
Image img0, img1;
//代表动画的精灵对象
Sprite sp0, sp1;
//动画播放序列
int s0[] = {
0, 1};
int s1[] = {
0, 1};
//屏幕宽度
int win_width = getWidth();
//屏幕高度
int win_height = getHeight();
//每帧图像的宽度
int img_width0 = 115;
int img_width1 = 122;
//每帧图像的高度
int img_height0 = 85;
int img_height1 = 85;
//图像X坐标
int x0, x1;
//图像Y坐标
int y0, y1;
//打中标志
boolean hit;
//是否采用象素级判断
boolean pixelLevel = true;
//主MIDlet类实例
Fight_MIDlet fm;
/*
3.构造器
*/
public Fight_Canvas(Fight_MIDlet fm) {
super(true);
this.fm = fm;
Command exitCommand = new Command("退出", Command.EXIT, 0);
addCommand(exitCommand);
setCommandListener(this);
try {
img0 = Image.createImage("/icons/background/man0.png");
img1 = Image.createImage("/icons/background/man1.png");
}
catch (IOException e) {
System.out.println(e.getMessage());
}
sp0 = new Sprite(img0, img_width0, img_height0);
sp0.setFrameSequence(s0);
sp0.defineReferencePixel(img_width0 / 2, 0);
x0 = img_width0 / 2;
y0 = (win_height - img_height0) / 2;
sp0.setRefPixelPosition(x0, y0);
sp0.move( -20, 0);
sp1 = new Sprite(img1, img_width1, img_height1);
sp1.setFrameSequence(s1);
sp1.defineReferencePixel(img_width1 / 2, 0);
x1 = win_width - img_width1 / 2;
y1 = (win_height - img_height1) / 2;
sp1.setRefPixelPosition(x1, y1);
sp1.move(20, 0);
start();
}
/*
4.启动线程
*/
public void start() {
running = true;
Thread t = new Thread(this);
t.start();
}
/*
5.控制进程
*/
public void run() {
Graphics g = getGraphics();
long st = 0, et = 0, diff = 0;
//控制每秒帧数,即动画快慢
int rate = 120;
while (running) {
st = System.currentTimeMillis();
render(g);
GameKeyInput();
et = System.currentTimeMillis();
//避免刷新过快,暂停线程至要求帧数
diff = et - st;
if (diff < rate) {
try {
Thread.sleep(rate - diff);
}
catch (InterruptedException ex) {
stop();
}
}
}
}
/*
6.实现绘制
*/
private void render(Graphics g) {
g.setColor(0x000000);
g.fillRect(0, 0, win_width, win_height);
sp0.nextFrame();
if (!hit) {
sp1.nextFrame();
}
sp1.paint(g);
sp0.paint(g);
flushGraphics();
}
/*
7.响应按键
*/
private void GameKeyInput() {
int KeyState = getKeyStates();
if ( (KeyState & LEFT_PRESSED) != 0) {
//恢复行走序列
sp0.setFrameSequence(null);
int temp[] = {
0, 1};
s0 = temp;
sp0.setFrameSequence(s0);
//翻转图像
sp0.setTransform(Sprite.TRANS_MIRROR);
//处理超出屏幕左边界
if (sp0.getRefPixelX() - sp0.getWidth() / 2 < 0) {
sp0.move(0 - sp0.getX() - 20, 0);
}
else {
sp0.move( -5, 0);
}
}
if ( (KeyState & RIGHT_PRESSED) != 0) {
//恢复行走序列
sp0.setFrameSequence(null);
int temp[] = {
0, 1};
s0 = temp;
sp0.setFrameSequence(s0);
//恢复翻转图像
sp0.setTransform(Sprite.TRANS_NONE);
//处理超出屏幕右边界
if (sp0.getRefPixelX() + sp0.getWidth() / 2 - 20 > win_width) {
sp0.move( -0, 0);
}
else {
sp0.move(5, 0);
}
}
if ( (KeyState & FIRE_PRESSED) != 0) {
//设置打拳序列
sp0.setFrameSequence(null);
int temp[] = {
2, 3, 4};
s0 = temp;
sp0.setFrameSequence(s0);
//检测是否打到士兵
if (sp0.collidesWith(sp1, pixelLevel)) {
hit = true;
sp1.setFrameSequence(null);
sp1.setFrame(5);
}
}
if ( (KeyState & DOWN_PRESSED) != 0) {
if (pixelLevel) {
pixelLevel = false;
}
else {
pixelLevel = true;
}
}
}
/*
8.结束线程
*/
public void stop() {
running = false;
}
/*
9.响应按钮事件
*/
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
fm.destroyApp(true);
fm.notifyDestroyed();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -