2016-03-24 8 views
-1

Hey Leute, ich versuche, meine Player-Klasse zu bewegen, wenn ich links oder rechts schlüge, aber nichts passiert/Ich bin neu in Java und nicht wirklich verstehen, warum es nicht funktioniert. Ich habe keine Fehler aber trotzdem passiert nichts. Danke für jede Hilfe. Auch, wenn Sie mir erklären könnten, warum es nicht funktioniert, wäre das wirklich hilfreich.Warum kann ich ein Rechteck nicht mithilfe von Navigationstasten in Java verschieben?

import java.awt.Color; 
     import java.awt.Dimension; 
     import java.awt.EventQueue; 
     import java.awt.Graphics; 
     import java.awt.Rectangle; 
     import java.awt.event.ActionEvent; 
     import java.awt.event.ActionListener; 
     import java.awt.event.ComponentAdapter; 
     import java.awt.event.ComponentEvent; 
     import java.awt.event.KeyEvent; 
     import java.awt.event.KeyListener; 
     import javax.swing.JFrame; 
     import static javax.swing.JFrame.EXIT_ON_CLOSE; 
     import javax.swing.JPanel; 
     import javax.swing.Timer; 
     import javax.swing.UIManager; 
     import javax.swing.UnsupportedLookAndFeelException; 

     public class GamePanel extends JPanel implements ActionListener, KeyListener { 

      public final static int WIDTH = 700, HEIGHT = 450; 

      public Game game; 
      public Player player; 

      public GamePanel(Game game) { 
       setBackground(Color.WHITE); 
       this.game = game; 
       addKeyListener(this); 
       setFocusable(true); 
      } 
        public void update() { 
       player.update(); 
      } 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(WIDTH, HEIGHT); 
      } 

      public void init() { 
       System.out.println("!!"); 
       player = new Player(this, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT, getHeight() - 50, getWidth()/2); 
       repaint(); 
      } 


      public void actionPerformed(ActionEvent e) { 
       update(); 
       repaint(); 
      } 

      public Player getPlayer(int playerNo) { 
       return player; 
      } 
     public void keyPressed(KeyEvent e) { 
      player.pressed(e.getKeyCode()); 
     } 

     public void keyReleased(KeyEvent e) { 
      player.released(e.getKeyCode()); 
     } 

     public void keyTyped(KeyEvent e) { 
    ; 
     } 

      @Override 
      public void paintComponent(Graphics g) { 
       super.paintComponent(g); 
       if (player != null) { 
        player.paint(g); 
       } 
      } 
     } 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Player { 

     public static final int WIDTH = 50, HEIGHT = 50; 
     public GamePanel game; 
     public int left, right; 
     public int y; 
     public int x, xa; 

     public Player(GamePanel game, int left, int right, int y, int x) { 
      this.game = game; 
      this.left = left; 
      this.right = right; 
      this.x = x; 
      y = game.getHeight() - HEIGHT; 
      x = game.getWidth()/2; 
     } 

     public void update() { 
      if (x > 0 && x < game.getWidth() - WIDTH) { 
       x += xa; 
      } else if (x == 0) { 
       x++; 
      } else if (x == game.getWidth() - WIDTH) { 
       x--; 
      } 
     } 

public void pressed(int keyCode) { 
     if (keyCode == left) 
      xa = -1; 
     else if (keyCode == right) 
      xa = 1; 
    } 

    public void released(int keyCode) { 
     if (keyCode == left || keyCode == right) 
      xa = 0; 
    } 

     public Rectangle getBounds() { 
      return new Rectangle(x, y, WIDTH, HEIGHT); 
     } 

     public void paint(Graphics g) { 
      System.out.println(x + "x" + y); 
      g.fillRect(x, y, WIDTH, HEIGHT); 
      g.setColor(Color.ORANGE); 
     } 
    } 

Antwort

0

Sie müssen nur eine repaint(); Anweisung am Ende der keyReleased() Methode hinzufügen. Unabhängig davon, ob Sie etwas tun, in dem keyTyped() oder keyPressed() Methode, der keyReleased() Methode wird immer aufgerufen, wenn Sie die Taste loslassen. Daher sollte die Programmsteuerung hier die Anweisung repaint() finden.

@Override 
public void keyReleased(KeyEvent e){ 
    player.released(e.getKeyCode()); 
    repaint(); //<--- THIS HERE 
} 

Ich hoffe, dass dies Ihr Problem lösen wird.


Bitte beachten Sie auch die Antwort von @ SasonOhanian und verbessern Sie Ihren Code.

0

Sie haben Ihr Update und neu streichen Logik in der Callback-actionPerformed während KeyPressed die Bewegung Variable für Spieler setzt. Debuggen oder drucken Sie etwas in Ihren Listener-Methoden, um zu sehen, wie die Dinge aufgerufen werden. Ich glaube nicht, dass actionPerformed und KeyPressed so genannt werden, wie Sie es erwarten.

0

Ty für alle Hilfe, aber ich musste x = x + 1 und x = x -1

machen
Verwandte Themen