📄 hero.java
字号:
package Game;
import java.io.IOException;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Canvas;
public class Hero {
MyCanvas mc;
Image image; //加载地图用的图片
Image player; //加载主角用的图片
int hp, mp, maxHP, maxMP;
int facedir = 1; //脸的朝向
int dir = 0; //人物走动方向: 1--下 2--右 3--上 4--左
int x, y; //英雄橫縱坐標
int level; //等级
int experience; //升级所需经验值
int currentExperience; //当前经验值
Map map; //地图信息
Collision collision; //碰撞信息
Battle battle; //战斗类
int nowFrame = 0; //当前帧
// 控制动作变化的帧序号, 下, 右, 上, 左
int moveFrame[][] = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11}
};
int placeX; //滚屏用
int placeY;
int nextGrid; //下一步的格序号
int stepToFight; //离地雷式战斗还剩余的步数
boolean fighted = false; //是否正在战斗
Npc npc[];
int scene; //当前的场景号
int nextCollideNPC; //即将与这个 NPC 发生碰撞,如果不与任何一个 NPC 碰撞,其值为 -1
public Hero( MyCanvas mc) {
this.mc = mc;
player = mc.image.img_Hero;
this.level = 1; //游戏开始主角级别为 1
this.hp = this.level * 100;
this.mp = this.level * 50;
battle = new Battle(mc);
npc = new Npc[5];
for (int i = 0; i < npc.length; i++) {
npc[i] = new Npc();
}
npc[0].init(2, 1, 80, 12, 6, 0); //霍恩
npc[1].init(4, 2, 100, 74, 0, 0); //阿美
npc[2].init(1, 1, 128, 76, 11, 13); //胡尔
npc[3].init(0, 1, 80, 76, 2, 10); //萨耶
npc[4].init(3, 1, 96, 12, 11, 0); //尤诺
this.level = 1;
this.mc = mc;
}
public void reset() {
this.level = 1;
this.hp = this.level * 100;
this.mp = this.level * 50;
this.experience = 0;
x = 48;
y = 64;
nowFrame = 0;
dir = 0;
facedir = 2;
placeX = 0;
placeY = 0;
fighted = false; //是否正在战斗
scene = 2;
}
public void restoreHPMP() { // 主角生命值、体力值全恢复
this.hp = this.level * 100;
this.mp = this.level * 50;
}
public void loadScene(int fromMap, int toMap) {
scene = toMap;
try {
image = Image.createImage("/res/map0" + toMap + ".png");
map = new Map("/res/map0" + toMap + ".dat");
collision = new Collision("/res/map0" + toMap + ".cls");
} catch (IOException ex) {
ex.printStackTrace();
}
System.gc();
dir = 0; //站立
placeX = 0;
placeY = 0;
switch (toMap) { //根据地图初始化主角初始位置
case 1: //切换到大地图( 1 号地图)
if (fromMap == 2) { //从 2 号地图切换过来
x = 80;
y = 16;
placeX = 3;
placeY = 0;
facedir = 1;
}
stepToFight = 50;
break;
case 2: //切换到 2 号地图
if (fromMap == 0) { //第一次出现在地图中,即游戏开始时
// x = 48;
// y = 64;
// faceDir = 2; //面向右
} else if (fromMap == 1) { //从大地图( 1 号地图)切换过来
x = 120;
y = 100;
facedir = 4; //面向左
}
break;
}
}
//----------------------------------------------------------
// 画地图,n 代表在地图编辑器中一行的块数
//----------------------------------------------------------
public void drawMap(Graphics g) {
int n = image.getWidth() / 16;
for (int row = 0; row < 13; row++) {
for (int col = 0; col < 11; col++) {
int k = map.GetMapData(row + placeY, col + placeX) - 1;
int mx = col * 16; //当前绘制的横坐标
int my = row * 16; //当前绘制的纵坐标
g.setClip(mx, my, 16, 16); //设定剪裁区
int movex = (k % n) * 16; //图片向左移动像素
int movey = (k / n) * 16; //图片向上移动的像素
g.drawImage(image, mx - movex, my - movey,
Graphics.LEFT | Graphics.TOP);
}
}
}
//---------------------------------------------------
// 画人物
// 在大地图中横竖着走,小地图中45度角斜走
//---------------------------------------------------
public void drawPlayer(Graphics g) {
int row = (x + 48) / 16 - 1;
int col = y / 16;
int step = 8;
switch (dir) { //根据方向判断人物要画第几帧
case 0: //站立
g.setClip(x - 6, y + 6, 24, 48); //加 6 减 6 是为了让主角对准格子
switch (facedir) {
case 1:
g.drawImage(player, x - 6, y + 6, 0);
break;
case 2:
g.drawImage(player, x - 6 - 72, y + 6, 0);
break;
case 3:
g.drawImage(player, x - 6 - 144, y + 6, 0);
break;
case 4:
g.drawImage(player, x - 6 - 216, y + 6, 0);
break;
}
break;
case 1: //向下走
if (collision.InBigMap()) { //在大地图中
if (row + 1 + placeY <= map.getRowNum()) { //防止越界
nextGrid = map.GetMapData(row + 1 + placeY, col + placeX); //下一步的地图块序号
if (collision.InCanGoGrid(nextGrid)) { //是否碰撞
if (row >= 6 && placeY + 1 < map.getRowNum() - 12) {
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
RectInRect(x - 6, y + 16, 18, 32,
npc[i].getPosX() + 6,
npc[i].getPosY() + 3 - 16, 8, 14)) { //不与 NPC 碰撞才移动,-6、+16、+6、+3 是为了对齐人物,drawPlayer()最后的drawRect执行上就会明白
collide = true; //与第 i 个 NPC 碰撞
nextCollideNPC = npc[i].getID();
break;
}
}
if (!collide) {
placeY++; //滚屏
nextCollideNPC = -1;
}
} else {
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
RectInRect(x - 6, y + 16 + 16, 18, 32,
npc[i].getPosX() + 6,
npc[i].getPosY() + 3, 8, 14)) { //不与 NPC 碰撞才移动,-6、+16、+6、+3 是为了对齐人物,drawPlayer()最后的drawRect执行上就会明白
collide = true; //与第 i 个 NPC 碰撞
nextCollideNPC = npc[i].getID();
break;
}
}
if (!collide) {
y += 16; //滚屏
nextCollideNPC = -1;
}
}
}
}
} else { //在小地图中
row = (y + 40) / 16;
col = (x + 12) / 16;
if (row + 1 <= 10 && col - 1 >= 0) {
nextGrid = map.GetMapData(row + 1, col - 1);
if (collision.InCanGoGrid(nextGrid)) { //是否碰撞
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 2 && //是否是小场景中的一个NPC
RectInRect(x - 6 - step, y + 16 + step / 2, 18,
32, npc[i].getPosX() + 6,
npc[i].getPosY() + 3, 8, 14)) {
collide = true; //与第 i 个 NPC 碰撞
nextCollideNPC = npc[i].getID();
break;
}
}
if (!collide) {
x -= step;
y += step / 2;
nextCollideNPC = -1;
}
}
}
}
g.setClip(x - 6, y + 6, 24, 48);
g.drawImage(player, x - 6 - moveFrame[0][nowFrame] * 24, y + 6, 0);
break;
case 2: //向右走
if (collision.InBigMap()) {
if (col + 1 + placeX <= map.getColNum()) {
nextGrid = map.GetMapData(row + placeY, col + 1 + placeX);
if (collision.InCanGoGrid(nextGrid)) {
if (col >= 5 && placeX + 1 < map.getColNum() - 10) {
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
RectInRect(x - 6, y + 16, 18, 32,
npc[i].getPosX() + 6 - 16,
npc[i].getPosY() + 3, 8, 14)) {
collide = true; //与第 i 个 NPC 碰撞
nextCollideNPC = npc[i].getID();
break;
}
}
if (!collide) {
placeX++; //滚屏
nextCollideNPC = -1;
}
} else {
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
RectInRect(x - 6 + 16, y + 16, 18, 32,
npc[i].getPosX() + 6,
npc[i].getPosY() + 3, 8, 14)) {
collide = true; //与第 i 个 NPC 碰撞
nextCollideNPC = npc[i].getID();
break;
}
}
if (!collide) {
x += 16; //滚屏
nextCollideNPC = -1;
}
}
}
}
} else {
row = (y + 40) / 16;
col = (x + 12) / 16;
if (row + 1 <= 10 && col + 1 <= 12) {
nextGrid = map.GetMapData(row + 1, col + 1);
if (collision.InCanGoGrid(nextGrid)) {
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 2 && //是否是小场景中的一个NPC
RectInRect(x - 6 + step, y + 16 + step / 2, 18,
32, npc[i].getPosX() + 6,
npc[i].getPosY() + 3, 8, 14)) {
collide = true; //与第 i 个 NPC 碰撞
nextCollideNPC = npc[i].getID();
break;
}
}
if (!collide) {
x += step;
y += step / 2;
nextCollideNPC = -1;
}
}
}
}
g.setClip(x - 6, y + 6, 24, 48);
g.drawImage(player, x - 6 - moveFrame[1][nowFrame] * 24, y + 6,
0);
break;
case 3: //向上走
if (collision.InBigMap()) {
if (row - 1 + placeY >= 0) {
nextGrid = map.GetMapData(row - 1 + placeY, col + placeX);
if (collision.InCanGoGrid(nextGrid)) {
if (row <= 6 && placeY - 1 >= 0) {
boolean collide = false; //是否碰撞
for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -