LibGDX:Sprite.setBounds 不能正确使用易失坐标和 InputAdapter
LibGDX: Sprite.setBounds doesn't work correctly with volatile coordinates and InputAdapter
尝试处理移动图像上的点击时遇到问题。
我使用 InputAdapter.touchDown() 来处理点击并为图像创建 Sprite。然后我通过 Sprite.setBounds() 设置边框。此外,事实上,问题是:如果 setBounds() 中的坐标未更改 - 正确处理了点击。但是,如果您更改它们(例如 position.x++)- 对象开始运动,但不会读取点击。
我不明白原因在哪里。
我试图在方法外创建一个可变变量,但这也没有带来任何结果。
我尝试使用 batch.draw(img) 而不是 img.draw(batch) - 效果是一样的。
我试图在 img.setBounds() 之后将 Gdx.input.setInputProcessor() 重新定位到 render() 方法 - 没有任何改变。
我什至在线比较了 Img 和 Bounds 区域的坐标,在运动中 - 它们是相同的,理应如此。
构造函数中的 Img 和处理程序:
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);
}
因此,我依次比较了图像的 XY 坐标和鼠标点击点,得出的结论是 InputAdaper 和 Sprite 对 Y 的考虑不同——从上方和从下方。因此,X总是重合,Y的值相差很大。
因此,我在touchDown()方法中输入了两个修正后的坐标xPos \ yPos(总场高减去Y)的pic和touchDown()方法,不与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;
}
});
}
尝试处理移动图像上的点击时遇到问题。
我使用 InputAdapter.touchDown() 来处理点击并为图像创建 Sprite。然后我通过 Sprite.setBounds() 设置边框。此外,事实上,问题是:如果 setBounds() 中的坐标未更改 - 正确处理了点击。但是,如果您更改它们(例如 position.x++)- 对象开始运动,但不会读取点击。
我不明白原因在哪里。
我试图在方法外创建一个可变变量,但这也没有带来任何结果。 我尝试使用 batch.draw(img) 而不是 img.draw(batch) - 效果是一样的。 我试图在 img.setBounds() 之后将 Gdx.input.setInputProcessor() 重新定位到 render() 方法 - 没有任何改变。
我什至在线比较了 Img 和 Bounds 区域的坐标,在运动中 - 它们是相同的,理应如此。
构造函数中的 Img 和处理程序:
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);
}
因此,我依次比较了图像的 XY 坐标和鼠标点击点,得出的结论是 InputAdaper 和 Sprite 对 Y 的考虑不同——从上方和从下方。因此,X总是重合,Y的值相差很大。
因此,我在touchDown()方法中输入了两个修正后的坐标xPos \ yPos(总场高减去Y)的pic和touchDown()方法,不与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;
}
});
}