LibGDX:Sprite.setBounds在可变坐标和InputAdapter上无法正常工作

时间:2019-12-05 07:41:32

标签: java libgdx

在尝试处理运动图像时遇到问题。

我使用InputAdapter.touchDown()处理单击并为图像创建了Sprite。然后我通过Sprite.setBounds()设置边界。此外,实际上是一个问题:如果setBounds()中的坐标不变,则单击处理正确。但是,如果您更改它们(例如position.x ++),则该对象开始运动,但不会读取点击。

我不知道原因在哪里。

我试图在方法之外创建一个可变变量,但这也没有带来任何结果。 我尝试使用batch.draw(img)而不是img.draw(batch)-效果是一样的。 在img.setBounds()之后,我尝试将Gdx.input.setInputProcessor()移至render()方法-没有任何改变。

我甚至在运动中在线比较了Img和Bounds区域的坐标-它们应该是相同的。

图和构造函数中的处理程序:

    img = new Sprite(new Texture(finSize));
    centerX = Gdx.graphics.getWidth()/2-img.getWidth()/2;
    centerY = Gdx.graphics.getHeight()/2-img.getHeight()/2;
    startPosition = new Vector2(centerX, centerY);

    Gdx.input.setInputProcessor(new InputAdapter(){
        @Override
        public boolean touchDown(int screenX, int screenY, int pointer, int button) {
            if(img.getBoundingRectangle().contains(screenX, screenY))
                System.out.println("Image Clicked");
            return true;
        }
    });

渲染:

public void render(SpriteBatch batch, float radius, float boost) {
    speed+=boost;
    nextX = radius * (float) Math.cos(speed); // Offset step X
    nextY = radius * (float) Math.sin(speed); // Offset step Y

    // Img is moving, but clicks is not handling
    img.setBounds(startPosition.x+ nextX, startPosition.y + nextY, 100, 100);
    // Handling clicks fine, but img is motionless
    img.setBounds(startPosition.x, startPosition.y, 100, 100);

    img.draw(batch);

    // Checking coordinates - all's fine
    System.out.println(img.getBoundingRectangle().getX());
    System.out.println(startPosition.x + nextX);
    System.out.println(img.getBoundingRectangle().getY());
    System.out.println(startPosition.y + nextY);
}

1 个答案:

答案 0 :(得分:0)

因此,我依次比较了图像的XY坐标和鼠标单击点,得出的结论是InputAdaper和Sprite从上方和下方不同地考虑Y。因此,X总是重合,而Y的值相差很大。

结果,我在touchDown()方法中输入了图片中心的两个校正坐标xPos \ yPos(从总视场高度减去Y),而不是与BoundRectangle进行比较,只是比较了图片和点击模的坐标。如果结果进入图像尺寸范围-一切正常。

现在单击运动图像即可正常工作。

   public void render(SpriteBatch batch, float radius, float boost) {
    speed+=boost; // rotational speed
    nextX = radius * (float) Math.cos(speed); // Offset step X
    nextY = radius * (float) Math.sin(speed); // Offset step Y

    // set image size and position
    img.setBounds(startPosition.x+nextX, startPosition.y+nextY, 100, 100);
    img.draw(batch);

    // Corrected coordinates of the image for InputAdapter coordinate system
    xPos = img.getX()+img.getWidth()/2;
    yPos = Gdx.graphics.getHeight()-img.getY()- img.getHeight()/2;

    // Check the coincidence of the coordinates of the image area and the click point
    Gdx.input.setInputProcessor(new InputAdapter(){
        @Override
        public boolean touchDown(int screenX, int screenY, int pointer, int button) {
            if((Math.abs(xPos-screenX)<=img.getWidth()) && (Math.abs(yPos-screenY)<=img.getHeight()))
            {System.out.println("Image Clicked");}
            return true;
        }
    });
}