2014-12-09 1 views
0

Я хочу проверить, произошло ли событие ввода внутри тела, в моем случае, внутри круга. Решение, которое I'am играет с использует mousejoint на это, и мой код:как отключить эти строки в mousejoint

public class GameScreen extends AbstractScreen implements InputProcessor { 

    private OrthographicCamera camera; 
    private World world; 
    private Box2DDebugRenderer debugRenderer; 
    private FPSLogger fps_log; 

    private MouseJointDef mjd; 
    private MouseJoint joint; 

    public GameScreen() { 
     super(); 
     Gdx.input.setInputProcessor(this); 
     camera = new OrthographicCamera(Gdx.graphics.getWidth(),Gdx.graphics.getHeight()); 
     camera.position.set(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2,0f); 
     camera.update(); 

     debugRenderer = new Box2DDebugRenderer(); 
     fps_log = new FPSLogger(); 
     world = new World(new Vector2(0,0), false); 

     for(int i = 0 ; i < 20 ; i++){ 
      Ball ball= new Ball(world); 
      ball.start(); 
      ball.setTouchable(Touchable.enabled); 
     } 
     Wall wall = new Wall(world); 
     wall.start(); 

     mjd = new MouseJointDef(); 
     mjd.bodyA = world.createBody(new BodyDef()); 


    } 


    @Override 
    public void render(float delta) { 
     super.render(delta); 
     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

     fps_log.log(); 
     debugRenderer.render(world, camera.combined); 
     world.step(BOX_STEP, BOX_VELOCITY_ITERATIONS, BOX_POSITION_ITERATIONS); 

    } 



    private Vector3 tmp = new Vector3(); 
    private QueryCallback query = new QueryCallback() { 

     @Override 
     public boolean reportFixture(Fixture fixture) { 
      if(fixture.testPoint(tmp.x,tmp.y)) 
       mjd.bodyB = fixture.getBody(); 
       joint = (MouseJoint) world.createJoint(mjd); 
       return false; 
     } 
    }; 

    @Override 
    public boolean touchDown(int screenX, int screenY, int pointer, int button) { 
     camera.unproject(tmp.set(screenX,screenY,0));  
     world.QueryAABB(query, tmp.x, tmp.y, tmp.x, tmp.y); 

     return false; 
    } 
} 

И это то, что происходит:

enter image description here

Почему? Кстати, этот метод (с помощью mousejoint) лучше всего подходит для достижения того, что я хочу?

+0

Наверное, я должен реализовать метод touchUp для устранения сустава. – niarb

ответ

0

В настоящее время я не могу проверить код, но AFAIK вам нужно присвоить результат camera.unproject() некоторой переменной, а затем запросить это. В настоящее время вы устанавливаете tmp для отображения координат, а затем используйте неизменный вектор в качестве мировых координат.

Решение может быть:

Vector3 worldCoords = camera.unproject(tmp.set(...)); 
world.QueryAABB(query, worldCoords.x, worldCoords.y, worldCoords.x, worldCoords.y); 

Несколько других советов:

  • Проверьте, правильно ли переводит камера мышь/экран COORDS в видовые координаты. Если окно просмотра масштабируется, и вы не принимаете это во внимание, вы можете получить неправильные соглашения прямо в начале.

  • Я не так разбираюсь в Box2D, но в целом я не делал AABB-коллизию, но луч, отлитый (по крайней мере в 3D - в 2D с орфографическими проекциями, он проверял бы одну точку). В некоторых случаях размер AABB с точечным размером (ширина и высота равны 0) могут вызвать проблемы.