首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java游戏开发中影响实体运动的缺陷

Java游戏开发中影响实体运动的缺陷
EN

Stack Overflow用户
提问于 2022-05-31 04:48:13
回答 1查看 37关注 0票数 -1

我正在通过Youtube的教程学习如何用Java制作2D风格的游戏(视频1的单击此处,尽管我目前正在制作视频#20)。

我最近尝试添加事件块,这会导致玩家传送/治疗/接受伤害。在进行故障排除时,我不再有心灵端口选项,但本质上,当我开始游戏时所发生的事情是,我的玩家应该在哪里产卵,但是当我按下任何方向键时,我会立即被传送到左上角的瓷砖,我不知道为什么。

我已经将其缩小到了我的checkEvent方法,我将在下面发布该方法。

请让我知道,如果我可以张贴更多的代码,我也有一个KeyHandler,实体,播放器和事件矩形类,但在故障排除,直到我删除了下面的checkEvent方法,我能够再次移动。

代码语言:javascript
运行
复制
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;
        }
    }
}

这是我第一次发帖,所以如果我没有遵守礼仪,请告诉我:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 04:50:16

checkEvent()方法是错误的:

代码语言:javascript
运行
复制
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的下一行类似。

将这两行更改为

代码语言:javascript
运行
复制
    int xDistance = Math.abs(gp.player.worldX - previousEventX);
    int yDistance = Math.abs(gp.player.worldY - previousEventY);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72442400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档