2013-07-26 3 views
0

메신저 기본 우주 침략자 게임을 만들고있어. 나는 LWJGL .zip 파일 (LWJGL 라이브러리를 사용하지 않고 내 게임을 만들었고 그저 그림을 얻었습니다.)에서 모든 리소스를 얻었습니다. 어쨌든 키보드의 "space"를 누를 때마다 KeyListener가 새로운 내 함선이 총에 맞았다. 그러나, 글 머리 기호 이미지를 그리는 방법을 모릅니다. 내 KeyListener가 그래픽 개체를 전달하지 않고 이미지를 그릴 필요가 있기 때문입니다. 문제를 일으키는 코드는 "Shot"생성자의 "drawImage"메서드입니다. Heres는 내 코드 :Java에서 그래픽 객체를 얻으려면 어떻게해야합니까?

public class KeyTyped{ 

    public void keyESC(){ 
     Screen.isRunning = false; 
    } 

    public void keyLEFT() { 
     Screen.shipPosX -= 10; 

    } 

    public void keyRIGHT() { 
     Screen.shipPosX += 10; 

    } 
    //This is automatically called from my KeyListener whenever i 
    //press the spacebar 
    public void keySPACE(){ 
     if(!spacePressed){ 
      ShotHandler.scheduleNewShot(); 
     }else{ 
      return; 
     } 
    } 


} 

공용 클래스 ShotHandler {

public static int shotX = Screen.shipPosX; 
public static int shotY = Screen.shipPosY + 25; 




public static void scheduleNewShot() { 
    //All this does is set a boolean to 'false', not allowing you to fire any more shots until a second has passed. 
    new ShotScheduler(1); 


    new Shot(25); 
} 

}

공용 클래스 샷 ShotHandler {

public Shot(int par1){ 

    //This is my own method to draw a image. The first parameter is the graphics object that i need to draw. 
    GUI.drawImage(*????????*, "res/spaceinvaders/shot.gif", ShotHandler.shotX, ShotHandler.shotY); 

} 
      //Dont worry about this, i was just testing something 
    for(int i = 0; i <= par1; i++){ 
     ShotHandler.shotY++; 
    } 
} 

}

고마워 확장! 어떤 도움을 주시면 감사하겠습니다!

답변

1

"총알"의 위치를 ​​어딘가에 저장 한 다음 paintComponent(Graphics g) 방법으로 해당 상태에 액세스해야합니다. 실제로, 이것은 꽤 많이 고려되어야합니다. 이처럼 Shot 클래스 보면 뭔가 확인 :

public class Shot { 
    private Point location; // Could be Point2D or whatever class you need 

    public Shot(Point initLocation) { 
     this.location = initLocation; 
    } 

    // Add getter and setter for location 

    public void draw(Graphics g) { 
     // put your drawing code here, based on location 
    } 
} 

그런 다음 키를 누르면 방법,

public void keySPACE(){ 
    // Add a new shot to a list or variable somewhere 
    // WARNING: You're getting into multithreading territory. 
    // You may want to use a synchronized list. 
    yourJPanelVar.repaint(); 
} 

을 그리고 당신은 JPanel를 확장하고 paintComponent을 무시할 수 있습니다.

public class GameScreen extends JPanel { 
    public paintComponent(Graphics g) { 
     for (shot : yourListOfShots) { 
      shot.draw(g); 
     } 
     // And draw your ship and whatever else you need 
    } 
} 

기본 아이디어입니다. 희망이 지금 어떤 의미가 있습니다. Shot의 드로잉 코드를 다른 곳으로 옮길 수는 있지만 간단히하기 위해 방금 Shot 클래스에 붙어 있습니다.

위의 내용은 꽤 복잡한 코드입니다. MVC 패턴을 살펴보십시오. 훨씬 깨끗한 상태 추상화 (상태를 표시 코드에서 분리)를 만듭니다.

+0

'foreach'는 Java에 존재하지 않습니다. 단지'for'입니다. – BackSlash

+0

@BackSlash Thanks. C#에서 꽤 오랫동안 사용되었습니다. – jpmc26

5

청중은 게임의 상태을 변경해야합니다 (즉, 글 머리 기호를 만들거나 글 머리 기호의 위치를 ​​변경하는 등). repaint()을 호출해야합니다. 그런 다음 Swing은 paintComponent(Graphics g) 메서드를 호출합니다.이 메서드는 인수로 전달 된 Graphics를 사용하여 업데이트 된 게임 상태를 페인트합니다.

+0

조금 더 설명해 주시겠습니까? 나는 paintComponent(), repaint(), states, 등등에 대해 안다.하지만 나는 그저 함께 모으는 것 같다. (미안 해요, 그냥 자바 게임 자습서를보고 시작했습니다. 적어도 2 년 동안 Java를 알았지 만, 가장 진보적 인 게임 프로그래머 xD가 아닙니다.) – Geforce132

+0

사용자 정의 페인팅을하는 경우, 당신의'JPanel' (반드시'super.paint (g) '를 호출해야한다.)에 paint (Graphics g)'메소드를 추가하고 거기에 렌더링 코드를 넣으십시오. 전달 된'Graphics' 객체를 사용합니다.'repaint()'를 호출하면 커스텀 렌더링이 트리거됩니다. – akf

+0

@akf 스윙 클래스는'페인트 '를 오버라이드하지 않을 것을 권장한다. 'paint'는 배경을 처리하는 코드를 포함합니다. – jpmc26

관련 문제