2013-07-21 3 views
0

이것은 아마도 바보 같은 질문이 될 것입니다. 그러나 저는 초심자이므로 제 영혼에 자비를 베푸고 있습니다. :) 내 문제는 내가 모든 게임을 표시하는 IFrame 인 게임 페이지라는 클래스가 있다는 것입니다.그래픽 드로잉 이미지 주사위 놀이 게임

public void paintComponent(Graphics page) 
{ 
    super.paintComponent(page); 
    page.drawImage(image, 0, 0, null); 
} 

이미지 보드의 이미지입니다 내가 이런 식으로 그것을 얻을 :

image = ImageIO.read(new File("pics/board.png")); 

그 안에 은 내가 잘 사용 자체를 페인트 보드의 그림을 포함 보드라는 클래스를 가지고 좋아, 괜찮아. 보드 내부에는 "슬롯"유형의 2 차원 배열이 있는데, 슬롯은 내가 쓴 다른 클래스입니다. WhitePiece의 스택 또는 Stack of BlackPiece 이 클래스는 보드에 검정색 또는 흰색 조각을 나타내는 클래스입니다.

그래서 보드 클래스에는 주사위 놀이의 시작 위치로 배열하여 모든 슬롯을 국한시키는 방법 인 리셋 보드가 있습니다.

검은 색과 흰색 조각이 다음과 같은 형식의 이미지를 가지고 있습니다. pic = ImageIO.read (새 파일 ("pics/whitePiece.png")));

이제는 내부 리셋 보드에서 Slot 클래스의 drawSlot 메서드를 호출 할 때 생각이 나쁘다. 나는 이것을 다음과 같이 부른다. 처음으로 drawBoard를 호출한다 : drawBoard (board);

는 여기에 drawBoard입니다 :

public void drawBoard(Slot[][] board) throws IOException{ 
    for(int i=0;i<2;i++){ 
    for(int j=0;j<12;j++){ 
     board[i][j].drawSlot(getGraphics()); 
    } 
    } 
    } 

을 여기에 problemtic 방법 : drawSlot :

public void drawSlot(Graphics g) throws IOException{  
    if(type == SlotType.empty){ 
     System.out.println("no type selected slot is empty Slot Number"+slotNumber); 
    }else 
     if(type == SlotType.white){ 
     if(!wPieces.isEmpty()){ 
     Image pic = wPieces.pop().getPic(); 
     wPieces.push(new WhitePiece()); 
     if(slotNumber <= 11){ 
      for(int i=0;i<piecesAmount;i++){ 
      g.drawImage(pic, 5, i*30, null); 
      } 
     } 
     else{ 
      for(int i=0;i<piecesAmount;i++){ 
       g.drawImage(pic, 5,300-(i*30), null); 
      } 
     } 
     }else{ 
      System.out.println("Slot Stack is Empty Slot #"+slotNumber); 
     } 
     }else 
     { 
      if(!bPieces.isEmpty()){ 
      Image pic = bPieces.pop().getPic(); 
      bPieces.push(new BlackPiece()); 
      if(slotNumber<=11){ 
      for(int i=0;i<piecesAmount;i++){ 
       g.drawImage(pic, 5, i*30, 30, 30, null); 
      } 
      }else{ 
       for(int i=0;i<piecesAmount;i++){ 
        g.drawImage(pic, 5, 300-(i*30), 30, 30, null); 
       } 
      } 
    } 
      else{ 
     System.out.println("Slot Stack is empty Slot #"+slotNumber); 
    } 
} 

} 

여기에 내가 얻을 eror입니다 : (내가 그것을 내가 얻을 방법을 나타냅니다 생각 pic is not good.)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at Try1.Slot.drawSlot(Slot.java:122) 
at Try1.Board.drawBoard(Board.java:128) 
at Try1.Board.resetBoard(Board.java:122) 
at Try1.GamePage.<init>(GamePage.java:98) 
at Try1.StartPage.startGame(StartPage.java:67) 
at Try1.StartPage$eventHandler.actionPerformed(StartPage.java:49) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$200(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

내가 뭘 잘못했는지 알고 싶다. 감사합니다 모두 나는 그것의 긴 게시물을 알고 당신은 정말로 그것에 들어가야 만합니다 하지만 나는 초보자이며 도움이 필요합니다 :).

+2

1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 문장의 시작 부분에 대문자를 추가하십시오. 또한 I라는 단어에는 대문자를 사용하고 JEE 또는 WAR와 같은 약어 및 머리 글자를 사용하십시오. 이것은 사람들이 이해하고 돕는 것을 더 쉽게 만듭니다. 3) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다. 4) 이미 언급했듯이 컴포넌트에서 getGraphics()를 호출하지 마십시오. 5) 모든 이미지 그리기를 위해'g.drawImage (pic, 5, i * 30, null);을'g.drawImage (pic, 5, i * 30, this);로 변경하십시오. –

답변

4

스윙 구성 요소에는 getGraphics()을 사용하지 마십시오. 슬롯을 paintComponent()에 그립니다.

public void paintComponent(Graphics page) { 
    super.paintComponent(page); 
    page.drawImage(image, 0, 0, null); 
    drawBoard(page, board); 
} 

그리고 drawBoard을 수정() 전달 된 그래픽 객체를 사용하는 :

public void drawBoard(Graphics g, Slot[][] board) { 
    for(int i=0;i<2;i++) { 
     for(int j=0;j<12;j++){ 
      board[i][j].drawSlot(g); 
     } 
    } 
} 

을 그리고 그 때 보드 변경 repaint()를 호출합니다.

+0

감사합니다. 나는 이것을 시도하고 그 결과로 돌아갈 것입니다. –

+0

@GiladBenYe 'drawBoard()'에 그래픽을 제대로 전달하기위한 대답이 약간 업데이트되었습니다. – kiheru

+0

내 앱에서 좋은 점이 더 많이 나타나기 시작했습니다. 아직 위치 지정을해야합니다. –