2017-11-12 17 views
4

Ich versuche ein "simple tetras" Spiel als Anfänger-Programmierer zu machen. Wie im folgenden Code gezeigt, kann sich der weiße Block durch Drücken der Pfeiltasten bewegen, während er innerhalb des Timers nicht ausgeführt wird (y = y + 10). Meine Vermutung ist, dass der ActionListener in die falsche Position gebracht wird. Ich möchte nur den Block nach links und rechts bewegen, wenn er nach unten geht.Wie funktioniert der ActionListener richtig?

Hier ist mein Code:

import java.awt.event.*; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Experiment extends JFrame { 
    int x = 100; 
    int y = 100; 
    ASD exp = new ASD(); 

    public Experiment() { 
     add(exp); 
     exp.setFocusable(true); 
    } 

    public class ASD extends JPanel { 
     public ASD() { 
      addKeyListener(new KeyAdapter() { 
       public void keyPressed(KeyEvent e) { 
        switch (e.getKeyCode()) { 
         //case KeyEvent.VK_DOWN: y += 10;break; 
         //case KeyEvent.VK_UP: y -= 10; break; 
         case KeyEvent.VK_LEFT: 
          x -= 10; 
          break; 
         case KeyEvent.VK_RIGHT: 
          x += 10; 
          break; 
        } 
        repaint(); 
       } 
      }); 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      setBackground(Color.BLACK); 

      g.setColor(Color.WHITE); 
      g.fillRect(x, y, 30, 30); 
     } 

     public class Movement extends JPanel implements ActionListener { 
      Timer tm = new Timer(5, this); 

      public void actionPerformed(ActionEvent e) { 
       y = y + 10; 
       repaint(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     Experiment frame = new Experiment(); 
     frame.setTitle("ASD"); 
     frame.setSize(600, 400); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

Antwort

3

Die Hauptprobleme mit dem Code waren, dass

  1. Der Timer mit dem Aufruf tm.start()
  2. Nach dem Block gestartet werden muss "fällt", es muss neu gestrichen werden.

Hier ist ein funktionierendes Beispiel der Klasse ASD

public class ASD extends JPanel implements ActionListener { 

     private Timer tm; 

     public ASD() { 
      addKeyListener(new KeyAdapter() { 
       public void keyPressed(KeyEvent e) { 
        switch (e.getKeyCode()) { 
         //case KeyEvent.VK_DOWN: y += 10;break; 
         //case KeyEvent.VK_UP: y -= 10; break; 
         case KeyEvent.VK_LEFT: 
          x -= 10; 
          break; 
         case KeyEvent.VK_RIGHT: 
          x += 10; 
          break; 
        } 
        repaint(); 
       } 
      }); 

      tm = new Timer(200, this); 
      tm.setRepeats(true); 
      tm.start(); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      y = y + 10; 
      repaint(); 
     } 

     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      setBackground(Color.BLACK); 

      g.setColor(Color.WHITE); 
      g.fillRect(x, y, 30, 30); 
     } 
    }