2017-09-03 1 views
-2

Ich bin neu im Programmieren, also spiele ich nur mit einem unendlichen Läuferspiel, das ich gerne machen würde. Ich habe mein Charakterbild hinzugefügt und einen beweglichen Block, den er zu überwinden versucht. Momentan habe ich es so, dass wenn der Charakter mit dem Block kollidiert, seine Geschwindigkeit 0 ist, damit er sich nicht durch das Objekt bewegen kann. Aber mein KeyListener überschreibt dies. Sobald der Block den Charakter trifft, stoppt er für 1 Spielschritt, aber dann erhöht der KeyListener seine Geschwindigkeit, wenn Sie die Taste gedrückt halten und er sich gerade durch den Block bewegt. Ich kann nicht herausfinden, wie ich das beheben kann.Ein sich bewegendes Objekt einschränken

Hier ist meine Spielerklasse, die sowohl die Spielerbewegung als auch die Einschränkungen behandelt.

package runner; 

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class Player implements KeyListener { 

public static int playerX = 35; 
public static int playerY = 285; 
public static int playerWidth = 100; 
public static int playerHeight = 100; 
public static int playerVX, playerVY; 

public static void update() { 
    playerX += playerVX; 
    playerY += playerVY; 

    constrain(); 
} 

public static void paint(Graphics g) { 
    //g.setColor(Color.white); 
    //g.fillRect(playerX, playerY, 100,100); 
} 

public static void constrain() { 
    if (playerX + playerWidth >= Obstacle.getX() && playerX <= 
Obstacle.getX() + Obstacle.width && playerY + playerHeight >= 
Obstacle.getY()) { 
     playerX = 0; 
    } 
} 

@Override 
public void keyTyped(KeyEvent e) { 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_LEFT) { 
     playerVX = -5; 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     playerVX = 5; 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     playerVY = -5; 
    } 
    if(keyCode == KeyEvent.VK_DOWN) { 
     playerVY = 5; 
    } 
} 

@Override 
public void keyReleased(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_LEFT) { 
     playerVX = 0; 
    } 
    if(keyCode == KeyEvent.VK_RIGHT) { 
     playerVX = 0; 
    } 
    if(keyCode == KeyEvent.VK_UP) { 
     playerVY = 0; 
    } 
    if(keyCode == KeyEvent.VK_DOWN) { 
     playerVY = 0; 
    } 
} 
} 

Vielen Dank!

+2

Sorry, so funktioniert StackOverflow nicht. Fragen der Form _ "Hier ist ein Haufen von meinem Code, es funktioniert nicht, kann jemand mir helfen, es herauszufinden" _ sind als Off-Topic. Bitte besuche [help] und lies [ask] für weitere Informationen, und lese besonders [Warum ist "Kann mir jemand helfen?" Keine wirkliche Frage?] (Http://meta.stackoverflow.com/q/284236/18157). Haben Sie in Ihrem Code Haltepunkte platziert, um zu sehen, was tatsächlich passiert? –

+0

Ich dachte, da ich nur etwas Kleines vermisse, wäre diese Frage angebracht. Ich habe Haltepunkte in meinen Code eingefügt. Sobald der Charakter mit dem Block kollidiert, wird die Velocity auf 0 gesetzt, aber beim nächsten Spiel-Tick können Sie den KeyListener verwenden, um die Geschwindigkeit zu erhöhen, die den Charakter durch den Block schickt – CoderKlipto

+0

Nun, wissen Sie, was passiert, ändern Sie Ihren Code, um das zu verhindern passiert, indem Sie den Schlüssel-Listener einchecken, wenn es möglich ist, sich in der ausgewählten Richtung zu bewegen. –

Antwort

0

Ich arbeite gerade an einem Spiel und hatte die gleichen Probleme (ich bin auch neu in der Spieleprogrammierung). Ich habe mir ein paar Methoden ausgedacht, um mit Kollisionen umzugehen.

Diese Methode würde in Ihrem Player Klasse gehen:

public void applyBound(Bound bound) { 
    if (bound.x1 != null) { 
     if (x <= bound.x1) { 
      x = bound.x1; 
     } 
    } 
    if (bound.x2 != null) { 
     if (x >= bound.x2 - width) { 
      x = bound.x2 - width; 
     } 
    } 
    if (bound.y1 != null) { 
     if (y <= bound.y1) { 
      y = bound.y1; 
     } 
    } 
    if (bound.y2 != null) { 
     if (y >= (bound.y2 - height)) { 
      y = bound.y2 - height; 
     } 
    } 
} 

Wo gebunden ist:

public class Bound { 
    public Integer x1, x2, y1, y2; 

    public Bound(int x1, int x2, int y1, int y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 

    public Bound(Integer x1, Integer x2, Integer y1, Integer y2) { 
     this.x1 = x1; 
     this.x2 = x2; 
     this.y1 = y1; 
     this.y2 = y2; 
    } 
} 

"applyBound (boxBounds)" das letzte, was genannt jedes Mal sein würden Sie Ihren Player aktualisieren.

  • "Bound.x1" ist die linke Position, die der Spieler gehen kann.
  • "Bound.x2" ist das am weitesten rechts stehende Position
  • "Bound.y1" ist die Position unten und
  • "Bound.y2" ist die oberste Position

Bounds null sein kann, Sie brauchen also keine Obergrenze.

In der Bound-Klasse können Sie beispielsweise die Grenzen des Bildschirms festlegen, sodass der Player nicht ausgeschaltet werden kann oder Sie die Ränder eines anderen Zeichens einfügen können.

Sie müssen eine Variable verwenden, um festzustellen, ob die Taste gedrückt ist oder nicht, und die Geschwindigkeit in der Aktualisierungsmethode hinzufügen.

Hoffe, das hilft!

Verwandte Themen