⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgame.java

📁 一个简单的J2ME游戏源代码
💻 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 + -