📄 hero.java~25~
字号:
npc[i].getPosX() + 6,
npc[i].getPosY() + 3 + 16, 8, 14)) {
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)) {
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 >= 0 && 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[2][nowFrame] * 24, y + 6,
0);
break;
case 4: //向左走
if (collision.InBigMap()) {
if (col - 1 + placeX >= 0) {
nextGrid = map.GetMapData(row + placeY, col - 1 + placeX);
if (collision.InCanGoGrid(nextGrid)) {
if (col <= 5 && placeX - 1 >= 0) {
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 >= 0 && 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[3][nowFrame] * 24, y + 6,
0);
break;
}
nowFrame++; //下一帧
if (nowFrame > 2)
nowFrame = 0;
if (dir != 0 && collision.InBigMap()) { //在大地图中每走动一步
stepToFight--;
if (stepToFight < 0) { //触发战斗
fighted = true;
battle.reset(this.level, this.hp, this.mp, this.experience); //将主角信息传入 CBattle 中,使场景主角信息与战斗主角信息同步
}
}
g.setClip(0, 0, 176, 208);
g.setColor(255, 0, 0);
// g.drawString("nextGrid="+nextGrid, 0, 0, 0);
// g.drawString("x=" + x + " y=" + y, 0, 20, 0);
// g.drawString("placeX=" + placeX + " placeY=" + placeY, 0, 40, 0);
// g.drawString("faceDir=" + faceDir, 0, 60, 0);
// g.drawLine(x, y, x, y);
// g.fillRect(col * 16, row * 16, 16, 16);
// g.drawRect(x - 6, y + 16, 18, 32); //碰撞盒!!!!!
// g.drawRect(npc[0].getPosX() + 6, npc[0].getPosY() + 3, 8, 14);
// g.drawRect(npc[1].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
// g.drawRect(npc[2].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
// g.drawRect(npc[3].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
// g.drawRect(npc[4].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
// g.drawString("nextCollide=" + nextCollideNPC, 0, 0, 0);
// g.drawRect(npcX + 6, npcY + 3, 8, 14);
}
//---------------------------------------------------
// 根据场景号画 NPC
//---------------------------------------------------
public void drawNPC(Graphics g) {
switch (scene) {
case 1: //在大地图中
for (int i = 0; i < npc.length; i++) {
if (npc[i].getSceneID() == 1) {
npc[i].setPos(npc[i].getOriPosX() -
16 * (placeX - npc[i].getPlaceX()) - 6,
npc[i].getOriPosY() -
16 * (placeY - npc[i].getPlaceY()));
if (npc[i].getPosX() < -26 || npc[i].getPosX() > 176 ||
npc[i].getPosY() < -37 || npc[i].getPosY() > 208) { //NPC 在视图外面,不用画了。
//break;
}
g.setClip(npc[i].getPosX(), npc[i].getPosY(), 26, 37);
g.drawImage(mc.image.img_NPC, npc[i].getPosX() - npc[i].getID() * 26,
npc[i].getPosY(), 0);
}
}
break;
case 2: //在小地图中
for (int i = 0; i < npc.length; i++) {
if (npc[i].getSceneID() == 2) {
g.setClip(npc[i].getPosX(), npc[i].getPosY(), 26, 37);
g.drawImage(mc.image.img_NPC, npc[i].getPosX() - npc[i].getID() * 26,
npc[i].getPosY(), 0);
}
}
break;
}
}
//---------------------------------------------------
// 战斗类的渲染
//---------------------------------------------------
public void drawBattle(Graphics g) {
battle.paint(g);
updatePlayer(); //每回合更新主角信息
if (battle.isFinished()) { //战斗结束
fighted = false;
stepToFight = mc.tools.getRandomNumber(30,50);
}
}
//---------------------------------------------------
// 判断两个 RECT 是否碰撞
//---------------------------------------------------
public boolean RectInRect(int Rect1X, int Rect1Y, int Rect1W, int Rect1H,
int Rect2X, int Rect2Y, int Rect2W, int Rect2H) {
if (Rect1X + Rect1W < Rect2X ||
Rect1X > Rect2X + Rect2W ||
Rect1Y + Rect1H < Rect2Y ||
Rect1Y > Rect2Y + Rect2H)
return false;
return true;
}
//---------------------------------------------------
// 更新主角信息
//---------------------------------------------------
public void updatePlayer() {
this.hp = battle.getPlayerHP();
this.mp = battle.getPlayerMP();
this.level = battle.getPlayerLevel();
this.level = battle.getPlayerExp();
}
//---------------------------------------------------
// 返回下一步要碰撞的 NPC 的 ID 号
//---------------------------------------------------
public int getNextCollideNPC() {
return nextCollideNPC;
}
//---------------------------------------------------
// 返回是否正在战斗
//---------------------------------------------------
public boolean isFighted() {
return fighted;
}
//---------------------------------------------------
// 返回主角是否死亡
//---------------------------------------------------
public boolean isDead() {
return battle.isDead();
}
//---------------------------------------------------
// 得到下一步的地图块号
//---------------------------------------------------
public int getNextGrid() {
return nextGrid;
}
//---------------------------------------------------
// 得到 X 坐标
//---------------------------------------------------
public int getPosX() {
return x;
}
//---------------------------------------------------
// 得到 Y 坐标
//---------------------------------------------------
public int getPosY() {
return y;
}
//---------------------------------------------------
// 得到面向序号
//---------------------------------------------------
public int getFaceDir() {
return facedir;
}
//---------------------------------------------------
// 按键消息处理
//---------------------------------------------------
public void keyPressed(int key) {
System.out.println("key===="+key);
if (fighted) { //处于战斗页面
battle.keyPressed(key);
} else { //处于场景页面
System.out.println("mc.UP===="+mc.UP);
if (-key == mc.UP) {
dir = 3; System.out.println("3");
}
if (-key == mc.DOWN) {
dir = 1;System.out.println("1");
}
if (-key == mc.LEFT) {
dir = 4;System.out.println("4");
}
if (-key == mc.RIGHT) {
dir = 2; System.out.println("2");
}
}
}
//---------------------------------------------------
// 按键消息处理
//---------------------------------------------------
public void keyReleased(int key) {
if (dir != 0)
facedir = dir;
dir = 0; //松开键后站立
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -