衝突検出を使用して、オブジェクトが互いに通り抜けるのを止めようとしています。私はそれを行う方法を理解することはできません。
オブジェクトが衝突するとき、速度ベクトルの方向を逆にしようとしましたが (衝突している場所から遠ざかるように)、オブジェクトが互いに動かなくなることがあります。
私はそれらの速度を切り替えようとしましたが、これは単なる親オブジェクト同士です。
オブジェクトが他のオブジェクトを通過しないようにオブジェクトの動きを制限する簡単な方法はありますか? 私は衝突のために四角形の交差を使用してきました。また、(オブジェクト間の距離を使用して) 円の衝突検出も試しました。
アイデア?
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;
}
}
うまくいけば、読むのはそれほど難しくありません。
編集: だから私はオブジェクトの位置を計算し、速度を変更するために長方形の交差法を使用してきました。それはかなりうまくいっています。唯一の問題は、一部のオブジェクトが他のオブジェクトをプッシュすることですが、それは非常に大きな問題です。コリジョンは、私が作成しているミニ ゲームの追加機能です。どうもありがとうございました。
そうは言っても、言及されたアイデアを自分のプロジェクトに実装する方法が完全にはわからないので、言及されたアイデアについて詳しく説明していただければ幸いです。