2013-09-03 3 views
0

2 차원 사이드 스크롤러를 만들고 싶었 기 때문에 튜토리얼을 온라인으로하고있었습니다. 이 정확한 오류가 있습니다. 나는 그것을 봤지만 아무 것도 생각 나지 않았다. 나는 오타를 찾으려고 노력했다. 그리고 그것은 깨끗해 보인다, 그 does not는 나에게 오류를 코드에서 anywere하지 않고있다. 어디서부터 시작해야할지 모르겠다. 만약 당신이 내게 explaing 수있는 오류가 무엇이며 어떻게 그때 그것을 해결할 놀라운 것입니다.Main.GamePanel은 추상 클래스가 아니며 java.awt.event.KeyListener의 추상 메소드 keyReleased (java.awt.event.KeyEvent)를 오버라이드하지 않습니다.

package Main; 


import GameState.GameStateManager; 
import javax.swing.JPanel; 
import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.image.BufferedImage; 

public class GamePanel extends JPanel implements Runnable, KeyListener{ 
    public static final int WIDTH = 320; 
    public static final int HIGHT = 240; 
    public static final int SCALE = 2; 

    //game thread 

    private Thread thread; 
    private boolean running; 
    private int FPS = 60; 
    private long targetTime = 1000/FPS; 
    //image   
    private BufferedImage image; 
    private Graphics2D g; 

    //game state manager 
    private GameStateManager gsm; 




    public GamePanel(){ 
     super(); 
     setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE)); 
     setFocusable(true); 
     requestFocus(); 
    } 
    public void addNotify(){ 
     super.addNotify(); 
     if (thread == null) { 
      thread = new Thread(this); 
      addKeyListener(this); 
      thread.start(); 
     } 
    } 
    private void init() { 
     image = new BufferedImage(WIDTH, HIGHT, BufferedImage.TYPE_INT_RGB);  
     g = (Graphics2D) image.getGraphics(); 
     running = true; 
     gsm = new GameStateManager(); 

    } 

     public void run(){ 
     init(); 
     long start, elapsed, wait; 

     //game loop 
      while(running) { 

      start = System.nanoTime(); 
      update(); 
      draw(); 
      drawToScreen(); 
       elapsed = System.nanoTime() - start; 

       wait = targetTime - elapsed/1000000; 

       try 
       { 
        Thread.sleep(wait); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       }//end of try catch 
      } 







     } 
     private void update() 
     { 
      gsm.update(); 
     } 
     private void draw() 
     { 
      gsm.draw(g); 
     } 
     private void drawToScreen() 
     { 
      Graphics g2 = getGraphics(); 
      g2.drawImage(image, 0, 0, null); 
      g2.dispose(); 


     } 




     public void KeyPressed(KeyEvent key) 
     { 
     gsm.keyPressed(key.getKeyCode()); 
     } 
     public void KeyReleased(KeyEvent key) 
     { 
     gsm.keyReleased(key.getKeyCode()); 
     } 




    } 
+1

[주요 수신기를 작성하는 방법] (http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html), [인터페이스 및 상속] (http : // docs. oracle.com/javase/tutorial/java/IandI/index.html) 및 [키 바인딩] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)을 참조하십시오. 다음 번 문제에 직면하게됩니다. – MadProgrammer

+1

또한 객체 디자인 원칙, [Single Responsability Principle] (http://www.oodesign.com/single-responsibility-principle.html)에 대해 배우게 될 것이며, GamePanel 클래스는 한 가지, keyListener 또는 Runnable이 아니라 JPanel이 될 수 있습니다. – nachokk

답변

0

KeyReleased(KeyEvent key) 방법은 keyReleased(KeyEvent key)과 같이 작은 문자 'k'로 시작해야합니다. Java는 대소 문자를 구분합니다.

다른 방법으로 KeyListener 인터페이스를 재정의해야 할 수도 있습니다.

수퍼 메서드를 재정의하려면 @Override 주석 (@Hovercraft Full Of Eels)을 메소드에 추가하십시오. 그렇게하면 IDE가 코딩하는 동안 당신에게 힌트를 줄 것이다.

3

컴파일러 오류 메시지가 뭐가 잘못 됐는지 당신에게 정확히를 알려줍니다 : 클래스는 모든 KeyListener 인터페이스를 구현하지만, 인터페이스의 모든 필요한 방법을 구현하지 않습니다. 솔루션 : KeyListener API에 따라 필요한 모든 메서드를 구현해야합니다. 또한 대체가 올바른지 확인하려면 @Override 주석을 사용해야합니다.

아니요 스윙 응용 프로그램에서 대부분의 키보드 입력에 KeyListeners를 사용하고 저수준 리스너이기 때문에 KeyListeners를 사용하여 다음과 같은 상위 레벨 구조를 피하는 것이 좋습니다. key bindings. 또한, Swing GUI는 AWT 구조체의 더 많은 부분 인 것처럼 update(...) 메소드 대체를 사용하지 않아야합니다.

관련 문제