我有一个设置了一个拖动侦听器的Actor:
ballActor.addListener(new DragListener() {
public void drag(InputEvent event, float x, float y, int pointer) {
ballActor.moveBy(x - ballActor.getWidth() / 2, y - ballActor.getHeight() / 2);
}
});
此演员被添加到舞台:
W = Gdx.graphics.getWidth();
H = Gdx.graphics.getHeight();
camera = new OrthographicCamera(W / RATE, H / RATE);
stage = new Stage(new ScreenViewport(camera));
stage.addActor(ballActor);
Gdx.input.setInputProcessor(stage);
现在,如果我使用1:1的米到像素比率,拖动效果非常好,但如果我使用另一个比例,例如1:160,则拖动事件不会触发。
在调整大小方法中,我更新相机:
camera.viewportHeight = H/RATE;
camera.viewportWidth = W/RATE;
camera.position.set(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
camera.update();
我读到如果我使用舞台,我不必从屏幕坐标转换到相机坐标。演员设置了位置,宽度,高度和界限。我做错了什么?
更新:
以下是代码:
public class Pendulum extends ApplicationAdapter {
private Stage stage;
public static final float RATE = 160f; //with 1f..20f drag works
float W;
float H;
@Override
public void create() {
W = Gdx.graphics.getWidth() / RATE;
H = Gdx.graphics.getHeight() / RATE;
Texture ballTexture = new Texture(Gdx.files.internal("ball.png"), true);
ballTexture.setFilter(Texture.TextureFilter.MipMapLinearNearest, Texture.TextureFilter.Linear);
TextureRegion ballRegion = new TextureRegion(ballTexture);
final Image image = new Image(ballRegion);
image.setSize(image.getWidth()/RATE, image.getHeight()/RATE);
image.setPosition(0f, 0f);
image.addListener(new DragListener() {
public void drag(InputEvent event, float x, float y, int pointer) {
Gdx.app.log("LOG", "DRAG IMAGE");
image.moveBy(x - image.getWidth() / 2, y - image.getHeight() / 2);
}
});
image.debug();
image.setBounds(image.getX(), image.getY(), image.getWidth(), image.getHeight());
stage = new Stage(new FitViewport(W, H));
stage.addActor(image);
Gdx.input.setInputProcessor(stage);
}
@Override
public void resize(int width, int height) {
stage.getViewport().update(width, height, true);
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
float delta = Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f);
stage.act(delta);
stage.draw();
}
@Override
public void dispose() {
stage.dispose();
}
}
我需要让RATE大于100f因为Image actor附加了Box2D Body。请参阅here why。
答案 0 :(得分:0)
使用scene2d时,必须使用Viewport,Viewport管理其摄像头的大小。当您在相机上设置显式尺寸时,舞台将会混淆,因为它假定视口正在管理相机(现在相机的世界坐标与视口的屏幕尺寸之间存在不匹配)。
我不确定你是如何计算RATE
的,但你应该做的是使用ExtendViewport或FitViewport。在resize()
方法中,您需要在视口上调用update()
,而不是修改相机。
答案 1 :(得分:0)
当我看到你的更新时,我看到你增加/减少了演员的大小,同时增加/减小了视口的大小。
执行以下操作:为视口提供固定的宽度/高度,这就是它的用途
如果要使用视口,则需要了解以下内容:
如果您有一个20 * 20的视口,那么您的整个屏幕的大小将为“20x20”。
这只是“虚构的” - 魔术
如果你想获得一个非常小的Object(对于box2d)而不是你需要使用一个小视口。
那我们现在该怎么办? 我们希望屏幕显示我们游戏的20个单位。
所以我们说新的视口(20,20)..
我们现在所做的是,我们将1280/800“映射”到20/20。
所以,现在我们可以显示我们的图像了。 我们做什么?我们有一个160的meterToPixel比率。 我们有600x600图像(宽度,高度) 现在我们计算我们的比率(600/160)= 3,75 现在,图像将填满你屏幕的3/20。
我们的屏幕是20x20,我们的图像是3,75。
简短回答:为视口提供固定大小(要查看多少Box2d单位(米)),而不是计算出的大小)并向视口或现有
OrthographicCamera cam = new OrthographicCamera();
cam.setToOrtho(false, 20,20);
Stage.setViewport(new FitViewport(20,20,cam));