我正在尝试开发自上而下的射击游戏。目前,我想从头开始做所有事情,因为我想更好地学习Java。我现在的问题是碰撞检测。我正在使用Rectangle.Intersects(如代码所示)来确定玩家是否与墙壁相交。这几乎是完美的,只是当玩家仅在一个轴上碰撞(即撞入垂直的墙壁)时,他们在两个方向上都被锁定。我想实现滑动以使游戏更加流畅。
我对如何执行此操作有一点想法,这涉及分别检查x和y平面。但是,我不知道使用当前方法是否可以实现。
我对Java有点陌生,所以我对我可以使用的各种类型的库(而不是Rectangles)了解不多,但是它们运行良好,我希望坚持使用它们。
如果有使用Rectangles的解决方案,那就太好了。如果没有,我会接受新的想法。
谢谢。
这是我正在使用的代码
//x and y are position of player and vx and vy are the velocities in respective directions
public void tick() {
x+=vx;
y+=vy;
collision();
//movement
//...
}
private void collision() {
for(int i = 0; i< handler.object.size(); i++) {
GameObject tempObject = handler.object.get(i);
if(tempObject.getId() == ID.Block) {
if(getBounds().intersects(tempObject.getBounds())) {
x +=-vx;
y +=-vy;
}
} //...
public Rectangle getBounds() {
return new Rectangle((int)x,(int)y,32,32);
}
答案 0 :(得分:0)
如果有人对此感到好奇,我制作了一个新的函数来处理运动并将碰撞转换为布尔值,如果玩家与块(墙)相撞,则返回true;如果与其他物体相撞,则返回false。
我还更改了代码块碰撞检查,如代码所示
private boolean collision(double vx, double vy) {
for(int i = 0; i< handler.object.size(); i++) {
GameObject tempObject = handler.object.get(i);
if(tempObject.getId() == ID.Block) {
if(new Rectangle((int)x+(int)vx,(int)y+(int)vy,31,31).intersects(tempObject.getBounds())) {
return true;
}
}
if(tempObject.getId() == ID.Crate) {
if(getBounds().intersects(tempObject.getBounds())) {
main.ammo+=50;
handler.removeObject(tempObject);
}
}
if(tempObject.getId() == ID.Enemy) {
if(getBounds().intersects(tempObject.getBounds())) {
main.hp--;//TODO make it so you cant get stuck in enemies and they drain all your health
}
}
}
return false;
}
和移动功能
public void Move(double vx, double vy) {
if(!collision(vx,vy)) {
x+=vx;
y+=vy;
}
}
打勾方法也略有改变
public void tick() {
collision(vx,vy);
vx = 0;
vy = 0;
//movement
if(handler.isUp()) vy -=5;
//else if(!handler.isDown()) vy = 0;
if(handler.isDown()) vy += 5;
//else if(!handler.isUp()) vy = 0;
if(handler.isRight()) vx += 5;
//else if(!handler.isLeft()) vx = 0;
if(handler.isLeft()) vx -=5;
//else if(!handler.isRight()) vx = 0;
if(vx!=0||vy!=0){
Move(vx,0);
Move(0,vy);
}
//anim.runAnimation();
}