【Java开源代码栏目提醒】:以下是网学会员为您推荐的Java开源代码-Cloud_Canvas.java,希望本篇文章对您学习有所帮助。
package ch08;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class Cloud_Canvas
extends GameCanvas
implements Runnable, CommandListener {
//代表程序是否运行的状态
boolean running;
//代表是否碰撞的状态
boolean ishit;
//屏幕宽度
int win_width = getWidth();
//屏幕高度
int win_height = getHeight();
//存储构成飞机动画的各图像帧
Image plane_img;
//代表飞机动画的精灵对象
Sprite plane_sp;
//飞机每帧图像的宽度
int img_plane_size = 24;
//存储构成炸弹动画的各图像帧
Image bomb_img;
//代表炸弹动画的精灵对象
Sprite bomb_sp;
//炸弹每帧图像的宽度
int img_bomb_size = 65;
//存储云的图像对象
Image cloud_img;
//存储背景的图像对象
Image back_img;
//主MIDlet类实例
Cloud_MIDlet cm;
/*
3.构造器
*/
public Cloud_Canvas(Cloud_MIDlet cm) {
super(true);
this.cm = cm;
Command exitCommand = new Command("退出", Command.EXIT, 0);
addCommand(exitCommand);
setCommandListener(this);
try {
plane_img = Image.createImage("/icons/background/plane.png");
bomb_img = Image.createImage("/icons/background/bomb.png");
cloud_img = Image.createImage("/icons/background/cloud.png");
back_img = Image.createImage("/icons/background/cloudbackground.png");
}
catch (IOException e) {
System.out.println(e.getMessage());
}
plane_sp = new Sprite(plane_img, img_plane_size, img_plane_size);
plane_sp.setFrame(0);
int x = (win_width - img_plane_size) / 2;
int y = (win_height - img_plane_size) / 2;
plane_sp.setPosition(x, y);
bomb_sp = new Sprite(bomb_img, img_bomb_size, img_bomb_size);
bomb_sp.setFrame(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 = 50;
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() {
//保证左右移动停止后,恢复正向图像帧
plane_sp.setFrame(0);
int KeyState = getKeyStates(); // 获得当前按键状态
// 根据按键状态,飞机图象做相对移动,并判断是否超出屏幕边界
if ( (KeyState & UP_PRESSED) != 0) { // 上
if (plane_sp.getY() - 3 < 0) {
plane_sp.move(0, 0 - plane_sp.getY()); //出边界的处理
}
else {
plane_sp.move(0, -3); //正常处理
}
plane_sp.setFrame(0);
}
if ( (KeyState & DOWN_PRESSED) != 0) { // 下
if (plane_sp.getY() + 3 + plane_sp.getHeight() > win_height) {
plane_sp.move(0, win_height - plane_sp.getY() - plane_sp.getHeight());
}
else {
plane_sp.move(0, 3);
}
plane_sp.setFrame(0);
}
if ( (KeyState & LEFT_PRESSED) != 0) { // 左
if (plane_sp.getX() - 3 < 0) {
plane_sp.move(0 - plane_sp.getX(), 0);
}
else {
plane_sp.move( -3, 0);
}
plane_sp.setFrame(1);
}
if ( (KeyState & RIGHT_PRESSED) != 0) { // 右
if (plane_sp.getX() + 3 + plane_sp.getWidth() > win_width) {
plane_sp.move(win_width - plane_sp.getX() - plane_sp.getWidth(), 0);
}
else {
plane_sp.move(3, 0);
}
plane_sp.setFrame(2);
}
}
/*
7.实现绘制
*/
private void render(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0, 0, win_width, win_height);
g.drawImage(back_img, 0, 0, 0);
g.drawImage(cloud_img, 20, 20, 0);
g.drawImage(cloud_img, 90, 50, 0);
g.drawImage(cloud_img, 30, 120, 0);
g.drawImage(cloud_img, 120, 110, 0);
//处理碰撞
ishit = plane_sp.collidesWith(cloud_img, 20, 20, true) ||
plane_sp.collidesWith(cloud_img, 90, 50, true) ||
plane_sp.collidesWith(cloud_img, 30, 120, true) ||
plane_sp.collidesWith(cloud_img, 120, 110, true);
if (ishit) {
bomb_sp.setPosition(plane_sp.getX() -
(img_bomb_size - img_plane_size) / 2,
plane_sp.getY() -
(img_bomb_size - img_plane_size) / 2);
bomb_sp.nextFrame();
bomb_sp.paint(g);
}
else {
plane_sp.paint(g);
}
flushGraphics();
}
/*
8.结束线程
*/
public void stop() {
running = false;
}
/*
9.响应按钮事件
*/
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
cm.quitApp();
}
}
}
上一篇:
CloudscapeIDGenerator.java
下一篇:
致年轻的你