2012-12-06 2 views
3

저는 Ap Computer Science의 학생이며 수업 프로젝트는 원하는 게임을 만드는 것입니다. 나는 팩맨 게임을 만들고있다. 난 아직도 전체 개념에 아주 새로운 오전, 그래서 우리는 GUI와 함께 많은 일을하지 않은, 그러나 이것은 내가 지금까지 무엇을 가지고 :팩맨 이미지 추가

import java.awt.*; 
import java.awt.event.KeyEvent; 
import java.awt.image.*; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 


public class GameHandler extends JFrame{ 


JPanel jpanel = new JPanel(); 
Graphics g; 
BufferedImage pacman; 
int frame; 
int direction; 
int x, y; 
//final int STEP = 2; If you want to change the speed at which pacman moves accross the screen; 

public void popupWindow() { 
    setSize(400, 400); 
    setResizable(false); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame = 0; 
    direction = KeyEvent.VK_LEFT; 
    x = 300; 
    y = 300; 

    try { 
     pacman = ImageIO.read(new File("pacman.png")); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 


    } 
      image(); 
} 

public void keyPressed(KeyEvent e) { 
    direction = e.getKeyCode(); 
} 


public void update() { 
    frame++; 
    if (frame > 2) { 
     frame = 0; 
    } 

    switch(direction) { 
     case KeyEvent.VK_LEFT: 
      x--; 
      break; 
     case KeyEvent.VK_RIGHT: 
      x++; 
      break; 
     case KeyEvent.VK_UP: 
      y--; 
      break; 
     case KeyEvent.VK_DOWN: 
      y++; 
      break; 
    } 
} 

public void image() { 
    super.paintComponents(g); 
    g.drawImage(pacman.getSubimage(frame*10, 0, 37, 30), x, y, null); 
} 
} 

내 문제는 내가로에 출력이 이미지를 수없는 오전입니다

Exception in thread "main" java.lang.NullPointerException 
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:70) 
at java.awt.Container.paintComponents(Container.java:1890) 
at GameHandler.image(GameHandler.java:69) 
at GameHandler.popupWindow(GameHandler.java:38) 
at Main.main(Main.java:7) 
: 화면 나는 popupWindow() 방법 방법 image()를 호출하려고 할 때이 오류가

수 (나는 g.drawImage dimensiones 내가 모든 출력하지 않고 그것을 조정할 수없는 사실로 인해 오프를하는 내 알)

다른 지점에서 이미지 메서드를 호출 해 보았습니다. 그리고 try/catch에서도 마찬가지입니다. 나는 길을 잃었다.

+0

안녕하세요, @SOuser 님, 안녕하세요. 그냥 참고하시기 바랍니다, 일반적으로 도움이되는 답변을 찾거나 문제를 해결하면 커뮤니티는 상향 회의 및/또는 "받아 들여지는"표시 (귀하의 질문 인 경우)를 높이 평가합니다. 즐겨! – Ben

답변

3
public void image() { 
    super.paintComponents(g); 
    g.drawImage(pacman.getSubimage(frame*10, 0, 37, 30), x, y, null); 
} 

g이 방법에 사용하기 위해 아직 설정되지 않는다. 귀하의 클래스는 Graphics g;을 정의하지만 어디에도 설정되어 있지 않습니다! 그래서, 당신은 묻습니다. 어떻게 설정합니까? Graphics 개체의 출처는 어디입니까?


현재 코드 기반의 빠른 대답은있을 수 :

JPanel jpanel = new JPanel(); 
Graphics g = jpanel.getGraphics(); 

을하지만이 모든 이상적인 솔루션이 아닙니다.


일반적으로이 코드 패턴 paintComponent에서 발견된다.

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(...); 
} 

당신은 어떤 JComponentpaintComponent을 대체 할 수 있습니다 (JComponent의의 서브 클래스) JPanel과 같은 : 당신이 목표로해야한다 무엇

이 같은 것입니다. 그럼, 내가 당신에게 추천하는

  • 는 해당 패널
  • 사용의 주요 JFrame의
  • 재정의 paintComponent의 콘텐츠 창으로 설정하는 JPanel의
  • 사용 JFrame.setContentPane()을 재정의하는 새 클래스를 추가입니다 패널에서 UI 변경 (JFrame의 최상위 항목 만 콘텐츠 창에있는 모든 항목)