📄 cgame.java
字号:
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.Sprite;
public class CGame extends Canvas implements Const, Runnable{
public static boolean isRunning = true;
public static int gameStatus = GS_LOGO;
public int gameCounter = 0;//游戏的计数器
public CLevel level;
int curLevel;
//------------图片对象---------------
Image img_logo,
img_splash,
img_mainmenu, img_menustr;
Image img_loading;
private int mm_selectedId = 0;
//------------------------------------
public CGame(){
setFullScreenMode(true);
img_logo = createImage("/logo.png");
img_loading = createImage("/sdw0.png");
new Thread(this).start();
}
protected void paint(Graphics g) {
drawInterface(g);
keyInputAndUpdate();
}
//----处理按键以及逻辑部分的方法-------
private void keyInputAndUpdate() {
switch(gameStatus){
case GS_LOGO:
loadSplash();
break;
case GS_SPLASH:
loadMainmenu();
break;
case GS_MAINMENU:
if(isPressedKey(MKEY_UP))
mm_selectedId = (mm_selectedId + MAX_MAINMENU_OPTION_NUMBER - 1) % MAX_MAINMENU_OPTION_NUMBER;
if(isPressedKey(MKEY_DOWN))
mm_selectedId = (mm_selectedId + MAX_MAINMENU_OPTION_NUMBER + 1) % MAX_MAINMENU_OPTION_NUMBER;
if(isPressedKey(MKEY_A)){
switch(mm_selectedId){
case MM_NEWGAME:
setNewGameStatus(GS_LOADING);
break;
case MM_CONTINUEGAME:
break;
case MM_HELP:
setNewGameStatus(GS_HELP);
break;
case MM_ABOUT:
setNewGameStatus(GS_ABOUT);
break;
case MM_SOUNDOPTION:
break;
case MM_MOREGAME:
break;
case MM_QUITGAME:
setNewGameStatus(GS_QUIT);
break;
}
}
break;
case GS_LOADING:
loadGame();
break;
case GS_QUIT:
MyMidlet.myControl.destroyApp(true);
break;
case GS_GAMING:
if(!level.mainPlayer.isLive)
setNewGameStatus(GS_GAMEOVER);
if(level.mainPlayer.isLive
&& level.mainPlayer.x - level.myMap.x >= level.myMap.mapdata[0].length * level.myMap.tileW - level.mainPlayer.frame_h)
setNewGameStatus(GS_GAMEWIN);
break;
case GS_HELP:
if(isPressedKey(MKEY_LEFTSOFT))
setNewGameStatus(GS_MAINMENU);
break;
case GS_GAMEWIN:
if(gameCounter == 20 || isPressedKey(MKEY_A)){
if(curLevel == 0){
curLevel ++;
setNewGameStatus(GS_LOADING);
}
else
setNewGameStatus(GS_MAINMENU);
}
break;
case GS_GAMEOVER:
if(gameCounter == 20 || isPressedKey(MKEY_A))
setNewGameStatus(GS_MAINMENU);
break;
case GS_ABOUT:
if(isPressedKey(MKEY_LEFTSOFT))
setNewGameStatus(GS_MAINMENU);
break;
}
}
private void loadGame() {
switch(gameCounter){
case 1:
level = new CLevel(curLevel);
level.mainPlayer.setNewStatus(CPlayer.PS_STAND);
break;
case 31:
setNewGameStatus(GS_GAMING);
break;
}
}
private void loadMainmenu() {
switch(gameCounter){
case 1:
img_logo = null;
break;
case 3:
img_mainmenu = createImage("/mainmenu.png");
img_menustr = createImage("/menustr.png");
break;
case 21:
setNewGameStatus(GS_MAINMENU);
img_splash = null;
break;
}
}
private void loadSplash() {
switch(gameCounter){
case 1:
break;
case 10:
img_splash = createImage("/logo1.png");
break;
case 21:
setNewGameStatus(GS_SPLASH);
break;
}
}
void setNewGameStatus(int newStatus){
this.gameStatus = newStatus;
gameCounter = 0;
}
//----处理绘制界面的方法----------------
private void drawInterface(Graphics g) {
switch(gameStatus){
case GS_LOGO:
fillScreen(g, WHITE);
g.drawImage(img_logo,
SCREEN_WIDTH >> 1,
SCREEN_HEIGHT >> 1,
Graphics.HCENTER | Graphics.VCENTER);
break;
case GS_SPLASH:
fillScreen(g, BLACK);
g.drawImage(img_splash,
SCREEN_WIDTH >> 1,
SCREEN_HEIGHT >> 1,
Graphics.HCENTER | Graphics.VCENTER);
break;
case GS_MAINMENU:
drawMenu(g);
break;
case GS_LOADING:
fillScreen(g, WHITE);
g.drawImage(img_loading, SCREEN_WIDTH >> 1, SCREEN_HEIGHT >> 1, Graphics.HCENTER | Graphics.VCENTER);
g.setColor(BLACK);
g.drawString("loading...", SCREEN_WIDTH >> 2, (SCREEN_HEIGHT >> 1) - 20, 0);
g.setColor(ORANGE);
g.fillRect(0, SCREEN_HEIGHT >> 1, gameCounter * 8, MAINMENU_H);
break;
case GS_QUIT:
g.setColor(BLACK);
g.drawString("是否退出游戏?", 100, 100, 0);
break;
case GS_GAMING:
drawGame(g);
break;
case GS_HELP:
g.setColor(ORANGE);
g.fillRoundRect(10, 10, 220, 280, 3, 3);
g.setColor(BLACK);
g.fillRoundRect(13, 13, 214, 274, 3, 3);
g.setColor(ORANGE);
g.drawString("返回主菜单", 0, 290, 0);
g.setColor(RED);
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("按方向←→控制移动", 20, 100, 0);
g.drawString("按方向↑跳跃", 20, 130, 0);
break;
case GS_GAMEOVER:
level.drawGame(g);
g.setColor(ORANGE);
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("游戏结束", (SCREEN_WIDTH >> 1) - 20, SCREEN_HEIGHT >> 1, 0);
break;
case GS_ABOUT:
g.setColor(ORANGE);
g.fillRoundRect(10, 10, 220, 280, 3, 3);
g.setColor(BLACK);
g.fillRoundRect(13, 13, 214, 274, 3, 3);
g.setColor(ORANGE);
g.drawString("返回主菜单", 0, 290, 0);
g.setColor(RED);
g.setColor(RED);
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("示范样例", 20, 100, 0);
g.drawString("仅供参考", 20, 130, 0);
break;
case GS_GAMEWIN:
level.drawGame(g);
g.setColor(ORANGE);
g.setFont(Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_BOLD, Font.SIZE_LARGE));
g.drawString("游戏胜利", (SCREEN_WIDTH >> 1) - 20, SCREEN_HEIGHT >> 1, 0);
break;
}
}
private void drawGame(Graphics g) {
fillScreen(g, WHITE);
level.drawGame(g);
}
private void drawMenu(Graphics g) {
fillScreen(g, WHITE);
g.drawImage(img_mainmenu, 0, 0, 0);
g.setColor(gameCounter % 2 == 0 ? RED : ORANGE);
g.fillTriangle(MAINMENU_X + (MAINMENU_W >> 1),
MAINMENU_Y - MAINMENU_TRIANGLE_H - 5 + (gameCounter / 3 % 2 == 0 ? 0 : -2),
MAINMENU_X + (MAINMENU_W >> 1) - MAINMENU_TRIANGLE_W,
MAINMENU_Y - 5 + (gameCounter / 3 % 2 == 0 ? 0 : -2),
MAINMENU_X + (MAINMENU_W >> 1) + MAINMENU_TRIANGLE_W,
MAINMENU_Y - 5 + (gameCounter / 3 % 2 == 0 ? 0 : -2)) ;
g.setClip(MAINMENU_X,
MAINMENU_Y,
MAINMENU_W,
MAINMENU_H);
g.drawImage(img_menustr,
MAINMENU_X,
MAINMENU_Y - mm_selectedId * MAINMENU_H,
0);
}
public static void fillScreen(Graphics g, int color){
g.setColor(color);
g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
}
public void run() {
while(isRunning){
repaint();
if(gameCounter > 1000)
gameCounter = 0;
else
gameCounter ++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static final int MKEY_UP = 1;
public static final int MKEY_DOWN = 1 << 1;
public static final int MKEY_LEFT = 1 << 2;
public static final int MKEY_RIGHT = 1 << 3;
public static final int MKEY_A = 1 << 4;
public static final int MKEY_LEFTSOFT = 1 << 5;
public static final int MKEY_RIGHTSOFT = 1 << 6;
public int getKey(int keyCode){
switch(keyCode){
case -1:
case KEY_NUM2:
return MKEY_UP;
case -2:
case KEY_NUM8:
return MKEY_DOWN;
case -3:
case KEY_NUM4:
return MKEY_LEFT;
case -4:
case KEY_NUM6:
return MKEY_RIGHT;
case - 5:
case KEY_NUM5:
return MKEY_A;
case -6:
return MKEY_LEFTSOFT;
case -7:
return MKEY_RIGHTSOFT;
}
return 0;
}
public static int key = 0;
public static int lastKeyPressed = 0;
public static long timeStart = 0, timeEnd;
public static long timeMargin = 0;
public void keyPressed(int keyCode){
System.out.println(keyCode);
timeStart = timeEnd;
timeEnd = System.currentTimeMillis();
timeMargin = timeEnd - timeStart;
key |= getKey(keyCode);
lastKeyPressed = getKey(keyCode);
}
public void keyReleased(int keyCode){
key &= ~getKey(keyCode);
if(isDoublePressed){
lastKeyPressed = 0;
isDoublePressed = false;
}
}
public static boolean isPressedKey(int keyCode){
return (key & keyCode) != 0;
}
public static boolean isDoublePressed = false;
public static boolean isDoublePressedKey(int keyCode){
if((keyCode & lastKeyPressed) != 0){
isDoublePressed = true;
return timeMargin <= 300;
}
return false;
}
public static Image createImage(String str){
try {
return Image.createImage(str);
} catch (IOException e) {
System.out.println("***装载图片"+str+"时出错***");
return null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -