2012-09-02 4 views
5

타일 된 맵을 만드는 데 도움이 필요합니다. 이미지 (타일)가있는 맵 대신 흰색 화면이 나타납니다. 누군가 그것을 도울 수 있습니까? 여기타일 된 맵을 만드는 법 (흰색 화면을 얻는 것) Java

World.java

package game.test.src; 

    import java.awt.Graphics; 
    import java.awt.Image; 
    import java.awt.Rectangle; 

    import javax.swing.ImageIcon; 

    public class World { 

private Rectangle[] blocks; 
private Image[] blockImg; 
private final int arrayNum = 500; 

//Block Images 
private Image BLOCK_GRASS, BLOCK_DIRT, BLOCK_STONE, BLOCK_SKY; 

private int x, y; 

public World(){ 
    BLOCK_GRASS = new ImageIcon("C:/Users/Pim/Desktop/2D game test/Game test 2/src/game/test/src/images/tile_grass").getImage(); 
    BLOCK_DIRT = new ImageIcon("C:/Users/Pim/Desktop/2D game test/Game test 2/src/game/test/src/images/tile_dirt").getImage(); 
    BLOCK_STONE = new ImageIcon("C:/Users/Pim/Desktop/2D game test/Game test 2/src/game/test/src/images/tile_stonek").getImage(); 
    BLOCK_SKY = new ImageIcon("C:/Users/Pim/Desktop/2D game test/Game test 2/src/game/test/src/images/tile_sky").getImage(); 
    blocks = new Rectangle[500]; 
    blockImg = new Image[500]; 

    loadArrays(); 
} 

private void loadArrays() 
{ 
    for(int i = 0; i < arrayNum; i++) 
    { 
     if(x >= 500){ 
      x = 0; 
      y += 20; 
     } 
     if(i >= 0 && i < 100) 
     { 
      blockImg[i] = BLOCK_SKY; 
      blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     if(i >= 100 && i < 125) 
     { 
      blockImg[i] = BLOCK_GRASS; 
      blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     if(i >= 125 && i < 225) 
     { 
      blockImg[i] = BLOCK_DIRT; 
      blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     if(i >= 225 && i < 500) 
     { 
      blockImg[i] = BLOCK_STONE; 
      blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     x += 20; 

    } 

} 

public void draw(Graphics g) 
{ 
    for(int i = 0; i< arrayNum; i++){ 
     g.drawImage(blockImg[i], blocks[i].x, blocks[i].y, null); 
    } 
} 
} 

을 그리고는 도움을

감사 GamePanel.java

package game.test.src; 

import java.awt.*; 
import java.awt.event.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JPanel; 

public class GamePanel extends JPanel implements Runnable { 
    //Double buffering 
    private Image dbImage; 
    private Graphics dbg; 
    //JPanel variables 
    static final int GWIDTH = 500, GHEIGHT = 400; 
    static final Dimension gameDim = new Dimension(GWIDTH, GHEIGHT); 
    //Game variables 
    private Thread game; 
    private volatile boolean running = false; 
    //Game Objects 
    World world; 

    public GamePanel(){ 
     world = new World(); 

     setPreferredSize(gameDim); 
     setBackground(Color.WHITE); 
     setFocusable(true); 
     requestFocus(); 
     //Handle all key inputs from user 
     addKeyListener(new KeyAdapter(){ 
      @Override 
      public void keyPressed(KeyEvent e){ 

      } 
      @Override 
      public void keyReleased(KeyEvent e){ 

      } 
      @Override 
      public void keyTyped(KeyEvent e){ 

      } 
     }); 

    } 

    public void run(){ 
     while(running){ 
      gameUpdate(); 
      gameRender(); 
      paintScreen(); 

     } 
    } 

    private void gameUpdate(){ 
     if(running && game != null){ 

     } 
    } 

    private void gameRender(){ 
     if(dbImage == null){ // Create the buffer 
      dbImage = createImage(GWIDTH, GHEIGHT); 
      if(dbImage == null){ 
       System.err.println("dbImage is still null!"); 
       return; 
      }else{ 
       dbg = dbImage.getGraphics(); 
      } 
     } 
     //Clear the screen 
     dbg.setColor(Color.WHITE); 
     dbg.fillRect(0, 0, GWIDTH, GHEIGHT); 
     //Draw Game elements 
     draw(dbg); 
    } 

    /* Draw all game content in this method */ 
    public void draw(Graphics g){ 
     world.draw(g); 
    } 

    private void paintScreen(){ 
     Graphics g; 
     try{ 
      g = this.getGraphics(); 
      if(dbImage != null && g != null){ 
       g.drawImage(dbImage, 0, 0, null); 
      } 
      Toolkit.getDefaultToolkit().sync(); //For some operating systems 
      g.dispose(); 
     }catch(Exception e){ 
      System.err.println(e); 
     } 
    } 

    public void addNotify(){ 
     super.addNotify(); 
     startGame(); 
    } 

    private void startGame(){ 
     if(game == null || !running){ 
      game = new Thread(this); 
      game.start(); 
      running = true; 
     } 
    } 

    public void stopGame(){ 
     if(running){ 
      running = false; 
     } 
    } 
    } 

및 Main.java

package game.test.src; 

import javax.swing.JFrame; 

public class Main extends JFrame 
{ 
    GamePanel gp; 

    public Main() 
    { 
     gp = new GamePanel(); 
     setSize(500, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setResizable(false); 
     add(gp); 
    } 



    public static void main(String[] args) 
    { 
     Main m = new Main(); 
    } 

} 
입니다!

p.s. 미안하다 영어로 나는 네덜란드 다.

+0

을 시도, 코드를 수정 한 그렇게 이상한 경로를 사용하고 있습니까? –

+0

더 나은 길을 보여줄 수 있습니까? (나는 어떻게 작동했는지 모르겠다 ...) –

+0

Graphics 컨텍스트를 얻기 위해 컴포넌트에서 getGraphics()를 호출하는 것처럼 보였으므로 그렇게해서는 안된다. 귀하의 튜토리얼에서 그렇게하도록 지시합니까? 그렇다면 매우 정통적이기 때문에 링크를 보내주십시오. 나는 당신이 사용하고있는 튜토리얼이나 책이 무엇인지 궁금해 할 필요가있다. –

답변

4

나는 약간

import java.awt.*; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.*; 

public class World { 

    private Rectangle[] blocks; 
    private Image[] blockImg; 
    private final int arrayNum = 500; 

    //Block Images 
    private Image BLOCK_GRASS, BLOCK_DIRT, BLOCK_STONE, BLOCK_SKY; 

    private int x, y; 

    public World(){ 
    BLOCK_GRASS = new ImageIcon(Frame1.class.getResource("images/openFile.gif")).getImage(); 
    BLOCK_DIRT = new ImageIcon(Frame1.class.getResource("images/openFile.gif")).getImage(); 
    BLOCK_STONE = new ImageIcon(Frame1.class.getResource("images/openFile.gif")).getImage(); 
    BLOCK_SKY = new ImageIcon(Frame1.class.getResource("images/openFile.gif")).getImage(); 
    blocks = new Rectangle[500]; 
    blockImg = new Image[500]; 

    loadArrays(); 
    } 

    private void loadArrays() 
    { 
    for(int i = 0; i < arrayNum; i++) 
    { 
     if(x >= 500){ 
     x = 0; 
     y += 20; 
     } 
     if(i >= 0 && i < 100) 
     { 
     blockImg[i] = BLOCK_SKY; 
     blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     if(i >= 100 && i < 125) 
     { 
     blockImg[i] = BLOCK_GRASS; 
     blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     if(i >= 125 && i < 225) 
     { 
     blockImg[i] = BLOCK_DIRT; 
     blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     if(i >= 225 && i < 500) 
     { 
     blockImg[i] = BLOCK_STONE; 
     blocks[i] = new Rectangle(x, y, 20, 20); 
     } 
     x += 20; 

    } 

    } 

    public void draw(Graphics g) 
    { 
    for(int i = 0; i< arrayNum; i++){ 
     g.drawImage(blockImg[i], blocks[i].x, blocks[i].y, null); 
    } 
    } 
} 

class GamePanel extends JPanel implements Runnable { 
    //Double buffering 
    private Image dbImage; 
    private Graphics dbg; 
    //JPanel variables 
    static final int GWIDTH = 500, GHEIGHT = 400; 
    static final Dimension gameDim = new Dimension(GWIDTH, GHEIGHT); 
    //Game variables 
    private Thread game; 
    private volatile boolean running = false; 
    //Game Objects 
    World world; 

    public GamePanel(){ 
    world = new World(); 

    setPreferredSize(gameDim); 
    setBackground(Color.WHITE); 
    setFocusable(true); 
    requestFocus(); 
    //Handle all key inputs from user 
    addKeyListener(new KeyAdapter(){ 
     @Override 
     public void keyPressed(KeyEvent e){ 

     } 
     @Override 
     public void keyReleased(KeyEvent e){ 

     } 
     @Override 
     public void keyTyped(KeyEvent e){ 

     } 
    }); 

    } 

    public void run(){ 
    while(running){ 
     gameUpdate(); 
//  gameRender(); 
//  paintScreen(); 
     repaint(); 

    } 
    } 

    private void gameUpdate(){ 
    if(running && game != null){ 

    } 
    } 

    private void gameRender(){ 
    if(dbImage == null){ // Create the buffer 
     dbImage = createImage(GWIDTH, GHEIGHT); 
     if(dbImage == null){ 
     System.err.println("dbImage is still null!"); 
     return; 
     }else{ 
     dbg = dbImage.getGraphics(); 
     } 
    } 
    //Clear the screen 
    dbg.setColor(Color.WHITE); 
    dbg.fillRect(0, 0, GWIDTH, GHEIGHT); 
    //Draw Game elements 
    draw(dbg); 
    } 

    /* Draw all game content in this method */ 
    public void draw(Graphics g){ 
    world.draw(g); 
    } 
    public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    gameRender(); 
    paintScreen(g); 
    } 
    private void paintScreen(Graphics g){ 
    try{ 
//  g = this.getGraphics(); 
     if(dbImage != null && g != null){ 
     g.drawImage(dbImage, 0, 0, null); 
     } 
     Toolkit.getDefaultToolkit().sync(); //For some operating systems 
//  g.dispose(); 
    }catch(Exception e){ 
     System.err.println(e); 
    } 
    } 

    public void addNotify(){ 
    super.addNotify(); 
    startGame(); 
    } 

    private void startGame(){ 
    if(game == null || !running){ 
     game = new Thread(this); 
     game.start(); 
     running = true; 
    } 
    } 

    public void stopGame(){ 
    if(running){ 
     running = false; 
    } 
    } 
} 
class Main extends JFrame 
{ 
    GamePanel gp; 

    public Main() 
    { 
    gp = new GamePanel(); 
    setSize(500, 400); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    add(gp); 
    setResizable(false); 
    setVisible(true); 
    } 



    public static void main(String[] args) 
    { 
    Main m = new Main(); 
    } 

} 
+0

이 [예제] (http://stackoverflow.com/a/11556441/230513)도 참고하십시오. – trashgod

+0

@trashgod 잘 생긴 코드, 고마워. –

관련 문제