我正在通过Youtube的教程学习如何用Java制作2D风格的游戏(视频1的单击此处,尽管我目前正在制作视频#20)。
我最近尝试添加事件块,这会导致玩家传送/治疗/接受伤害。在进行故障排除时,我不再有心灵端口选项,但本质上,当我开始游戏时所发生的事情是,我的玩家应该在哪里产卵,但是当我按下任何方向键时,我会立即被传送到左上角的瓷砖,我不知道为什么。
我已经将其缩小到了我的checkEvent方法,我将在下面发布该方法。
请让我知道,如果我可以张贴更多的代码,我也有一个KeyHandler,实体,播放器和事件矩形类,但在故障排除,直到我删除了下面的checkEvent方法,我能够再次移动。
package main;
public class EventHandler {
GamePanel gp;
EventRect eventRect[][];
int previousEventX, previousEventY;
boolean canTouchEvent = true;
public EventHandler(GamePanel gp) {
this.gp = gp;
eventRect = new EventRect[gp.maxWorldCol][gp.maxWorldRow];
int col = 0;
int row = 0;
while (col < gp.maxWorldCol && row < gp.maxWorldRow) {
eventRect[col][row] = new EventRect();
eventRect[col][row].x = 23;
eventRect[col][row].y = 23;
eventRect[col][row].width = 2;
eventRect[col][row].height = 2;
eventRect[col][row].eventRectDefaultX = eventRect[col][row].x;
eventRect[col][row].eventRectDefaultY = eventRect[col][row].y;
col++;
if (col == gp.maxWorldCol) {
col = 0;
row++;
}
}
}
public void checkEvent() {
//check if character is one tile away from last event
int xDistance = Math.abs(gp.player.worldX = previousEventX);
int yDistance = Math.abs(gp.player.worldY = previousEventY);
int distance = Math.max(xDistance, yDistance);
if (distance > gp.tileSize) {
canTouchEvent = true;
}
if(canTouchEvent == true) {
if (hit(27, 16, "any") == true) {damagePit(27, 16, gp.dialogueState);}
if (hit(27, 18, "any") == true) {healingPool(27, 18, gp.dialogueState);}
}
}
public boolean hit(int col, int row, String reqDirection) {
boolean hit = false;
gp.player.solidArea.x = gp.player.worldX + gp.player.solidArea.x;
gp.player.solidArea.y = gp.player.worldY + gp.player.solidArea.y;
eventRect[col][row].x = col*gp.tileSize + eventRect[col][row].x;
eventRect[col][row].y = row*gp.tileSize + eventRect[col][row].y;
if (gp.player.solidArea.intersects(eventRect[col][row]) && eventRect[col][row].eventDone == false) {
if (gp.player.direction.contentEquals(reqDirection) || reqDirection.contentEquals("any")) {
hit = true;
previousEventX = gp.player.worldX;
previousEventY = gp.player.worldY;
}
}
gp.player.solidArea.x = gp.player.solidAreaDefaultX;
gp.player.solidArea.y = gp.player.solidAreaDefaultY;
eventRect[col][row].x = eventRect[col][row].eventRectDefaultX;
eventRect[col][row].y = eventRect[col][row].eventRectDefaultY;
return hit;
}
/*public void teleport(int col, int row, int gameState) {
gp.gameState = gp.gameState;
gp.ui.currentDialogue = "NYOOM";
gp.player.worldX = gp.tileSize * 17;
gp.player.worldY = gp.tileSize * 20;
canTouchEvent = false;
}
*/
public void damagePit(int col, int row, int gameState) {
gp.gameState = gameState;
gp.ui.currentDialogue = "MWAHA! You dun messed up";
gp.player.life -= 1;
//eventRect[col][row].eventDone = true;
canTouchEvent = true;
}
public void healingPool(int col, int row, int gameState) {
if (gp.keyH.enterPressed == true) {
gp.gameState = gameState;
gp.ui.currentDialogue = "Ahh, moistness";
gp.player.life = gp.player.maxLife;
}
}
}
这是我第一次发帖,所以如果我没有遵守礼仪,请告诉我:)
发布于 2022-06-02 04:50:16
checkEvent()
方法是错误的:
public void checkEvent() {
//check if character is one tile away from last event
int xDistance = Math.abs(gp.player.worldX = previousEventX);
int yDistance = Math.abs(gp.player.worldY = previousEventY);
int distance = Math.max(xDistance, yDistance);
if (distance > gp.tileSize) {
canTouchEvent = true;
}
if(canTouchEvent == true) {
if (hit(27, 16, "any") == true) {damagePit(27, 16, gp.dialogueState);}
if (hit(27, 18, "any") == true) {healingPool(27, 18, gp.dialogueState);}
}
}
在int xDistance = Math.abs(gp.player.worldX = previousEventX);
行中,您将previousEventX
的当前值(为0)赋值给gp.player.worldX
(将播放机传输到X坐标0),并将xDistance
设置为0(因为计算了Math.abs(0)
)。
yDistance
的下一行类似。
将这两行更改为
int xDistance = Math.abs(gp.player.worldX - previousEventX);
int yDistance = Math.abs(gp.player.worldY - previousEventY);
https://stackoverflow.com/questions/72442400
复制相似问题