我一直在尝试使用我的碰撞检测来阻止物体相互穿过。我不知道该怎么做。
当物体碰撞时,我尝试反转它们的速度矢量的方向(这样它就会远离碰撞的地方),但有时物体会相互卡住。
我试过改变他们的速度,但这只是父母互相反对。
有没有一种简单的方法来限制物体的运动,使它们不会穿过其他物体?我一直在使用矩形相交进行碰撞,我也尝试过圆形碰撞检测(使用对象之间的距离)。
想法?
package objects;
import java.awt.Rectangle;
import custom.utils.Vector;
import sprites.Picture;
import render.Window;
// Super class (game objects)
public class Entity implements GameObject{
private Picture self;
protected Vector position;
protected Vector velocity = new Vector(0,0);
private GameObject[] obj_list = new GameObject[0];
private boolean init = false;
// Takes in a "sprite"
public Entity(Picture i){
self = i;
position = new Vector(i.getXY()[0],i.getXY()[1]);
ObjectUpdater.addObject(this);
}
public Object getIdentity() {
return this;
}
// position handles
public Vector getPosition(){
return position;
}
public void setPosition(double x,double y){
position.setValues(x,y);
self.setXY(position);
}
public void setPosition(){
position.setValues((int)Window.getWinSize()[0]/2,(int)Window.getWinSize()[1]/2);
}
// velocity handles
public void setVelocity(double x,double y){ // Use if you're too lazy to make a vector
velocity.setValues(x, y);
}
public void setVelocity(Vector xy){ // Use if your already have a vector
velocity.setValues(xy.getValues()[0], xy.getValues()[1]);
}
public Vector getVelocity(){
return velocity;
}
// inferface for all game objects (so they all update at the same time)
public boolean checkInit(){
return init;
}
public Rectangle getBounds() {
double[] corner = position.getValues(); // Get the corner for the bounds
int[] size = self.getImageSize(); // Get the size of the image
return new Rectangle((int)Math.round(corner[0]),(int)Math.round(corner[1]),size[0],size[1]); // Make the bound
}
// I check for collisions where, this grabs all the objects and checks for collisions on each.
private void checkCollision(){
if (obj_list.length > 0){
for (GameObject i: obj_list){
if (getBounds().intersects(i.getBounds()) && i != this){
// What happens here?
}
}
}
}
public void updateSelf(){
checkCollision();
position = position.add(velocity);
setPosition(position.getValues()[0],position.getValues()[1]);
init = true;
}
public void pollObjects(GameObject[] o){
obj_list = o;
}
}
希望阅读起来不会太难。
编辑: 所以我一直在使用矩形相交方法来计算对象的位置并修改速度。它工作得很好。唯一的问题是某些物体会推动其他物体,但这太重要了。碰撞对于我正在创建的迷你游戏来说几乎是一个额外的东西。非常感谢您的帮助。
尽管如此,我仍然非常感谢对所提到的想法进行详细说明,因为我不完全确定如何将它们实施到我的项目中。