2016-05-23 2 views
0

Чтобы практиковать свои навыки Java, я разрабатывал базовую игру Snake. С помощью java я использую LibGDX и Scene2d для обработки всех моих объектов.Сцена 2D Разделение с координатами и координатами игры

Прямо сейчас, границы игры змеи устанавливаются в размеры видового экрана. Столкновения проверяются всякий раз, когда змея достигает внешней части окна просмотра. Я использую окно просмотра экрана, которое включено в Сцена, как показано ниже.

private AudioSnake gameCore; 
private Stage gameStage; 
private Image background; 
private Image snakeTip; 
private Image food; 
private ArrayList<Image> snakeTail = new ArrayList <Image>(); // all the snake tail bits 
private ScreenViewport viewport; 

public GameScreen(AudioSnake audioSnake) { 
    gameCore = audioSnake; 
    viewport = new ScreenViewport(); 
    gameStage = new Stage(viewport); 
    Gdx.input.setInputProcessor(gameStage); 
    uiSkin = new Skin(Gdx.files.internal("Ui/uiskin.json")); 
    scoreLabel = new Label(String.format("%.0f",score),uiSkin); 
    generateUi(); 
    generateFood(); 
} 

Collision Код проверки:

public void collisionCheck(){ // method that checks rather the snake head is touching outside the border, or inside it's own body 
    if(snakeTip.getX() >= gameStage.getWidth() || snakeTip.getY() >= gameStage.getHeight() || snakeTip.getX() <= 0 || snakeTip.getY() <= 0){ 
     System.out.println("death activated"); 
     activateDeath(); 
    } 
    else{ 
     for(int i = 0; i < snakeTail.size(); i++){ 
      if(snakeTip.getX() == snakeTail.get(i).getX() && snakeTip.getY() == snakeTail.get(i).getY()){ 
       System.out.println("death activated"); 
       activateDeath(); 
      } 
     } 
    } 
} 

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

ответ

1

ScreenViewport не очень хорошо, потому что ваша игра будет выглядеть, например, на экране smaprtphone, когда это будет маленький полигон в центре планшета. Вы должны рассмотреть возможность использования FitViewport, который добавит бары на ваш экран, но позволит сохранить одинаковый размер арены для каждого устройства.

Чтобы определить, какое разрешение вашего виртуального экрана должен просто передать его в конструктор окна просмотра

private FitViewport viewport; 

    public GameScreen(AudioSnake audioSnake) { 
     gameCore = audioSnake; 
     viewport = new ScreenViewport(SCREEN_WIDTH_IN_PX, SCREEN_HEIGHT_IN_PX); 
     gameStage = new Stage(viewport); 

Вам также необходимо переписать метод resize(), чтобы сделать ваше окно просмотра обновляемым

@Override 
    public void resize(int width, int height) { 
     viewport.update(width, height); 
    } 

Кроме того, в ваш метод render(), вам необходимо применить окно просмотра прямо перед визуализацией этапа

viewport.apply(); 
    stage.act(delta); 
    stage.draw(); 

После всего этого вместо gameStage.getWidth() вы можете использовать только ваш обычай SCREEN_WIDTH_IN_PX

+0

Спасибо! Я принял ваш совет и пошел с подходящим видовым экраном –

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