2017-11-12 2 views
4

"간단한 tetras"게임을 시작 코더로 사용하려고합니다. 아래에 표시된 코드와 같이 흰색 블록은 화살표 키를 눌러 움직일 수 있지만 타이머에서는 (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); 
     } 
    } 
관련 문제