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

📄 cmap.java

📁 行走,对话,碰撞,打斗,一个RPG的演示版本
💻 JAVA
字号:
import java.io.DataInputStream;
import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

public class CMap implements Const {
	private int mx = 0;

	private int my = 0;

	// 地图图片及战斗动画图片
	private Image img = null;

	private Image img_hero = null;

	private Image img_npc = null;

	private Image img_hero_big = null;

	private Image img_npc_big = null;

	private Image img_bg = null;

	private Image img_magic = null;

	private Image img_blood = null;

	// 地图块宽高
	public int block_w = 0;

	public int block_h = 0;

	// 行列数值
	private int colTilesNum = 0;

	private int rowTilesNum = 0;

	// 底层及遮盖层地图数组
	static int mapdata[][];

	static int mapdata_overpl[][];

	// 不可通过地形数组
	static final int mapcol[] = { 22 };

	// 游戏进程控制
	public int talkcount = 0;

	public int fightcount = 0;

	public int underattack = 0;

	// 游戏逻辑开关
	public boolean s_isattack = false;

	public boolean s_showmagic = false;

	public boolean s_isunderattack = false;

	/*
	 * 载入关卡资源
	 */
	void load(String str) {
		DataInputStream dis = new DataInputStream(str.getClass()
				.getResourceAsStream(str));
		try {
			int mapid = dis.readByte();
			String mapname = "/map" + mapid + ".png";
			System.out.println(mapname);
			img = Image.createImage(mapname);
			block_w = dis.readByte();
			block_h = dis.readByte();
			colTilesNum = dis.readByte();
			rowTilesNum = dis.readByte();
			mapdata = new int[colTilesNum][rowTilesNum];
			mapdata_overpl = new int[colTilesNum][rowTilesNum];
			for (int i = 0; i < colTilesNum; i++) {
				for (int j = 0; j < rowTilesNum; j++) {
					mapdata[i][j] = dis.readByte();
					System.out.print(mapdata[i][j] + " ");
				}
				System.out.println("");
			}
			for (int i = 0; i < colTilesNum; i++) {
				for (int j = 0; j < rowTilesNum; j++) {
					mapdata_overpl[i][j] = dis.readByte();
					System.out.print(mapdata_overpl[i][j] + " ");
				}
				System.out.println("");
			}
			dis.close();
			img_hero = Image.createImage("/hero.png");
			img_npc = Image.createImage("/hunt.png");
			img_hero_big = Image.createImage("/girl.png");
			img_npc_big = Image.createImage("/enemy.png");
			img_bg = Image.createImage("/map4b1.png");
			img_magic = Image.createImage("/magic.png");
			img_blood = Image.createImage("/blood.png");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 绘制底层地图
	void draw(Graphics g) {
		for (int i = 0; i < mapdata.length; i++) {
			for (int j = 0; j < mapdata[i].length; j++) {
				if (mapdata[i][j] != 0 && (mx + block_w * j >= 0)
						&& (mx + block_w * j - Const.SCREEN_WIDTH <= 0)
						&& (my + block_h * i >= 0)
						&& (my + block_h * i - Const.SCREEN_HEIGHT <= 0)) {
					int tempx = mapdata[i][j] % (img.getWidth() / block_w);
					int tempy = mapdata[i][j] / (img.getWidth() / block_w);
					g.setClip(mx + block_w * j, my + block_h * i, block_w,
							block_h);
					g.drawImage(img, mx + block_w * j - block_w * tempx, my
							+ block_h * i - block_h * tempy, 0);
				}
			}
		}
	}

	// 绘制遮盖层地图
	void drawOverpl(Graphics g) {
		for (int i = 0; i < mapdata_overpl.length; i++) {
			for (int j = 0; j < mapdata_overpl[i].length; j++) {
				if ((mapdata_overpl[i][j] != 0) && (mx + block_w * j >= 0)
						&& (mx + block_w * j - Const.SCREEN_WIDTH <= 0)
						&& (my + block_h * i >= 0)
						&& (my + block_h * i - Const.SCREEN_HEIGHT <= 0)) {
					int tempx = mapdata_overpl[i][j]
							% (img.getWidth() / block_w);
					int tempy = mapdata_overpl[i][j]
							/ (img.getWidth() / block_w);
					g.setClip(mx + block_w * j, my + block_h * i, block_w,
							block_h);
					g.drawImage(img, mx + block_w * j - block_w * tempx, my
							+ block_h * i - block_h * tempy, 0);
				}
			}
		}
	}

	// 移动地图
	void trans(int dx, int dy) {
		mx += dx;
		my += dy;
	}

	// 关卡对话文本
	private String texts[] = { "士兵甲:你好!有什么事吗?", "男主角:没事,我就是想揍你一顿!",
			"士兵甲:这么自信?那就来吧", "男主角:那我就不客气了,变身!!", "士兵甲:可恶,我输了。。。",
			"男主角:这下知道我的厉害了吧!哈哈" };

	// 绘制谈话
	public void drawTalk(Graphics g) {
		if (CGame.playstatus != PLAY_TALK)
			return;

		g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
		g.setColor(Const.BLACK);
		if (talkcount < 8 && talkcount != 5)
			g.fillRect(0, SCREEN_HEIGHT >> 1, SCREEN_WIDTH, 20);
		System.out.println(talkcount);
		switch (talkcount) {
		case 1:
			g.setColor(WHITE);
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawString(texts[0], 0, SCREEN_HEIGHT >> 1, 0);
			g.drawImage(img_npc, 0, (SCREEN_HEIGHT >> 1) - img_npc.getHeight(),
					0);
			break;
		case 2:
			g.setColor(WHITE);
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawString(texts[1], 0, SCREEN_HEIGHT >> 1, 0);
			g.drawImage(img_hero, 0, (SCREEN_HEIGHT >> 1)
					- img_hero.getHeight(), 0);
			break;
		case 3:
			g.setColor(WHITE);
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawString(texts[2], 0, SCREEN_HEIGHT >> 1, 0);
			g.drawImage(img_npc, 0, (SCREEN_HEIGHT >> 1) - img_npc.getHeight(),
					0);
			break;
		case 4:
			g.setColor(WHITE);
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawString(texts[3], 0, SCREEN_HEIGHT >> 1, 0);
			g.drawImage(img_hero, 0, (SCREEN_HEIGHT >> 1)
					- img_hero.getHeight(), 0);
			break;
		case 5:
			CGame.playstatus = PLAY_FIGHT;
			talkcount++;
			break;
		case 6:
			g.setColor(WHITE);
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawString(texts[4], 0, SCREEN_HEIGHT >> 1, 0);
			g.drawImage(img_npc, 0, (SCREEN_HEIGHT >> 1) - img_npc.getHeight(),
					0);
			break;
		case 7:
			g.setColor(WHITE);
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawString(texts[5], 0, SCREEN_HEIGHT >> 1, 0);
			g.drawImage(img_hero, 0, (SCREEN_HEIGHT >> 1)
					- img_hero.getHeight(), 0);
			break;
		case 8:
			CGame.playstatus = PLAY_NORMAL;
			CGame.npc.islive = false;
			break;
		}
	}

	// 绘制战斗
	public void drawFight(Graphics g) {
		if (CGame.playstatus != PLAY_FIGHT)
			return;
		if (fightcount < 20) {
			g.setClip(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			for (int i = 0; i < 16; i++) {
				for (int j = 0; j < 12; j++) {
					if (j % 2 == (i % 2 == 1 ? 1 : 0)) {
						g.setColor(BLACK);
						g.fillRect(j * 20, i * 20, fightcount, 20);
					} else {
						g.setColor(BLACK);
						g.fillRect(j * 20, i * 20, 20, fightcount);
					}
				}
			}
			fightcount++;
		} else {
			g.setColor(BLACK);
			g.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			for (int i = 0; i < 8; i++)
				g.drawImage(img_bg, i * (img_bg.getWidth()),
						SCREEN_HEIGHT >> 1, 0);
			g.drawRegion(img_hero, 0, 0, img_hero.getWidth(), img_hero
					.getHeight(), Sprite.TRANS_MIRROR, SCREEN_WIDTH
					- img_hero.getWidth(), 10, 0);
			for (int i = 0; i < 3; i++)
				g.drawImage(img_blood, SCREEN_WIDTH - img_blood.getWidth()
						* (i + 1), 55, 0);
			g.drawImage(img_npc, 0, 10, 0);
			for (int i = 0; i < 3 - underattack; i++)
				g.drawImage(img_blood, img_blood.getWidth() * i, 55, 0);
			drawAnimation(g);
			fightcount++;
		}
	}

	// 绘制动画
	int frameindex = 0;

	int magicindex = 0;

	private void drawAnimation(Graphics g) {// w=52 h=56 total 6 frame
		int w = img_hero_big.getWidth() / 3;
		int h = img_hero_big.getHeight() / 2;
		g.setClip(160, 150, w, h);
		g.drawImage(img_hero_big, 160 - (frameindex % 3) * w, 150
				- (frameindex / 3) * h, 0);
		if (!s_isattack && fightcount % 3 == 0) {
			frameindex = (frameindex + 1) % 2;
		}
		if (s_isattack && fightcount % 4 == 0) {
			frameindex = (frameindex + 1) % 4 + 2;
			if (frameindex == 5 && fightcount % 4 == 0) {
				s_isattack = false;
				s_isunderattack = false;
			}
		}

		if (underattack < 3) {
			g.setClip(50 + (s_isunderattack ? (fightcount % 2 == 0 ? -3 : 3)
					: 0), 140, img_npc_big.getWidth(),
					img_npc_big.getHeight() / 3);
			g.drawImage(img_npc_big, 50, 140, 0);
		}

		if (s_showmagic) {
			g.setClip(30, 126, img_magic.getWidth(), img_magic.getHeight() / 7);
			g.drawImage(img_magic, 30, 126 - (img_magic.getHeight() / 7)
					* magicindex, 0);
		}
		if (s_showmagic && fightcount % 3 == 0) {
			if (magicindex < 7)
				magicindex++;
			else {
				magicindex = 0;
				underattack++;
				s_showmagic = false;
			}
		}

		if (underattack >= 3) {
			CGame.playstatus = PLAY_TALK;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -