Java Android 2D 游戏 - 虚拟边框问题
Java Android 2D Game - Issue with virtual borders
我是一名计算机科学专业的学生,我是编程新手。为了挑战自己,我决定尝试创建一个简单的 2D android 游戏。
我遇到的问题与边界有关。我有一个可以沿 X 轴左右移动的玩家角色,尽管该角色不应该离开屏幕。这在大多数情况下都有效,但是按住将角色发送到 left/right 的按钮将使角色穿过边界。
我所拥有的代码本质上是 update() 方法中的一个 if 语句,它检查玩家角色的 x 值是否 < 0(对于左边框),如果该语句为真,则它防止玩家再次点击左键,直到右键被点击(玩家的 x 值再次大于 0)。
我该如何解决这个问题?我的第一个想法是,我可以每 5 毫秒左右检查一次游戏状态,如果玩家的 x 值等于或小于 0,则将移动速度设置为 0,直到单击右键,但我这样做了不知道如何执行此检查。
您是否知道如何实施或是否有更好的解决方案?非常感谢!
相关代码如下:
//In class GamePanel
public void update() {
if (player.getX() <= 4) {
player.setTooFarLeft(true);
MOVESPEED = 0;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
final float scaleFactorX = getWidth() / (WIDTH * 1.f);
final float scaleFactorY = getHeight() / (HEIGHT * 1.f);
Rect right = new Rect((int) ((WIDTH * scaleFactorX) / 3 + (int) (WIDTH * scaleFactorX) / 3), 0, (int) (WIDTH * scaleFactorX), (int) (HEIGHT * scaleFactorY));
Rect left = new Rect(0, 0, (int) (WIDTH * scaleFactorX / 3), (int) (HEIGHT * scaleFactorY));
int x = (int) event.getX();
int y = (int) event.getY();
//Same for right
if (left.contains(x, y) && player.getTooFarLeft()==false) {
if (!player.getPlaying()) {
player.setPlaying(true);
} else {
player.setMovement(4);
player.setLeft(true);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
player.setMovement(8);
}
}, 1000);
}
return true;
}
如果玩家的 x 小于 0,则将他的 x 坐标设置为 3。
我是一名计算机科学专业的学生,我是编程新手。为了挑战自己,我决定尝试创建一个简单的 2D android 游戏。 我遇到的问题与边界有关。我有一个可以沿 X 轴左右移动的玩家角色,尽管该角色不应该离开屏幕。这在大多数情况下都有效,但是按住将角色发送到 left/right 的按钮将使角色穿过边界。
我所拥有的代码本质上是 update() 方法中的一个 if 语句,它检查玩家角色的 x 值是否 < 0(对于左边框),如果该语句为真,则它防止玩家再次点击左键,直到右键被点击(玩家的 x 值再次大于 0)。
我该如何解决这个问题?我的第一个想法是,我可以每 5 毫秒左右检查一次游戏状态,如果玩家的 x 值等于或小于 0,则将移动速度设置为 0,直到单击右键,但我这样做了不知道如何执行此检查。
您是否知道如何实施或是否有更好的解决方案?非常感谢!
相关代码如下:
//In class GamePanel
public void update() {
if (player.getX() <= 4) {
player.setTooFarLeft(true);
MOVESPEED = 0;
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
final float scaleFactorX = getWidth() / (WIDTH * 1.f);
final float scaleFactorY = getHeight() / (HEIGHT * 1.f);
Rect right = new Rect((int) ((WIDTH * scaleFactorX) / 3 + (int) (WIDTH * scaleFactorX) / 3), 0, (int) (WIDTH * scaleFactorX), (int) (HEIGHT * scaleFactorY));
Rect left = new Rect(0, 0, (int) (WIDTH * scaleFactorX / 3), (int) (HEIGHT * scaleFactorY));
int x = (int) event.getX();
int y = (int) event.getY();
//Same for right
if (left.contains(x, y) && player.getTooFarLeft()==false) {
if (!player.getPlaying()) {
player.setPlaying(true);
} else {
player.setMovement(4);
player.setLeft(true);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
player.setMovement(8);
}
}, 1000);
}
return true;
}
如果玩家的 x 小于 0,则将他的 x 坐标设置为 3。