0

私はlibgdxを使用して小さな宇宙ゲームを書いています。船はレーザーを発射し、ポリ(小惑星)と交差するタイミングを計算する必要があります。これは、レーザーがオブジェクトを通過するのを止めて、実際にオブジェクトと衝突できるようにするためです。私のコードは時々機能するようで、他の時点では完全に失敗します。何が失敗するのか理解できません。間違っているのは私のポリ定義ではないと確信しています。エッジで機能する場合もあれば、一貫性がない場合もあるためです。

私は自分の光線の痕跡(厳密に言えば線)をチェックしましたが、それはスポットオンなので、そうではありません。これがコードです。私が何をしたかを説明しようと思います。

//Beam Collisions

//If the beam isn't being fired, return
if(!active) return;

//Storing all the points to be checked on the beam, I've checked the all seem accurate, and have draw a line between them and they match the laser.   
List<Vector2> beamPoints = new ArrayList<Vector2>();

//Step allows me to reduce the number points I test when it finally works
int step = 1;
for(int n=0;n<maxHeight;n+=step){

        //Rotation is the rotation of the ship. I add 90 to it so the angle of my vector is from the x-axis. 
        //shipX is the world coords of the ship. x is the relative start point of the laser to the ship.
        //shipX refers to the centre of the ship, not the corner of the graphic.
        beamPoints.add(
            new Vector2(shipX+x+(float)(n*Math.cos(Math.toRadians(rotation+90))),
                  shipY+y+(float)(n*Math.sin(Math.toRadians(rotation+90)))));
}

//Here I cycle through the entities to test if they collide. Currently the only entities are asteroids.   
for(Entity e : entities){
   //Skip over the entity if it's outside the render range or it has no geometry.
   if(!e.inRenderRange || e.getGeometry()==null) continue;

        //A list to store all the vertices of that asteroids geometry.
        List<Vector2> verts = new ArrayList<Vector2>();
        for(Vector2 v : e.getGeometry()){

                //Determining the x and y of the vertice to store. e.x is the asteroids world coords, I subtract the half the imageWidth because it's position is stored as the centre of the graphic.
                //I then add the relative x and y of the vertex.
                //I've turned off rotation for the asteroids, so that's not a problem.
                float nx = (e.x-e.imageWidth/2)+v.x;
                float ny = (e.y-e.imageHeight/2)+v.y;

                verts.add(new Vector2(nx,ny));

   }

    //Testing each of the points on the beam to see if there are in the poly.
    for(int j=0;j<beamPoints.size();j++){

        //Using Intersector, a class in Libgdx, I can safely assume this is working fine. 
        if(Intersector.isPointInPolygon(verts, beamPoints.get(j))){

            /Changing the height (should be labelled length) of the beam to be that at which it collides. Step is one, so doesn't matter for now.
            height = j*step;
            break;
      }
   }


}

また、次の画像から、レーザーとは明るいコアを意味することを指摘する必要があります。私はそれが光っていることを気にせず、それは間違いではありません。私はまだそれをしていません。

動作例 失敗の例

これが通過するのに十分なコードであることを願っています。他に提供できるものがあれば、質問してください。私はあなたが与えることができるどんな助けにも大いに感謝しています。

みんな乾杯

4

1 に答える 1

2

ライン上に多数の離散点を生成し、それらの点のすべてをチェックでテストしてますか? inPolygonこれは良い方法ではありません。

ポリゴンは線分で構成されています。実際に行う必要があるのは、線分が梁と交差していることをテストしてから、最も近い交点を持つエンティティを見つけることだけです。

線分の交点の計算に関する情報はたくさんあります。

SO からの抜粋: 2 つの線分が交差する場所をどのように検出しますか?

于 2013-01-13T21:20:20.450 に答える