У меня есть актер, который установил сопротивление слушатель:LibGDX перетащить слушатель на небольших Актер
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();
Я прочитал, что если я использую сцену я не должен переводить с экрана координат в координаты камеры. Актер установил положение, ширину, высоту, а также границы. Что я делаю не так?
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, потому что изображение актер прилагается Box2D тела. См. here.
Сейчас у меня есть 'этап = новый этап (новый FitViewport (Вт/СКОРОСТЬ, Н/RATE));' 'и в resize',' stage.getViewport() обновление ((INT) (ширина./RATE), (int) (height/RATE), true); '. 'RATE = 160f;' является константой, которую я использую для масштабирования мира для корректной работы box2d phisyc. Если я не уменьшу масштаб мира ('RATE = 1f'), объекты двигаются очень медленно, и если я уменьшу масштаб, то стрельба не стреляет. – Jorj
Являются ли константы W и H, или размер текущего экрана? Вы должны передавать константы только в конструктор Viewport. В противном случае вы в настоящее время разрабатываете свою игру только для работы с размером экрана, на котором вы его разрабатываете. Например, вы можете захотеть, чтобы на вашем экране отображалось 8 м мира Box2d по вертикали, поэтому вы должны использовать 'new ExtendViewport (8, 8)'. Затем в 'resize' вызывать' viewport.update (width, height) 'с фактическими размерами экрана. Теперь ваша игра будет 8 box2d метров в высоту на каждом устройстве. – Tenfour04
Размер экрана: 'W = Gdx.graphics.getWidth()'. [Здесь] (https://gist.github.com/costinpapuc/5f13cd22c8274151b7cf8bd74af4e631) - полный код. Если вы можете взглянуть, я по достоинству оценят – Jorj