📄 mangamecanvas.java
字号:
package man;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.rms.RecordStore;
/**
*主类
*/
public class ManGameCanvas
extends GameCanvas implements Runnable, CommandListener {
//--- 定义变量 ----------------------------------------------------------------
private ManMIDlet manMIDlet; // 应用类对象
private Command Cmdstart, Cmdrestart, Hsreset; // 开始、重新开始按键
private int SWidth, SHeight; // 屏幕宽度和高度
private int KeyState; // 当前按键状态
private Graphics ManGraphics; // 定义屏幕的画布
private TiledLayer TLBackground; // 平铺层对象
private Sprite SpPlane; // 飞机图象
private ManBullets MBbullets; // 子弹图象
private NumImgTools TimeFont; // 时间文字
private Sprite SpExplosion; // 飞机爆炸效果图象
private Sprite SpBomb; // 炸弹爆炸效果图片
private Image ImgBombIcon; // 炸弹图标
private NumImgTools BombFont; // 炸弹个数文字
private int BombCount; // 炸弹个数
private Image ImgPowerIcon; // 能量值图标
private NumImgTools PowerFont; // 能量值个数文字
private int PowerCount; // 能量值个数
private boolean useBomb; // 是否使用炸弹
private Thread ThRunGame; // 线程
private boolean running; // 当前运行状态
private boolean gameover; // 程序是否已经结束
private long GameStartTime; // 游戏开始时间
private int ExplosionFrame; // 飞机爆炸帧数控制累加器
private int BombFrame; // 炸弹爆炸帧数控制累加器
private int gamelevel; // 游戏难度
private boolean BombOnOff; // 是否屏蔽炸弹
private boolean gamelevelup; //游戏难度是否增加
private RecordStore rs; //游戏记录器
private int hightscore; //游戏最高成绩
private int GameTime; //游戏时间
private int TempTime; //临时时间
private String[] GameOverStr; //结束评语
private int danger; //危险度
private int vplane = 3; //飞机速度
private int BombHortation; //炸弹奖励
//--- 构造函数 ----------------------------------------------------------------
protected ManGameCanvas(ManMIDlet manMIDlet) {
// 调用父类的构造方法,必须这样,否则无法编译
// 当参数为true则无法重载keyPressed回调
super(false); //false
this.manMIDlet = manMIDlet;
// 添加按键,并开启监听
addCommand(new Command("退出", Command.EXIT, 1));
addCommand(Cmdstart = new Command("开始", Command.OK, 1));
setCommandListener(this);
SWidth = getWidth(); // 获得设备屏幕宽度
SHeight = getHeight(); // 获得设备屏幕高度
running = false; // 当前运行状态
ThRunGame = null; // 线程初始化
ManGraphics = getGraphics(); // 获得当前屏幕的画布
//--- 初始化背景图象 ---
Image img = ImageTools.getImage("/pic/background.png");
int backcols = SWidth / img.getWidth() + 1; // 计算横向需要多少图片
int backrows = SHeight / img.getHeight() + 1; // 计算纵向需要多少图片
// 初始化平铺层对象,将图象平铺显示
TLBackground = new TiledLayer(backcols, backrows, img, img.getWidth(),
img.getHeight());
// 循环平铺操作,x,y为相对坐标
for (int i = 0; i < backcols * backrows; i++) {
TLBackground.setCell(i % backcols, i / backcols, 1);
}
//--- 初始化小飞机图象 ---
img = ImageTools.getImage("/pic/plane.png");
SpPlane = new Sprite(img, 24, 24);
//--- 初始化记时数字图象 ---
img = ImageTools.getImage("/pic/numbers_b.png");
TimeFont = new NumImgTools(ManGraphics, img, 10, 15);
//--- 初始化子弹图象 ---
img = ImageTools.getImage("/pic/bullet.png");
MBbullets = new ManBullets(this, img, SWidth, SHeight);
//--- 初始化飞机爆炸效果图片 ---
img = ImageTools.getImage("/pic/explosion.png");
SpExplosion = new Sprite(img, 32, 32);
//--- 初始化炸弹爆炸效果图片 ---
img = ImageTools.getImage("/pic/bomb.png");
SpBomb = new Sprite(img, 65, 65);
//--- 初始化炸弹图标 ---
ImgBombIcon = ImageTools.getImage("/pic/bomb_i.png");
//--- 初始化炸弹数字图象 ---
img = ImageTools.getImage("/pic/numbers_s.png");
BombFont = new NumImgTools(ManGraphics, img, 5, 7);
//--- 初始化能量值图标 ---
ImgPowerIcon = ImageTools.getImage("/pic/power_i.png");
//--- 初始化能量值数字图像 ---
img = ImageTools.getImage("/pic/numbers_p.png");
PowerFont = new NumImgTools(ManGraphics, img, 12, 18);
}
//--- 线程主运行 --------------------------------------------------------------
public void run() {
GameTime = 0;
TempTime = 0;
long st = 0, et = 0, diff = 0;
int rate = 50; // 16-17 帧/每妙
while (running) {
st = System.currentTimeMillis();
ManGraphics.setColor(0, 0, 0); // 清空屏幕
ManGraphics.fillRect(0, 0, SWidth, SHeight);
TLBackground.paint(ManGraphics); // 画出背景图象
if (!gameover) {
// 画出飞机图象
SpPlane.paint(ManGraphics);
// 画出子弹
MBbullets.paint(ManGraphics, SpPlane.getX(), SpPlane.getY());
// 游戏操作
GameKeyInput();
// 获得游戏时间
TempTime = (int) (System.currentTimeMillis() - GameStartTime) / 1000;
// 获得绝妙数,换算成能量值
PowerCount = (int) MBbullets.getPower() / 5;
if (GameTime != TempTime) {
GameTime = TempTime;
// 每隔20秒奖励一个炸弹
if (GameTime % 20 == 0 && GameTime != 0 && BombOnOff) {
++BombCount;
}
// 若有9颗炸弹就强行结束游戏,并难度加1
if (BombCount == 9) {
gamelevel++;
ExplosionFrame = 3;
gameover = true;
}
// 若能量值为9,自动使用炸弹且不减炸弹数
if (PowerCount >= 9) {
danger++;
autoBomb();
}
}
// 若游戏时间达到99秒,强行退出游戏
if (GameTime == 99) {
ExplosionFrame = 3;
gameover = true;
}
// 若使用炸弹,显示爆炸效果
if (useBomb) {
if (BombFrame < 6) {
SpBomb.setFrame(++BombFrame);
SpBomb.paint(ManGraphics);
MBbullets.BombBullets(SpPlane.getX(), SpPlane.getY());
}
else {
useBomb = false;
}
}
}
// 如果游戏已经结束
else {
if (ExplosionFrame < 3) { // 显示爆炸效果
SpExplosion.setFrame(++ExplosionFrame);
SpExplosion.paint(ManGraphics);
}
else { // 显示评语
if (gamelevel == 3) {
BombHortation = 15;
}
else {
BombHortation = BombCount + 1;
}
checkrecord(); // 检查记录
if (BombCount == 9) {
GameOverStr = new String[] {
"这个级别对你没难度", "来更高挑战吧"};
}
else if (GameTime < 15) {
GameOverStr = new String[] {
"懒得说什么...", ""};
}
else if (GameTime < 25) {
GameOverStr = new String[] {
"再来一次", "你能做到"};
}
else if (GameTime < 40) {
GameOverStr = new String[] {
"酷,但还可以更好", "再来"};
}
else if (GameTime < 55) {
GameOverStr = new String[] {
"非常好", "你是一个真正的勇士"};
}
else if (GameTime < 70) {
GameOverStr = new String[] {
"你是玩这个游戏的天才", ""};
}
else if (GameTime < 85) {
GameOverStr = new String[] {
"难以置信", "这个游戏难道是你做的?"};
}
else if (GameTime < 99) {
GameOverStr = new String[] {
"...... (上帝也无言了) ......", ""};
}
else {
if (gamelevel >= 3) {
GameOverStr = new String[] {
"恭喜你", "可以不用再完这个游戏了"};
}
else {
GameOverStr = new String[] {
"棒极了", "重新开始挑战新难度吧"};
gamelevelup = true;
}
}
// 设置背景颜色为黑色
ManGraphics.setColor(255, 255, 255);
// 画出游戏评语
ManGraphics.drawString(GameOverStr[0], SWidth / 2, SHeight / 2 - 40,
0x10 | 0x1);
ManGraphics.drawString(GameOverStr[1], SWidth / 2, SHeight / 2 - 20,
0x10 | 0x1);
}
}
// 画出游戏速度文字
ManGraphics.drawString("V:" + vplane, SWidth / 2 - 8, SHeight - 1,
ManGraphics.LEFT | ManGraphics.BOTTOM);
// 画出游戏难度文字
ManGraphics.drawString("LV:" + gamelevel, 1, 1,
ManGraphics.LEFT | ManGraphics.TOP);
// 画出游戏最高危险度文字
ManGraphics.drawString("HI:" + hightscore, SWidth - 4, 1,
ManGraphics.RIGHT | ManGraphics.TOP);
// 画出记时文字
TimeFont.drawNums(GameTime, (SWidth - 14 * 2) / 2, 10, 2);
if (BombOnOff) {
// 画出炸弹图标
ManGraphics.drawImage(ImgBombIcon, 0, SHeight - 1,
ManGraphics.BOTTOM | ManGraphics.LEFT);
// 画出炸弹个数文字
BombFont.drawNum(BombCount, ImgBombIcon.getWidth() + 1, SHeight - 8);
}
// 画出能量值图标
ManGraphics.drawImage(ImgPowerIcon, SWidth - 13, SHeight - 1,
ManGraphics.BOTTOM | ManGraphics.RIGHT);
// 画出能量值个数文字
PowerFont.drawNum(PowerCount, SWidth - 12, SHeight - 19);
flushGraphics(); // 刷新图象显示,没这句不显示图片
et = System.currentTimeMillis();
// 不满足帧数要求,暂停线程至要求帧数
diff = et - st;
if (diff < rate) {
try {
Thread.sleep(rate - diff);
}
catch (InterruptedException ex) {
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -