2013-09-06 2 views
0

저는 타워 방어 게임을 작성 중이며 JFrame에로드 된 버퍼 이미지가있는 JPanels 목록을 배치해야합니다. 그러나 for 루프를 사용하여 JPanels를 JFrame에 배치합니다. 그러나 프로그램을 실행하면 목록의 마지막 JPanel 만 표시됩니다. 이미지가 다른 이미지 위에 놓여 있지 않은지 확인하기 위해 3 개의 별도 위치에 배치되었습니다. 내가 지금이 문제를 해결할 수있는 방법을이미지 목록을로드 할 때 하나의 이미지 만 표시됩니다.

import java.awt.*; 
import javax.swing.*; 
import java.awt.image.BufferedImage; 

public class BasicEnemy extends Entity { 
    JPanel ePanel; 
    Graphics g; 

    public BasicEnemy(double x, double y, BufferedImage image) { 
     super(x, y, image); 
     ePanel = new JPanel(); 
     ePanel.setVisible(true); 
    } 

    protected void paintComponent(Graphics g) { 
     g.drawImage(getImage(), (int)(getXCoord()), 
          (int)(getYCoord()), null); 
    } 
} 

다음 JPanel의 내 코드가 JFrame의에 배치되고 여기에

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.List; 
import java.util.ArrayList; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO;  

public class GameScreen extends JPanel  
        implements MouseListener { 

    private ArrayList<JPanel> images; 
    private TDGame currentGame; 
    private JFrame frame; 
    private static final int width = 700; 
    private static final int length = 700; 

    public void mouseExited(MouseEvent e) { 
     this.repaint(); 
    } 
     
    public void mouseEntered(MouseEvent e) { 
     this.repaint(); 
    } 
     
    public void mouseReleased(MouseEvent e) { 
     this.repaint(); 
    } 
     
    public void mousePressed(MouseEvent e) { 
     this.repaint(); 
    } 
     
    public void mouseClicked(MouseEvent e) { 
     this.repaint(); 
    } 
     
    public GameScreen() { 
     super(); 
     images = new ArrayList<JPanel>(); 
     currentGame = new TDGame(); 
     frame = new JFrame("Tower Defense"); 
     frame.setSize(width, length); 
     frame.setVisible(true); 
     frame.pack(); 
     frame.getContentPane().add(this,BorderLayout.CENTER); 
     currentGame.EnemyForce.add(currentGame.EnemyForce.size(), 
           new BasicEnemy(0, 0, LoadImage())); 
     currentGame.EnemyForce.add(currentGame.EnemyForce.size(), 
           new BasicEnemy(250, 250, LoadImage2())); 
     currentGame.EnemyForce.add(currentGame.EnemyForce.size(), 
           new BasicEnemy(0, 0, LoadImage1())); 

     this.repaint(); 
    } 

    public BufferedImage LoadImage() { 
     BufferedImage img = null; 
     try { 
      img = ImageIO.read(new File("Saturn-Intruder.png")); 
     } catch (IOException e) { 
     } 
     return img; 
    } 
     
    public BufferedImage LoadImage1() { 
     BufferedImage img = null; 
     try { 
      img = ImageIO.read(new File("Level1-TD.jpeg")); 
     } catch (IOException e) { 
     } 
     return img; 
    } 
     
    public BufferedImage LoadImage2() { 
     BufferedImage img = null; 
     try { 
      img = ImageIO.read(new File("BlackBird-Intruder.jpeg")); 
     } catch (IOException e) { 
     } 
     return img; 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     for(int i = 0; i < currentGame.Defense.size(); i++) { 
      frame.add(currentGame.Defense.get(i)); 
     } 

     for(int i = 0; i < currentGame.EnemyForce.size(); i++) { 
      frame.add(currentGame.EnemyForce.get(i)); 
     } 

     for(int i = 0; i < currentGame.ShotsFired.size(); i++) { 
      frame.add(currentGame.ShotsFired.get(i)); 
     } 
    } 
} 

: 여기

는 JFrame의를 만들어 내 클래스의 코드입니다 모든 이미지가 배치 될뿐 아니라 하나입니까?

+1

1) 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 2) 빈칸 한 줄의 공백은 소스 코드에서 항상 * 충분합니다. '{'또는'}'앞의 공백 행은 일반적으로 중복됩니다. 3) 클래스에 대한 일반적인 [Java 명명 규칙 (Java 命名 規則)] (http://java.sun.com/docs/books/books/books/jls/second_edition/html/names.doc.html#73307) (특히 이름에 사용 된 사례)을 배우십시오. , 메소드 및 속성 이름을 일관되게 사용하십시오. 4) 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. 코드의 들여 쓰기는 사람들이 프로그램 흐름을 이해하도록 돕기위한 것입니다. –

+1

1) 최상위 컨테이너의 크기를 설정하지 마십시오. 대신 내용을 배치하고'pack()'을 호출하십시오. 2) 배포 시점까지, 해당 자원은 [태그 : 내장 자원]이 될 가능성이 큽니다. 그렇다면 리소스는'File' 대신'URL'에 의해 접근되어야합니다. 'URL'을 구성하는 방법은 태그에 대한 [info page] (http://stackoverflow.com/tags/embedded-resource/info)를 참조하십시오. 3) ** paintComponent (..) 메소드 내에서 컴포넌트를 추가하지 마십시오. ** 그 자체로는'repaint()'와 무한 루프를 트리거합니다. 4) 이미지를 페인팅 할 때'null '대신에'ImageObserver'를 사용하십시오. –

+1

사실, 그 소스를 더 많이 볼수록, 새로운 학습 소스와 함께 그것을 던지고 신선한 것으로 시작해야한다고 생각합니다. 그것은 구제가 불가능합니다. –

답변

1

당신의 게임이 단지 하나의 이미지만을 보여주는 이유를 정확히 알지 못합니다. 그러나이 게임을 계속 진행하면서 나는 각 JPanel에서 각 이미지를 추가하지 말 것을 적극 권장합니다.

소스 코드를 사용하면 어떻게됩니까?

  • 는 GameScreen.paintComponent 내부 루프의 모든 사람들은 (...) {currentGame.EnemyForce에 대한

    을 읽을 BasicEnemy에서 JPanel의 (와 같은 다른 모든 클래스)
  • 변경을 제거합니다. get (i). 페인트 컴포넌트 (g); } GameScreen에 대한 생성자

  • 은 당신이 JCompondents 내부의 게임의 일부 개별 요소를 보유해서는 안 스윙과 그래픽을 사용하려고 frame.add(this);를 잘하면

frame.setVisible(true); 전에 추가합니다. GameScreen을 "캔버스"로 사용하고 paintComponent 내부에서 Graphics 객체를 사용하여 모든 게임 내용을 페인트합니다.

관련 문제