📄 cgame.java
字号:
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class CGame extends Canvas implements Runnable, Const {
// 游戏状态
public static int gamestatus = 0;
public static int gamecount = 0;
public static int menuindex = 0;
public static int playstatus = 0;
// 状态开关
private boolean s_isrunning = false;
private boolean s_drawtalk = false;
private boolean s_isquit = false;
// 游戏图片
private Image img_logo;
private Image img_player;
private Image img_npc;
private Image img_menu;
// 游戏对象
static Player pl;
static CMap mp;
static CNpc npc;
public CGame() {
setFullScreenMode(true);
s_isrunning = true;
img_logo = createImage("/logo.png");
}
// 创建图片方法
public static Image createImage(String str) {
Image img = null;
try {
img = Image.createImage(str);
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
// 清屏
public static void fillScreen(Graphics g, int color) {
g.setColor(color);
g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
}
// 线程
public void run() {
while (s_isrunning) {
repaint();
serviceRepaints();
try {
Thread.sleep(SLEEP_TIME);
} catch (Exception e) {
}
}
MyMid.mid.destroyApp(true);
MyMid.mid = null;
}
// 绘制游戏
protected void paint(Graphics g) {
switch (gamestatus) {
case GS_LOGO:
drawLogo(g);
break;
case GS_LOADMENU:
drawMenuLoad(g);
loadMenu();
break;
case GS_MENU:
drawMenu(g);
break;
case GS_LOADGAME:
drawGameLoad(g);
loadGame();
break;
case GS_INGAME:
drawGame(g);
break;
case GS_WIN:
drawWin(g);
case GS_QUIT:
g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
g.setColor(WHITE);
g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
g.setColor(BLACK);
g.drawString("演示完毕", (SCREEN_WIDTH >> 1) - 20, SCREEN_HEIGHT >> 1,
0);
quit();
break;
default:
break;
}
if (gamecount <= 50)
gamecount++;
else
gamecount = 0;
}
// 绘制胜利
private void drawWin(Graphics g) {
g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
g.setColor(BLACK);
g.fillRect(80, 140, 80, 40);
g.setColor(WHITE);
g.drawString("恭喜过关", 80, 140, 0);
}
// 设置新的游戏状态
private void setNewGamestatus(int newgamestatus) {
gamecount = 0;
gamestatus = newgamestatus;
}
// 退出游戏
private void quit() {
if (s_isquit)
s_isrunning = false;
}
// 绘制LOGO
private void drawLogo(Graphics g) {
switch (gamecount) {
case 1:
fillScreen(g, WHITE);
g.drawImage(img_logo, (SCREEN_WIDTH >> 1)
- ((img_logo.getWidth()) >> 1), (SCREEN_HEIGHT >> 1)
- ((img_logo.getHeight()) >> 1), 0);
break;
case 30:
setNewGamestatus(GS_LOADMENU);
}
}
// 绘制游戏菜单
private void drawMenu(Graphics g) {
fillScreen(g, WHITE);
g.drawImage(img_menu, 0, 0, 0);
g.setColor(GREEN);
g.drawString("开始游戏", (SCREEN_WIDTH >> 1) - 20, SCREEN_HEIGHT >> 2, 0);
g.drawString("退出游戏", (SCREEN_WIDTH >> 1) - 20, SCREEN_HEIGHT >> 1, 0);
g.setColor(gamecount % 2 == 0 ? BLUE : RED);
g.drawRect((SCREEN_WIDTH >> 1) - 20, SCREEN_HEIGHT >> (2 - menuindex),
50, 18);
}
// 载入菜单资源
private void loadMenu() {
switch (gamecount) {
case 1:
img_menu = createImage("/menu.png");
break;
}
}
// 绘制菜单前load界面
private void drawMenuLoad(Graphics g) {
fillScreen(g, BLACK);
g.setColor(RED);
g.fillRect(0, (SCREEN_HEIGHT >> 1) + (SCREEN_HEIGHT >> 2),
gamecount * 8, 3);
g.drawString("Loading...", SCREEN_WIDTH >> 1, SCREEN_HEIGHT >> 1, 0);
switch (gamecount) {
case 31:
setNewGamestatus(GS_MENU);
break;
}
}
// 绘制进入游戏前load界面
private void drawGameLoad(Graphics g) {
fillScreen(g, BLACK);
g.setColor(BLUE);
g.fillRect(0, (SCREEN_HEIGHT >> 1) + (SCREEN_HEIGHT >> 2),
gamecount * 8, 3);
g.drawString("Loading...", SCREEN_WIDTH >> 1, SCREEN_HEIGHT >> 1, 0);
switch (gamecount) {
case 31:
setNewGamestatus(GS_INGAME);
break;
}
}
// 绘制游戏
private void drawGame(Graphics g) {
switch (playstatus) {
case PLAY_NORMAL:
fillScreen(g, BLACK);
mp.draw(g);
if (pl.y > npc.y) {
npc.updateNPC();
npc.draw(g);
npc.nextFrame();
pl.updatePlayer();
pl.draw(g);
pl.nextFrame();
} else {
pl.updatePlayer();
pl.draw(g);
pl.nextFrame();
npc.updateNPC();
npc.draw(g);
npc.nextFrame();
}
mp.drawOverpl(g);
break;
case PLAY_FIGHT:
if (mp.fightcount < 2) {
if (pl.y > npc.y) {
npc.updateNPC();
npc.draw(g);
npc.nextFrame();
pl.updatePlayer();
pl.draw(g);
pl.nextFrame();
} else {
pl.updatePlayer();
pl.draw(g);
pl.nextFrame();
npc.updateNPC();
npc.draw(g);
npc.nextFrame();
}
}
mp.drawFight(g);
break;
case PLAY_TALK:
mp.draw(g);
if (pl.y > npc.y) {
npc.draw(g);
npc.nextFrame();
pl.draw(g);
pl.nextFrame();
} else {
pl.draw(g);
pl.nextFrame();
npc.draw(g);
npc.nextFrame();
}
mp.drawOverpl(g);
if (s_drawtalk)
mp.drawTalk(g);
break;
}
}
// 载入游戏资源
private void loadGame() {
switch (gamecount) {
case 1:
break;
case 3:
img_player = createImage("/pl.png");
img_npc = createImage("/npc.png");
break;
case 5:
pl = new Player(32, 32, MP_FRAME_W, MP_FRAME_H);
pl.setImage(img_player);
npc = new CNpc(160, 160, NPC_FRAME_W, NPC_FRAME_H);
npc.setImage(img_npc);
mp = new CMap();
mp.load("/level00");
break;
}
}
// 按键控制
protected void keyPressed(int keyCode) {
int gameKey = getKey(keyCode);
if ((gamestatus == GS_MENU) && (gameKey == GK_UP)
|| (gameKey == GK_DOWN)) {
menuindex = (menuindex + 1) % 2;
}
if ((gameKey == GK_A) && (gamestatus == GS_MENU)) {
switch (menuindex) {
case 0:
setNewGamestatus(GS_LOADGAME);
break;
case 1:
setNewGamestatus(GS_QUIT);
break;
default:
break;
}
}
if (gamestatus == GS_INGAME) {
switch (gameKey) {
case GK_UP:
pl.dir_up = true;
break;
case GK_DOWN:
pl.dir_down = true;
break;
case GK_LEFT:
pl.dir_left = true;
break;
case GK_RIGHT:
pl.dir_right = true;
break;
}
}
if (gamestatus == GS_INGAME && playstatus == PLAY_NORMAL
&& gameKey == GK_A && pl.CollisionWithActor(npc)
&& npc.islive == true) {
playstatus = PLAY_TALK;
s_drawtalk = true;
}
if (playstatus == PLAY_TALK && gameKey == GK_A)
mp.talkcount++;
if (playstatus == PLAY_FIGHT && gameKey == GK_A) {
mp.s_isattack = true;
mp.s_showmagic = true;
mp.s_isunderattack = true;
}
if (gamestatus == GS_WIN && gameKey == GK_A) {
setNewGamestatus(GS_QUIT);
}
if (gamestatus == GS_QUIT && gameKey == GK_A) {
s_isquit = true;
}
if (playstatus == PLAY_NORMAL && gameKey == GK_A && npc.islive == false) {
gamestatus = GS_QUIT;
}
}
protected void keyReleased(int keyCode) {
int gameKey = getKey(keyCode);
if (gamestatus == GS_INGAME) {
switch (gameKey) {
case GK_UP:
pl.dir_up = false;
break;
case GK_DOWN:
pl.dir_down = false;
break;
case GK_LEFT:
pl.dir_left = false;
break;
case GK_RIGHT:
pl.dir_right = false;
break;
}
}
}
// 映射键值
private static int getKey(int keyCode) {
switch (keyCode) {
case Canvas.KEY_NUM2:
case Canvas.UP:
case -1:
return GK_UP;
case Canvas.KEY_NUM8:
case Canvas.DOWN:
case -2:
return GK_DOWN;
case Canvas.KEY_NUM4:
case Canvas.LEFT:
case -3:
return GK_LEFT;
case Canvas.KEY_NUM6:
case Canvas.RIGHT:
case -4:
return GK_RIGHT;
case Canvas.FIRE:
case KEY_NUM5:
case -5:
return GK_A;
case LEFT_SOFT:
return GK_LEFT_SOFT;
case RIGHT_SOFT:
return GK_RIGHT_SOFT;
default:
return 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -