当前位置: 首页 > 知识库问答 >
问题:

玩家在对象中穿行,它不应该是libgdx java

云项禹
2023-03-14

出于某种原因,我的玩家能够遍历不应该遍历的对象。我使用的是二维布尔数组,如果玩家左边的位置在网格中为真,那么他就不应该移动,右边也是如此。我知道碰撞处理程序正在工作,因为它所做的只是检查左边或右边是否有东西,如果有,它会写player.setCanMove左或右为假,代码在以前的版本中工作。当玩家左边或右边有东西时,我会打印一些东西,这样我就知道碰撞处理程序正在做它的工作。我只是不明白这里发生的是玩家扩展的我的实体更新方法,

if(!wantsToMoveLeft && !wantsToMoveRight)
    velocity.x = 0;

if(velocity.x > 1){
    velocity.x = 1;
}if(velocity.x<-1)
    velocity.x = -1;

position.x += velocity.x;
spritePosition.x += velocity.x;
position.y += velocity.y;
spritePosition.y += velocity.y;

这是我的球员更新方法,

if(wantsToMoveRight && canMoveRight)
    velocity.x = 1;
if(wantsToMoveLeft && canMoveLeft)
    velocity.x = -1;

if(wantsToJump && canJump){
    canFall = true;
    velocity.y += 1f;

    if(lastLeft){
        jumpLeft = true;
        jumpRight = false;
    }else{
        jumpRight = true;
        jumpLeft = false;
    }
}else if(canJump == false){
    jumpLeft = false;
    jumpRight = false;
}

super.update();

这也是我的输入侦听器类

@Override
public boolean keyDown(int keycode) {
    if(keycode == Keys.A){
        player.setLastLeft(true);
        player.setLastRight(false);
        player.setWantsToMoveLeft(true);
        player.setWantsToMoveRight(false);
    }

    if(keycode == Keys.D){
        player.setLastRight(true);
        player.setLastLeft(false);
        player.setWantsToMoveRight(true);
        player.setWantsToMoveLeft(false);
    }

    if(keycode == Keys.W){
        player.setWantsToJump(true);
    }
    return false;
}

@Override
public boolean keyUp(int keycode) {
    if(keycode == Keys.A){
        player.setLastLeft(true);
        player.setLastRight(false);
        player.setWantsToMoveLeft(false);
    }
    if(keycode == Keys.D){
        player.setLastRight(true);
        player.setLastLeft(false);
        player.setWantsToMoveRight(false);
    }

    if(keycode == Keys.W){
        player.setWantsToJump(false);
    }
    return false;
}

如果有人能帮我,我将不胜感激,因为我完全不知所措。如果您需要任何其他信息,请在评论中查询。谢谢你!!

更新-如果我在物体附近行走(在击中它之前)并停止(放开键),然后试着抑制它,它不会让我移动(即,如果我这样做,它会工作)

请注意,我认为这段代码在我切换到使用InputListener之前就已经运行了,这可能是错误的,尽管我记不太清楚了,但我确信,自从我从使用Gdx切换到现在,它就没有运行过。播放器中的输入更新为通过InputListener进行通信

共有1个答案

督冠玉
2023-03-14

我错过的一个简单的解决方案是,当被告知他不能移动时,不要执行停止。我无法解释为什么它以前可以工作,现在我需要这一行代码,但在这里,我把这些代码放在我的播放器更新和方法中,现在它工作得很好。

if(!canMoveLeft) {
    if(!wantsToMoveRight) {
        velocity.x = 0;
    } else {
        velocity.x = 1;
    }
}

if(!canMoveRight) {
    if(!wantsToMoveLeft) {
        velocity.x = 0;
    } else {
        velocity.x = -1;
    }
}

对于任何可能对此感到困惑的人,我感到抱歉,感谢所有试图帮助我的人!

 类似资料:
  • 我正在编程我的第一个实际2D游戏(吃豆人)。我认为比赛看起来不错,但我有一个大问题--碰撞。对象仍然存在,我被困住了,所以我决定寻求有丰富经验的真正程序员的帮助。(我当然做了一些研究,但我不想做复制粘贴之类的事情,因为我没搞懂)。就像我说的,游戏差不多完成了,我所需要做的就是让帕克曼继续前进。像例子一样,我画大的白色矩形作为平台。我希望有人能帮助我。在这个项目中,我学到了很多东西,碰撞是我理解的东

  • 快速笔记。这是我的高级NEA编程项目。有两个主要部分——一个是生成迷宫,用户必须在给定的时间段内通过它,该时间段当前没有实现,第二个部分是用户必须回答教育物理问题以获得最佳分数。问题从本地存储在我的系统上的文本文件中导入。然后,用户的分数和完成日期一起导出到本地文本文件中。 到目前为止,我的程序生成迷宫,用户可以自由移动。教育方面按预期工作。 我该从哪里开始,让墙壁充当物理屏障,而不仅仅是视觉屏障

  • 问题是: 所以我在制作这个2D平台游戏时遇到了一个问题。当玩家跳到一个平台上并离开它时,重力不会影响它,它不会掉下来,直到你再次按下跳跃键,就好像它认为它仍然在地面上,直到你更新他。我已经把问题缩小到重力或碰撞,但找不到问题。有人能帮忙吗?我在下面附上代码。 代码:

  • 我正在尝试编写一个程序,允许用户创建“贷款”对象并在通过利息等式后测量他们必须支付的总金额。我有两个问题,我已经处理了几个小时,但由于某种原因无法解决。最大的问题是,应该在插入变量后计算贷款总支付额的类,但它总是返回零,我不知道为什么。是语法问题吗?我创建了一个测试贷款类来测试程序,该程序创建了十个具有十个随机时间长度的随机贷款,并且“总计支付”和“每月支付”(依赖于总计支付)始终为零。 第二个问

  • https://drive . Google . com/file/d/1 UC 2s ys 7 zfd 686 ukqlyamedzkefehzcar/view?usp =共享 正如你在视频中看到的那样,当我试图从山上跳下来时,玩家只是穿过地形,好像没有地形一样,但我仍然可以正常移动。我注意到,每当我离开地面时快速移动时,问题就出现了,就像我第一次开始这个关卡时,我跳得很慢,然后返回地面,每当我

  • 我知道你可以得到损坏的原因 在实体损坏事件中,但是我还没有找到返回造成损坏的实体的方法。我需要找出这一点,这样我就可以检查玩家的库存中是否有某个物品。