2016-01-14 5 views
0

Я создаю игру с использованием libgdx, и я использую сцену и актеры для сущностей внутри игры. но проблема в том, что я не могу держать актера внутри сцены или экрана. когда я перетаскиваю актер в самый низкий, самый высокий, самый левый или самый большой экран, он выходит из экрана. Я хочу, чтобы он оставался внутри экрана.Как сохранить актера внутри сцены в libgdx?

Что мне делать? пожалуйста помоги.

это полоса коды я использую для перетаскивания моего актера

addListener(new DragListener(){ 

     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      camera.unproject(dimension.set(x, y, 0)); 
      System.out.println("clicked "+ x +","+y); 
      return true; 
     } 

     @Override 
     public void touchDragged(InputEvent event, float x, float y, int pointer) { 
      moveBy(x-(getWidth()/2),y-(getHeight()/3)); 
     } 

     @Override 
     public void touchUp(InputEvent event, float x, float y, int pointer, int button) { 
      super.touchUp(event, x, y, pointer, button); 
     } 
    }); 
+1

Вы можете «держите его« внутри »« Этап », поскольку« Этап »не имеет размера, насколько я помню. Также держать его внутри «Экран» как-то проблематично, подумайте о движущейся «Камере». Итак, что вы должны сделать, это определить размер мира и ограничить позицию «Актера» до такого размера. Затем вы должны создать «Камера» или даже лучше «Viewport» (это другая тема, охватываемая многими учебниками) с размером вашего мира. Теперь центрируйте «Камера», чтобы вы могли видеть именно ваш мир на «Экран». – Springrbua

+0

Подумайте о том, как держать его в пределах камеры. Зажмите положение перемещения, чтобы сохранить целевое местоположение в позиции камеры +/- camera.viewportWidth и Height. – Tenfour04

+0

, поэтому у меня есть камера и видовое окно, но как установить размер в мире? пожалуйста, помогите .. как я могу это ограничить? – ItumNgaIring

ответ

1

Stage действительно есть getWidth и getHeight методы. Они возвращают мировые размеры, управляемые внутренним Viewport. Window класс имеет необязательное поведение перетаскивания и параметр keepWithinStage.

Это фрагмент кода из LibGDX 1.8.0 (Window класс):

 public void touchDragged (InputEvent event, float x, float y, int pointer) { 
      if (!dragging) return; 
      float width = getWidth(), height = getHeight(); 
      float windowX = getX(), windowY = getY(); 

      float minWidth = getMinWidth(), maxWidth = getMaxWidth(); 
      float minHeight = getMinHeight(), maxHeight = getMaxHeight(); 
      Stage stage = getStage(); 
      boolean clampPosition = keepWithinStage && getParent() == stage.getRoot(); 

      if ((edge & MOVE) != 0) { 
       float amountX = x - startX, amountY = y - startY; 
       windowX += amountX; 
       windowY += amountY; 
      } 
      if ((edge & Align.left) != 0) { 
       float amountX = x - startX; 
       if (width - amountX < minWidth) amountX = -(minWidth - width); 
       if (clampPosition && windowX + amountX < 0) amountX = -windowX; 
       width -= amountX; 
       windowX += amountX; 
      } 
      if ((edge & Align.bottom) != 0) { 
       float amountY = y - startY; 
       if (height - amountY < minHeight) amountY = -(minHeight - height); 
       if (clampPosition && windowY + amountY < 0) amountY = -windowY; 
       height -= amountY; 
       windowY += amountY; 
      } 
      if ((edge & Align.right) != 0) { 
       float amountX = x - lastX; 
       if (width + amountX < minWidth) amountX = minWidth - width; 
       if (clampPosition && windowX + width + amountX > stage.getWidth()) amountX = stage.getWidth() - windowX - width; 
       width += amountX; 
      } 
      if ((edge & Align.top) != 0) { 
       float amountY = y - lastY; 
       if (height + amountY < minHeight) amountY = minHeight - height; 
       if (clampPosition && windowY + height + amountY > stage.getHeight()) 
        amountY = stage.getHeight() - windowY - height; 
       height += amountY; 
      } 
      lastX = x; 
      lastY = y; 
      setBounds(Math.round(windowX), Math.round(windowY), Math.round(width), Math.round(height)); 
     } 

Вы можете упростить это, зажимая X до 0 и stage.getWidth() - actor.getWidth() и делать то же самое для Y.

+0

спасибо, что пытались его использовать – ItumNgaIring

Смежные вопросы