避免图像超出屏幕范围(Android) (libGDX)
Avoid image to go outside screen (Android) (libGDX)
我想制作一个不能超出屏幕边缘的精灵。我试过了,但我让它从边缘反弹。

但我需要停止向与图像碰撞的边缘移动。 (没有反弹)
例如:你沿对角线向bottom-right拖动,精灵与右边缘发生碰撞,仍然滑到角落。
有点像这样:

我的代码尝试(结果见第一张图片):
public class MyGdxGame extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
Sprite sprite;
float offsetX;
float offsetY;
@Override
public void create() {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
sprite = new Sprite(img);
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch);
batch.end();
/*
Bouncing sprite off the edge.
*/
if(sprite.getX() <= 0){
sprite.setX(1);
} else if( sprite.getX() + sprite.getWidth() >= Gdx.graphics.getWidth() ){
sprite.setX(Gdx.graphics.getWidth() - sprite.getWidth() - 1);
} else if(sprite.getY() <= 0){
sprite.setY(1);
} else if (sprite.getY() + sprite.getHeight() >= Gdx.graphics.getHeight()) {
sprite.setY( Gdx.graphics.getHeight() - sprite.getHeight() - 1);
}
if (Gdx.input.justTouched()) {
offsetX = Gdx.input.getX() - sprite.getX();
offsetY = Gdx.graphics.getHeight() - Gdx.input.getY() - sprite.getY();
}
if (Gdx.input.isTouched()){
sprite.setPosition(Gdx.input.getX() - offsetX, (Gdx.graphics.getHeight() - Gdx.input.getY()) - offsetY);
}
}
}
逻辑是您允许图像超出您选择的边界并渲染它然后 计算 x 位置并将其放回内部。
显然,您需要计算边界,并在此基础上,在渲染之前决定新的 X 和 Y 是什么。
您可以创建一个名为 calculatePosition 的方法,它接受用户的输入 (x,y),然后设置精灵位置。
将您的 isTouched() 编辑为
calculatePosition(Gdx.input.getX() - offsetX, (Gdx.graphics.getHeight() 0 Gdx.input.getY()) - offsetY);
然后将此添加到您的代码中:
private void calculatePosition(float x, float y) {
float minX = 0;
float maxX = Gdx.graphics.getWidth() - sprite.getWidth();
float minY = 0;
float maxY = Gdx.graphics.getHeight() - sprite.getHeight();
float newX = Math.min(maxX, Math.max(x, minX));
float newY = Math.min(maxY, Math.max(y, minY));
sprite.setPosition(newX, newY);
}
我想制作一个不能超出屏幕边缘的精灵。我试过了,但我让它从边缘反弹。
但我需要停止向与图像碰撞的边缘移动。 (没有反弹)
例如:你沿对角线向bottom-right拖动,精灵与右边缘发生碰撞,仍然滑到角落。
有点像这样:
我的代码尝试(结果见第一张图片):
public class MyGdxGame extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
Sprite sprite;
float offsetX;
float offsetY;
@Override
public void create() {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
sprite = new Sprite(img);
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
sprite.draw(batch);
batch.end();
/*
Bouncing sprite off the edge.
*/
if(sprite.getX() <= 0){
sprite.setX(1);
} else if( sprite.getX() + sprite.getWidth() >= Gdx.graphics.getWidth() ){
sprite.setX(Gdx.graphics.getWidth() - sprite.getWidth() - 1);
} else if(sprite.getY() <= 0){
sprite.setY(1);
} else if (sprite.getY() + sprite.getHeight() >= Gdx.graphics.getHeight()) {
sprite.setY( Gdx.graphics.getHeight() - sprite.getHeight() - 1);
}
if (Gdx.input.justTouched()) {
offsetX = Gdx.input.getX() - sprite.getX();
offsetY = Gdx.graphics.getHeight() - Gdx.input.getY() - sprite.getY();
}
if (Gdx.input.isTouched()){
sprite.setPosition(Gdx.input.getX() - offsetX, (Gdx.graphics.getHeight() - Gdx.input.getY()) - offsetY);
}
}
}
逻辑是您允许图像超出您选择的边界并渲染它然后 计算 x 位置并将其放回内部。
显然,您需要计算边界,并在此基础上,在渲染之前决定新的 X 和 Y 是什么。
您可以创建一个名为 calculatePosition 的方法,它接受用户的输入 (x,y),然后设置精灵位置。
将您的 isTouched() 编辑为
calculatePosition(Gdx.input.getX() - offsetX, (Gdx.graphics.getHeight() 0 Gdx.input.getY()) - offsetY);
然后将此添加到您的代码中:
private void calculatePosition(float x, float y) {
float minX = 0;
float maxX = Gdx.graphics.getWidth() - sprite.getWidth();
float minY = 0;
float maxY = Gdx.graphics.getHeight() - sprite.getHeight();
float newX = Math.min(maxX, Math.max(x, minX));
float newY = Math.min(maxY, Math.max(y, minY));
sprite.setPosition(newX, newY);
}