📄 rabbit_canvas.java
字号:
package ch08;
import java.util.Random;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class Rabbit_Canvas
extends GameCanvas
implements Runnable, CommandListener {
//代表程序是否运行的状态
boolean running;
//屏幕宽度
int win_width = getWidth();
//屏幕高度
int win_height = getHeight();
//存储构成兔子动画的各图像帧
Image rabbit_img;
//代表兔子动画的精灵对象
Sprite rabbit_sp;
//兔子动画播放序列
int fs[][] = {
{
0, 1, 2, 3}
, {
4, 5, 6, 7}
, {
8, 9, 10, 11}
, {
12, 13, 14, 15}
};
//每帧兔子图像的宽高
int img_rabbit_width = 36;
int img_rabbit_height = 50;
//代表兔子所处的方位,0、1、2、3分别代表上下左右方向。
int dir = 0;
//存储构成草地背景的各图像帧
Image grass_img;
//代表草地背景
TiledLayer tlg;
//每帧草图像的宽高
int img_grass_size = 16;
//存储构成爆炸的各图像帧
Image expl_img;
//代表爆炸动画的精灵对象
Sprite expl_sp;
//每帧爆炸图像的宽高
int img_expl_size = 32;
//存储子弹图像帧
Image bullet_img;
//代表子弹的精灵对象
Sprite bullet_sp[] = new Sprite[20];
//子弹图像的宽高
int img_bullet_size = 6;
//绘制上下文
Graphics g = getGraphics();
//主MIDlet类实例
Rabbit_MIDlet rm;
/*
3.构造器
*/
public Rabbit_Canvas(Rabbit_MIDlet rm) {
super(true);
this.rm = rm;
Command exitCommand = new Command("退出", Command.EXIT, 0);
addCommand(exitCommand);
setCommandListener(this);
try {
rabbit_img = Image.createImage("/icons/background/rabbit.png");
grass_img = Image.createImage("/icons/background/grass.png");
expl_img = Image.createImage("/icons/background/explosion.png");
bullet_img = Image.createImage("/icons/background/bullet.png");
}
catch (IOException e) {
System.out.println(e.getMessage());
}
// 计算横向需要多少图片
int backcols = win_width / img_grass_size + 1;
// 计算纵向需要多少图片
int backrows = win_height / img_grass_size + 1;
//铺草地
tlg = new TiledLayer(backcols, backrows, grass_img, img_grass_size,
img_grass_size);
Random r = new Random();
for (int i = 0; i < backcols * backrows; i++) {
int n = (r.nextInt() >>> 1) % 5 + 1;
tlg.setCell(i % backcols, i / backcols, n);
}
//初始化兔子
rabbit_sp = new Sprite(rabbit_img, img_rabbit_width, img_rabbit_height);
rabbit_sp.setFrameSequence(fs[2]);
rabbit_sp.setFrame(0);
rabbit_sp.setPosition( (win_width - img_rabbit_width) / 2,
(win_height - img_rabbit_height) / 2);
rabbit_sp.defineCollisionRectangle(0, 0, 36, 10);
//初始化爆炸
expl_sp = new Sprite(expl_img, img_expl_size, img_expl_size);
//初始化子弹
for (int i = 0; i < bullet_sp.length; i++) {
bullet_sp[i] = new Sprite(bullet_img, img_bullet_size, img_bullet_size);
bullet_sp[i].setPosition( (win_width - img_bullet_size) / 2,
(win_height - img_bullet_size) / 2);
}
start();
}
/*
4.启动线程
*/
public void start() {
running = true;
Thread t = new Thread(this);
t.start();
}
/*
5.控制进程
*/
public void run() {
long st = 0, et = 0, diff = 0;
//控制每秒帧数,即动画快慢
int rate = 150;
while (running) {
st = System.currentTimeMillis();
GameKeyInput();
render(g);
et = System.currentTimeMillis();
//避免刷新过快,暂停线程至要求帧数
diff = et - st;
if (diff < rate) {
try {
Thread.sleep(rate - diff);
}
catch (InterruptedException ex) {
stop();
}
}
}
}
/*
6.响应按键
*/
private void GameKeyInput() {
int KeyState = getKeyStates(); // 获得当前按键状态
//判断是否超出屏幕边界
if ( (KeyState & UP_PRESSED) != 0) { // 上
rabbit_sp.setFrameSequence(fs[0]);
if (rabbit_sp.getY() - 3 < 0) {
rabbit_sp.move(0, 0 - rabbit_sp.getY()); //出边界的处理
}
else {
rabbit_sp.move(0, -3); //正常处理
}
}
if ( (KeyState & DOWN_PRESSED) != 0) { // 下
rabbit_sp.setFrameSequence(fs[2]);
if (rabbit_sp.getY() + 3 + rabbit_sp.getHeight() > win_height) {
rabbit_sp.move(0, win_height - rabbit_sp.getY() - rabbit_sp.getHeight());
}
else {
rabbit_sp.move(0, 3);
}
}
if ( (KeyState & LEFT_PRESSED) != 0) { // 左
rabbit_sp.setFrameSequence(fs[1]);
if (rabbit_sp.getX() - 3 < 0) {
rabbit_sp.move(0 - rabbit_sp.getX(), 0);
}
else {
rabbit_sp.move( -3, 0);
}
}
if ( (KeyState & RIGHT_PRESSED) != 0) { // 右
rabbit_sp.setFrameSequence(fs[3]);
if (rabbit_sp.getX() + 3 + rabbit_sp.getWidth() > win_width) {
rabbit_sp.move(win_width - rabbit_sp.getX() - rabbit_sp.getWidth(), 0);
}
else {
rabbit_sp.move(3, 0);
}
}
}
/*
7.实现绘制
*/
private void render(Graphics g) {
//绘制背景
g.setColor(0x000000);
g.fillRect(0, 0, win_width, win_height);
tlg.paint(g);
//处理碰撞
for (int i = 0; i < bullet_sp.length; i++) {
if (rabbit_sp.collidesWith(bullet_sp[i], true)) {
expl_sp.setPosition(rabbit_sp.getX() -
(img_expl_size - img_rabbit_width) / 2,
rabbit_sp.getY() -
(img_expl_size - img_rabbit_height) / 2);
expl_sp.nextFrame();
expl_sp.paint(g);
}
else {
rabbit_sp.nextFrame();
rabbit_sp.paint(g);
}
}
//绘制子弹
Random r = new Random();
for (int i = 0; i < bullet_sp.length; i++) {
int n = (r.nextInt() >>> 1) % 4;
switch (n) {
case 0:
bullet_sp[i].move( -10, 0);
break;
case 1:
bullet_sp[i].move(10, 0);
break;
case 2:
bullet_sp[i].move(0, -10);
break;
case 3:
bullet_sp[i].move(0, 10);
break;
}
bullet_sp[i].paint(g);
}
flushGraphics();
}
/*
8.结束线程
*/
public void stop() {
running = false;
}
/*
9.响应按钮事件
*/
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
rm.quitApp();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -