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

📄 cgame.java

📁 行走,对话,碰撞,打斗,一个RPG的演示版本
💻 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 + -