2016-05-23 7 views
0

Um meine Java-Kenntnisse zu üben, habe ich ein einfaches Snake-Spiel entwickelt. Mit Java verwende ich LibGDX und Scene2d, um alle meine Objekte zu behandeln.Szene 2D Trennung von Ansichtsfensterkoordinaten und Spielkoordinaten

Im Moment sind die Grenzen des Snake-Spiels auf die Ansichtsfenster-Dimensionen festgelegt. Kollisionen werden überprüft, wenn die Schlange die Außenseite des Ansichtsfensters erreicht. Ich verwende ein Bildschirm-Ansichtsfenster, das wie unten dargestellt in die Bühne integriert ist.

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(); 
} 

Kollisionsprüfung Code:

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(); 
      } 
     } 
    } 
} 

Das große Problem dabei ist, dass die Spielmechanik stark von der Größe des Bildschirms betroffen ist. Was ich möchte, ist ein virtueller Bereich, in dem sich die Schlange bewegt (fast wie ihr eigenes Koordinatensystem), der vom Ansichtsfenster getrennt ist. Was das Viewport betrifft, würde ich lieber ein Bildschirm-Viewport bleiben, wenn möglich. Was wäre der beste Weg, dies zu tun?

Antwort

1

ScreenViewport ist nicht gut hier, weil Ihr Spiel zum Beispiel auf dem Bildschirm von smaprtphone gut aussehen würde, wenn es ein kleines Polygon in der Mitte des Tablet's wäre. Sie sollten eher in Betracht ziehen, FitViewport zu verwenden, die Ihrem Bildschirm einen Balken hinzufügen, aber es ermöglichen wird, die gleiche Arena-Größe für jedes Gerät beizubehalten.

zu definieren, welche Auflösung der virtuellen Bildschirm es nur in den Konstruktor übergeben haben sollte, das Ansichtsfenster

private FitViewport viewport; 

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

dann in Sie müssen auch die resize() Methode überschreiben, um Ihre Ansichtsfenster aktualisierbar

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

auch machen Ihre render() Methode müssen Sie Ansichtsfenster rechts vor dem Rendern der Bühne

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

Nachdem all dies statt gameStage.getWidth() können Sie einfach Ihre individuelle SCREEN_WIDTH_IN_PX

+0

Dank nutzen! Ich nahm deinen Rat und ging mit dem angepassten Ansichtsfenster –