2016-06-06 13 views
0

У меня есть актер, который установил сопротивление слушатель: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.

ответ

0

При использовании scene2d вы должны использовать Viewport, а Viewport управляет размером своей камеры. Когда вы устанавливаете явные размеры на камере, Stage будет запутан, потому что предполагается, что Viewport управляет камерой (теперь существует несоответствие между мировыми координатами камеры и размером экрана в окне просмотра).

Я не уверен, как вы рассчитали RATE, но то, что вы, вероятно, должны делать, это использовать ExtendViewport или FitViewport. И в вашем методе resize() вместо изменения камеры вам нужно позвонить update() в своем окне просмотра.

+0

Сейчас у меня есть 'этап = новый этап (новый FitViewport (Вт/СКОРОСТЬ, Н/RATE));' 'и в resize',' stage.getViewport() обновление ((INT) (ширина./RATE), (int) (height/RATE), true); '. 'RATE = 160f;' является константой, которую я использую для масштабирования мира для корректной работы box2d phisyc. Если я не уменьшу масштаб мира ('RATE = 1f'), объекты двигаются очень медленно, и если я уменьшу масштаб, то стрельба не стреляет. – Jorj

+0

Являются ли константы W и H, или размер текущего экрана? Вы должны передавать константы только в конструктор Viewport. В противном случае вы в настоящее время разрабатываете свою игру только для работы с размером экрана, на котором вы его разрабатываете. Например, вы можете захотеть, чтобы на вашем экране отображалось 8 м мира Box2d по вертикали, поэтому вы должны использовать 'new ExtendViewport (8, 8)'. Затем в 'resize' вызывать' viewport.update (width, height) 'с фактическими размерами экрана. Теперь ваша игра будет 8 box2d метров в высоту на каждом устройстве. – Tenfour04

+0

Размер экрана: 'W = Gdx.graphics.getWidth()'. [Здесь] (https://gist.github.com/costinpapuc/5f13cd22c8274151b7cf8bd74af4e631) - полный код. Если вы можете взглянуть, я по достоинству оценят – Jorj

0

Как я увидел ваше обновление, я видел, что вы увеличиваете/уменьшаете размер своего актера, одновременно увеличивая/уменьшая размер своего окна просмотра.

Выполните следующие действия: дайте вашему Viewport фиксированную ширину/высоту, для чего он нужен.
Если вы хотите использовать окно просмотра, вам необходимо понять следующее:
, если у вас есть окно просмотра 20 * 20, чем ваш экран WHOLE будет иметь размер «20x20».

Это просто «мнимое» - Magic

Если вы хотите, чтобы получить довольно небольшой объект (Box2D), чем вам нужно использовать небольшое окно просмотра.

Итак, что нам теперь делать? Мы хотим, чтобы на экране показывались 20 единиц нашей игры.

Поэтому мы говорим, новый Viewport (20, 20) ..

Что мы делаем сейчас, мы "карту" нашего 1280/800 к 20/20.

так, теперь мы можем отобразить наше изображение. Что нам делать? у нас есть метрТопиксельный коэффициент от 160. У нас есть 600x600 Изображение (ширина, высота) Теперь мы рассчитаем наше соотношение к этому (600/160) = 3,75.
И ТЕПЕРЬ Изображение заполнит 3/20 вашего экрана.

наш экран 20x20 и наше изображение 3,75.

Короткий ответ: Дайте VIEWPORT фиксированный размер (сколько Box2D (метры)) вы хотите видеть, а не расчетный размер) и добавить новый кулачок к иллюминатору, или существующего.

OrthographicCamera cam = new OrthographicCamera(); 
cam.setToOrtho(false, 20,20); 
Stage.setViewport(new FitViewport(20,20,cam)); 
+0

Возможно, я немой, но это не то, что я делаю? Я установил фиксированный размер 'stage = new Stage (новый FitViewport (20f, 20f));' но все равно не работает. – Jorj

+0

Теперь ваше окно просмотра в порядке по размеру box2d. Ваше изображение - ваша проблема. Насколько велик он на старте, и насколько велика его после того, как вы установили ставку? Вторая проблема, я думаю, это ваш видовой экран, попробуйте дать ему камеру в конструкторе с одинаковой шириной высоты (новая орфографическая камера (false, 20,20) – Keey

+0

400x320 до и 2.5x2 после – Jorj