Java 玩家经常在释放钥匙后继续移动
由于某些原因,我的玩家对象在释放移动键后继续移动。速度保持在玩家移动速度,直到释放按键并再次按下释放。在查看velX和Fly的控制台输出时,我看到它在按住几秒钟后将每个帧从8切换到16。偶尔在释放键后,速度会保持在8或-8Java 玩家经常在释放钥匙后继续移动,java,input,keyboard,Java,Input,Keyboard,由于某些原因,我的玩家对象在释放移动键后继续移动。速度保持在玩家移动速度,直到释放按键并再次按下释放。在查看velX和Fly的控制台输出时,我看到它在按住几秒钟后将每个帧从8切换到16。偶尔在释放键后,速度会保持在8或-8 //Player tick method public void tick() { //Dissalow Exceess Velocity velX = Calculations.clamp(velX, -getMaxSpeed(), getMaxSpeed
//Player tick method
public void tick() {
//Dissalow Exceess Velocity
velX = Calculations.clamp(velX, -getMaxSpeed(), getMaxSpeed());
velY = Calculations.clamp(velY, -getMaxSpeed(), getMaxSpeed());
//move the player
x += velX;
y += velY;
//dissalow exiting room
x = Calculations.clamp(x, 0, Game.WIDTH - 32);
y = Calculations.clamp(y, 0, Game.HEIGHT - 32);
//check for collisions with objects
collision();
}
这是我上面使用的夹紧方法(Calculations.Clamp)
将“速度”设置为“最大速度”或“零”,而不是添加或减去“最大速度”,可以解决此问题
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(key == KeyEvent.VK_W) object.setVelY(-object.getMaxSpeed());
if(key == KeyEvent.VK_S) object.setVelY(object.getMaxSpeed());
if(key == KeyEvent.VK_A) object.setVelX(-object.getMaxSpeed());
if(key == KeyEvent.VK_D) object.setVelX(object.getMaxSpeed());
}
}
}
public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(key == KeyEvent.VK_W) object.setVelY(0);
if(key == KeyEvent.VK_S) object.setVelY(0);
if(key == KeyEvent.VK_A) object.setVelX(0);
if(key == KeyEvent.VK_D) object.setVelX(0);
}
}
}
我已经解决了这个问题,它发生在增加额外速度后释放钥匙时,但在夹钳启动之前。我通过向keyinput本身添加速度检查来修复此问题
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(!(object.getVelY() == 8))
{
if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() + object.getMaxSpeed());
}
if(!(object.getVelY() == -8))
{
if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() - object.getMaxSpeed());
}
if(!(object.getVelX() == -8))
{
if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() - object.getMaxSpeed());
}
if(!(object.getVelX() == 8))
{
if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() + object.getMaxSpeed());
}
}
}
}
public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() + object.getMaxSpeed());
if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() - object.getMaxSpeed());
if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() + object.getMaxSpeed());
if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() - object.getMaxSpeed());
}
}
}
在哪里定义ID.player?它是一个全局变量/单例吗?ID是一个枚举,我使用它来标识我的字符,以便区分不同的对象类型。player是该枚举的一个元素。getID()为“player”的唯一对象是播放器。可能的重复虽然这会阻止播放器继续移动,但也会导致相当粘性的移动,因为您无法说同时按住a和d,然后释放d向左移动。
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(key == KeyEvent.VK_W) object.setVelY(-object.getMaxSpeed());
if(key == KeyEvent.VK_S) object.setVelY(object.getMaxSpeed());
if(key == KeyEvent.VK_A) object.setVelX(-object.getMaxSpeed());
if(key == KeyEvent.VK_D) object.setVelX(object.getMaxSpeed());
}
}
}
public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(key == KeyEvent.VK_W) object.setVelY(0);
if(key == KeyEvent.VK_S) object.setVelY(0);
if(key == KeyEvent.VK_A) object.setVelX(0);
if(key == KeyEvent.VK_D) object.setVelX(0);
}
}
}
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(!(object.getVelY() == 8))
{
if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() + object.getMaxSpeed());
}
if(!(object.getVelY() == -8))
{
if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() - object.getMaxSpeed());
}
if(!(object.getVelX() == -8))
{
if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() - object.getMaxSpeed());
}
if(!(object.getVelX() == 8))
{
if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() + object.getMaxSpeed());
}
}
}
}
public void keyReleased(KeyEvent e)
{
int key = e.getKeyCode();
for(GameObject object : myHandler.objects)
{
if(object.getId() == ID.player)
{
if(key == KeyEvent.VK_W) object.setVelY(object.getVelY() + object.getMaxSpeed());
if(key == KeyEvent.VK_S) object.setVelY(object.getVelY() - object.getMaxSpeed());
if(key == KeyEvent.VK_A) object.setVelX(object.getVelX() + object.getMaxSpeed());
if(key == KeyEvent.VK_D) object.setVelX(object.getVelX() - object.getMaxSpeed());
}
}
}