2012-09-02 6 views
5

Ho bisogno di aiuto per creare una mappa affiancata, sto solo ottenendo uno schermo bianco invece di una mappa con immagini (piastrelle) su di esso. Qualcuno può aiutarti?Come creare una mappa affiancata (sto solo ottenendo uno schermo bianco) 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); 
    } 
} 
} 

Ed ecco 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; 
     } 
    } 
    } 

e 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(); 
    } 

} 

Grazie per l'aiuto!

p.s. scusa per il mio inglese, sono olandese.

+0

Si sta utilizzando i percorsi in modo strano? –

+0

Puoi darmi un esempio di un percorso migliore? (Non sapevo come funzionasse ...) –

+0

Sembra che tu stia chiamando 'getGraphics()' sui componenti per ottenere il contesto grafico e non dovrebbe farlo. Il tuo tutorial ti dice di farlo? Se è così, ti preghiamo di mostrarci un link a questo perché è molto poco ortodosso. Devo chiedermi quale tutorial o libro stai usando. –

risposta

4

Ho leggermente modificato il codice, provare

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

Vedi anche questo [esempio] (http://stackoverflow.com/a/11556441/230513). – trashgod

+0

@trashgod Codice bello, grazie. –

Problemi correlati