圆弧的碰撞检测

时间:2017-05-04 06:42:16

标签: libgdx collision-detection collision

那么我如何实现圆弧的碰撞检测?我是否必须使用Box 2d碰撞,或者我可以使用Rectangle或类似的东西来做其他方式吗?

BTW我讨厌box2d因为我不理解其中的大部分内容,所以如果有一个排除box2d的解决方案,我将非常感激。

yellow arc circle

黄色弧圈继续在黑色圆圈上旋转。我如何在这里实现碰撞检测?

请帮忙!谢谢!

1 个答案:

答案 0 :(得分:2)

为避免使用Box2D,您可以将形状定义为多边形并使用polygon.contains(x,y)方法或使用Intersector

以下是使用两者的示例:

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.Circle;
import com.badlogic.gdx.math.Intersector;
import com.badlogic.gdx.math.Polygon;

public class Test extends ApplicationAdapter implements InputProcessor{
    private ShapeRenderer sr;
    private Polygon polya;

    private boolean isColliding = false;
    private Circle mp;

    @Override
    public void create () {

        //define arc as polygon 
        // the more points used to define the shape will 
        // increase both required computation and collision precision
        polya = new Polygon();

    // create vertices
    float section = 15f;
    float[] newVerts = new float[200];
    for(int i = 0; i < 50; i++){
        newVerts[i*2] = (float)Math.sin(i/section); //x 0 to 98 even
        newVerts[i*2+1] = (float)Math.cos(i/section); //y 1 to 99  odd

        newVerts[199-i*2] = (float)Math.cos(i/section); //x 100 to 108
        newVerts[198-i*2] = (float)Math.sin(i/section) + 0.2f; //y 101 to 199

    }

    polya.setVertices(newVerts);
    polya.scale(50);
    polya.setOrigin(1, 1);
    polya.rotate(60);

        //define circle to act as point for checking intersections
        mp = new Circle(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,4);
        // setup batchers
        sr = new ShapeRenderer();
        sr.setAutoShapeType(true);

        Gdx.input.setInputProcessor(this);

    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(0f, 0f, 0f, 0f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        // check collision with polygon
        isColliding = polya.contains(mp.x,mp.y);

        //check collision using Intersector
        isColliding = Intersector.isPointInPolygon(polya.getTransformedVertices(),0,polya.getVertices().length,mp.x,mp.y);


        sr.begin();
        sr.setColor(Color.WHITE);
        if(isColliding){
            sr.setColor(Color.RED);
        }
        sr.polygon(polya.getTransformedVertices());
        sr.circle(mp.x,mp.y,mp.radius);
        sr.end();

    }

    @Override
    public void dispose () {
    }

    @Override
    public boolean mouseMoved(int screenX, int screenY) {
        int newy = Gdx.graphics.getHeight() - screenY;
        polya.setPosition(screenX, newy);
        return false;
    }


    (... removed unused input processor methods for clarity ...)
}