java - 如何创建一个平铺 map (我只是得到一个白屏)

标签 java image swing awt tiled

我需要一些关于制作平铺 map 的帮助,我只是得到一个白色的屏幕,而不是上面有图像(平铺)的 map 。有人可以帮忙吗?

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

}

最佳答案

我稍微修改了你的代码,试试

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

}

关于java - 如何创建一个平铺 map (我只是得到一个白屏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12238822/

相关文章:

java - 在 Java Swing 中重画棋盘

Java文件传输

java - 比较数组内的元素

html - 带有 [背景] 图像的两个部分上的波浪边框分隔符

java - 24X7 运行 Java 程序

java - 对于像 fillOval 这样的方法, 'x' 和 'y' 表示什么?它们是什么坐标?

java - java 中的多线程编程、最佳实践和代码

java - 从 MySQL 数据库验证散列密码

java - 带图像图标的 JButton "lag"

css - 重置通过 css 设置的图像宽度和高度