2017-11-12 6 views
4

私は、最初のコーダーとして「シンプル・テトラ」ゲームを作ろうとしています。下のコードのように、白いブロックは、矢印キーを押して移動し、タイマー内で(y = y + 10)を実行できません。私の推測は、ActionListenerが間違った位置に置かれていることです。私がしたいのは、ブロックが降りるとブロックを左右に動かすことだけです。ActionListenerの使い方は?

ここに私のコードです:

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

答えて

3

コードの主な問題はなかった

  1. タイマーがブロックした後、コールtm.start()
  2. で開始する必要があることを、「下がる」、それは再描画する必要があります。ここで

は、クラスの作業例です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); 
     } 
    } 
関連する問題