2017-09-03 61 views
-2

我是编程新手,所以我只是在玩一个我想做的无限亚军游戏。我添加了角色图像,并且他必须尝试克服移动块。目前我拥有它,因此,如果角色与该块相撞,他的速度将为0,因此他无法移动该对象。但是我的KeyListener覆盖了这个。所以一旦该块击中角色,他就会停止移动1次游戏刻度,但是如果您按住键并且他直线移动块,则KeyListener将继续增加他的速度。我无法弄清楚如何解决这个问题。约束一个移动的对象

这是我的球员类,它处理球员的运动以及约束。

package runner; 

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Player implements KeyListener { 

public static int playerX = 35; 
public static int playerY = 285; 
public static int playerWidth = 100; 
public static int playerHeight = 100; 
public static int playerVX, playerVY; 

public static void update() { 
    playerX += playerVX; 
    playerY += playerVY; 

    constrain(); 
} 

public static void paint(Graphics g) { 
    //g.setColor(Color.white); 
    //g.fillRect(playerX, playerY, 100,100); 
} 

public static void constrain() { 
    if (playerX + playerWidth >= Obstacle.getX() && playerX <= 
Obstacle.getX() + Obstacle.width && playerY + playerHeight >= 
Obstacle.getY()) { 
     playerX = 0; 
    } 
} 

@Override 
public void keyTyped(KeyEvent e) { 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_LEFT) { 
     playerVX = -5; 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     playerVX = 5; 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     playerVY = -5; 
    } 
    if(keyCode == KeyEvent.VK_DOWN) { 
     playerVY = 5; 
    } 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_LEFT) { 
     playerVX = 0; 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     playerVX = 0; 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     playerVY = 0; 
    } 
    if(keyCode == KeyEvent.VK_DOWN) { 
     playerVY = 0; 
    } 
} 
} 

谢谢!

+2

对不起,这不是StackOverflow的工作原理。形式问题_“这是我的一堆代码,它不起作用,有人能帮我弄清楚”_被认为是无关紧要的。请访问[帮助]并阅读[问]获取更多信息,尤其是阅读[为什么是“有人可以帮助我?”不是一个实际问题?](http://meta.stackoverflow.com/q/284236/18157 )。你有没有在代码中放置断点来查看实际发生的事情? –

+0

我想,因为我只是错过了一些小问题,这个问题将是适当的。我在我的代码中加入了断点。一旦角色碰撞块,Velocity被设置为0,但是下一次游戏时间戳,你可以使用KeyListener来提高通过块直接发送角色的速度 – CoderKlipto

+0

好吧,你知道发生了什么,修改你的代码以防止通过检查关键听众是否可以沿选定方向移动而发生。 –

回答

0

我现在正在做一个游戏,并且有同样的麻烦(我也是游戏编程的新手)。我想出了一些方法来处理碰撞。

这种方法会去您的播放器类:

public void applyBound(Bound bound) { 
    if (bound.x1 != null) { 
     if (x <= bound.x1) { 
      x = bound.x1; 
     } 
    } 
    if (bound.x2 != null) { 
     if (x >= bound.x2 - width) { 
      x = bound.x2 - width; 
     } 
    } 
    if (bound.y1 != null) { 
     if (y <= bound.y1) { 
      y = bound.y1; 
     } 
    } 
    if (bound.y2 != null) { 
     if (y >= (bound.y2 - height)) { 
      y = bound.y2 - height; 
     } 
    } 
} 

凡界是:

public class Bound { 
    public Integer x1, x2, y1, y2; 

    public Bound(int x1, int x2, int y1, int y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 

    public Bound(Integer x1, Integer x2, Integer y1, Integer y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 
} 

“applyBound(boxBounds)” 将是每次更新您的播放器称为最后一件事。

  • “Bound.x1”是玩家可以走的最左边的位置。
  • “Bound.x2”是最右边的位置
  • “Bound.y1”是最底层的位置和
  • “Bound.y2”是最上面的位置

界可以为null所以你不需要例如上限。

在Bound类中,例如,可以放置屏幕的边界,以便玩家不能关闭,或者可以放入另一个角色的边缘。

您需要使用变量来查看按键是否被按下,并在更新方法中添加速度。

希望这会有所帮助!