Java Can';不要让瓷砖展示

Java Can';不要让瓷砖展示,java,swing,Java,Swing,下面是一系列Java游戏开发教程。如果有帮助的话,我已经从Newboston了解了Java的基本知识。不管怎么说,我一直在学习本教程:我为本教程创建的程序有点像一个2D Minecraft,在这一点上,程序应该以特定的顺序显示一个窗口,其中有几块泥土、石头和天空。当我运行它时,它只显示一个空白的JFrame,我得到以下错误: at mineGameMain.World.draw(World.java:80) at mineGameMain.GamePanel.draw(GamePanel.jav

下面是一系列Java游戏开发教程。如果有帮助的话,我已经从Newboston了解了Java的基本知识。不管怎么说,我一直在学习本教程:我为本教程创建的程序有点像一个2D Minecraft,在这一点上,程序应该以特定的顺序显示一个窗口,其中有几块泥土、石头和天空。当我运行它时,它只显示一个空白的JFrame,我得到以下错误:

at mineGameMain.World.draw(World.java:80)
at mineGameMain.GamePanel.draw(GamePanel.java:91)
at mineGameMain.GamePanel.gameRender(GamePanel.java:85)
at mineGameMain.GamePanel.run(GamePanel.java:51)
at java.lang.Thread.run(Unknown Source)
我有三门课,主要是:

package mineGameMain;

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

    }

}
游戏面板:

    package mineGameMain;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    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
            addKeyListener(new KeyAdapter(){

                public void keyPressed(KeyEvent e){

                }
                public void keyReleased(KeyEvent e){

                }
                public void Typed(KeyEvent e){

                }           

            });

        }


        public void run(){
            while(running){

                gameUpdate();
                gameRender();
                paintScreen();

            }

        }

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


            }

        }

        private void gameRender(){
            if(dbImage == null){

                dbImage = createImage(GWIDTH, GHEIGHT);
                if(dbImage == null){

                    System.err.println("dbImage IS STILL NULL SO SHUTUPBEQUIET!");
                    return;
                }else{
                    dbg = dbImage.getGraphics();

                }

            }
            //Clear the screen
            dbg.setColor(Color.WHITE);
            dbg.fillRect(0, 0, GWIDTH, GHEIGHT);
            //draw Game Methods
            draw(dbg);
        }

        /*Draw all game content in this method*/
        private 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();

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

            }
        }

        private void log(String s){

            System.out.println(s);

        }
    }
最后,世界:

package mineGameMain;

import java.awt.Image;
import java.awt.*;

import javax.swing.ImageIcon;

public class World {

    private Rectangle[] blocks;
    private Image[] blockImg;
    private final int arrayNum = 500;
    //Block images
    private Image BLOCK_DIRT_TOP, BLOCK_DIRT, BLOCK_STONE, BLOCK_SKY;

    private int x, y;

    public World(){

        BLOCK_DIRT_TOP = new ImageIcon("/MineGame/src/mineGameMain/Tile_Grass.png").getImage();
        BLOCK_DIRT = new ImageIcon("/MineGame/src/mineGameMain/Tile_Dirt.png").getImage();
        BLOCK_STONE = new ImageIcon("/MineGame/src/mineGameMain/Tile_Stone.png").getImage();
        BLOCK_STONE = new ImageIcon("/MineGame/src/mineGameMain/Tile_Sky.png").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 < 120){

                blockImg[i] = BLOCK_DIRT_TOP;
                blocks[i] = new Rectangle(x, y, 20, 20);

            }

            if( i >= 125 && i < 220){

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

        }

    }

}
main包;
导入java.awt.Image;
导入java.awt.*;
导入javax.swing.ImageIcon;
公共阶级世界{
私有矩形[]块;
私有映像[]块img;
私有最终int arrayNum=500;
//块图像
私人图像块土顶,块土,块石,块天空;
私有整数x,y;
公共世界(){
BLOCK_DIRT_TOP=新图像图标(“/MineGame/src/mineGameMain/Tile_Grass.png”).getImage();
BLOCK_DIRT=新图像图标(“/MineGame/src/mineGameMain/Tile_DIRT.png”).getImage();
BLOCK_STONE=newimageicon(“/MineGame/src/mineGameMain/Tile_STONE.png”).getImage();
BLOCK_STONE=newimageicon(“/MineGame/src/mineGameMain/Tile_Sky.png”).getImage();
块=新矩形[500];
blockImg=新图像[500];
loadArrays();
}
私有void加载数组(){
for(int i=0;i=500){
x=0;
y+=20;
}
如果(i>=0&&i<100){
blockImg[i]=BLOCK_天空;
块[i]=新矩形(x,y,20,20);
}
如果(i>=100&&i<120){
blockImg[i]=块体顶部;
块[i]=新矩形(x,y,20,20);
}
如果(i>=125&&i<220){
blockImg[i]=块土;
块[i]=新矩形(x,y,20,20);
}
如果(i>=225&&i<500){
blockImg[i]=块石;
块[i]=新矩形(x,y,20,20);
}
x+=20;
}
}
公共空间绘制(图g){
for(int i=0;i

谢谢你抽出时间。如果我发布此信息时出错或遗漏了任何详细信息,请告诉我。

请在下面找到一种方法,将您的问题转化为一个问题(实际上,这是一个固定版本)

代码中有很多错误应该避免

  • 不需要自己实现双缓冲,Swing默认为双缓冲
  • 所有对UI的访问都应该在EDT(事件显示线程)上进行,而不是从您创建的随机线程进行。您还应该使用
    invokeLater
  • 要绘制组件,请重写
    paintComponent
    ,并在需要调用时调用
    repaint()
  • 切勿在
    JComponent
    上使用
    getGraphics
    ,始终使用
    Graphics
    作为方法参数提供的对象(如在paintComponent中)
  • 无需扩展
    JFrame
    此处-->如果不需要,则不进行扩展(您实际上没有向
    JFrame
    添加行为)
  • 确保调用
    setVisible(true)
    作为
    JFrame
    的最后一条语句
  • 您忘记处理块120到125和块220到225(可能导致
    draw
    方法中出现NullPointerException(这可能是错误的根源)
  • 当您发布Java错误时,请确保发布整个stacktrace以及stacktrace上方提供的消息(同时确保人们可以通过添加类似于
    //这是世界级的第80行的注释来识别您的行号)

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Rectangle;
导入java.net.MalformedURLException;
导入java.net.URL;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共类主框架{
游戏面板gp;
public Main()引发错误的DurLexException{
gp=新游戏面板();
设置大小(500400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(gp);
包装();
setVisible(真);
}
公共静态类世界{
私有矩形[]块;
私有映像[]块img;
私有最终int arrayNum=500;
//块图像
私人图像块土顶,块土,块石,块天空;
私有整数x,y;
public World()抛出了错误的FormedUrlexception{
BLOCK\u DIRT\u TOP=新图像图标(新URL(“http://i909.photobucket.com/albums/ac298/XxEnoAsaIxX/grass2test.png?t=1303852677"))
.getImage();
BLOCK_DIRT=新图像图标(新URL(
"http://i909.photobucket.com/albums/ac298/XxEnoAsaIxX/sparsedirtandgrasstile.png?t=1300172998),getImage();
BLOCK_STONE=新图像图标(新URL(“http://www.stonetilesupply.com/v/vspfiles/photos/MARBL-BTTCNCLASSICO-2S.jpg),getImage();
BLOCK_SKY=新图像图标(新URL(“http://lacoste.scene7.com/is/image/lacoste/swatch_10_CH0783-00_SVH_24?$swatch$”).getImage();
块=新矩形[500];
blockImg=新图像[500];
loadArrays();
}
私有void加载数组(){
for(int i=0;i=500){
x=0;
y+=20;
}
如果(i>=0&&i<100){
blockImg[i]=BLOCK_天空;
块[i]=新矩形(x,y,20,20);
}
如果
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Main extends JFrame {

    GamePanel gp;

    public Main() throws MalformedURLException {

        gp = new GamePanel();
        setSize(500, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(gp);
        pack();
        setVisible(true);

    }

    public static class World {

        private Rectangle[] blocks;
        private Image[] blockImg;
        private final int arrayNum = 500;
        // Block images
        private Image BLOCK_DIRT_TOP, BLOCK_DIRT, BLOCK_STONE, BLOCK_SKY;

        private int x, y;

        public World() throws MalformedURLException {

            BLOCK_DIRT_TOP = new ImageIcon(new URL("http://i909.photobucket.com/albums/ac298/XxEnoAsaIxX/grass2test.png?t=1303852677"))
                    .getImage();
            BLOCK_DIRT = new ImageIcon(new URL(
                    "http://i909.photobucket.com/albums/ac298/XxEnoAsaIxX/sparsedirtandgrasstile.png?t=1300172998")).getImage();
            BLOCK_STONE = new ImageIcon(new URL("http://www.stonetilesupply.com/v/vspfiles/photos/MARBL-BTTCNCLASSICO-2S.jpg")).getImage();
            BLOCK_SKY = new ImageIcon(new URL("http://lacoste.scene7.com/is/image/lacoste/swatch_10_CH0783-00_SVH_24?$swatch$")).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 < 120) {

                    blockImg[i] = BLOCK_DIRT_TOP;
                    blocks[i] = new Rectangle(x, y, 20, 20);

                }

                // Here missing block for 120 to 125
                if (i >= 120 && i < 125) {
                    blockImg[i] = BLOCK_STONE;
                    blocks[i] = new Rectangle(x, y, 20, 20);
                }

                if (i >= 125 && i < 220) {

                    blockImg[i] = BLOCK_DIRT;
                    blocks[i] = new Rectangle(x, y, 20, 20);

                }
                // Here missing block for 220 to 225
                if (i >= 220 && i < 225) {
                    blockImg[i] = BLOCK_SKY;
                    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);

            }

        }

    }

    public static class GamePanel extends JPanel {

        // JPanel variables

        // Game Objects
        World world;

        public GamePanel() throws MalformedURLException {

            world = new World();
            setPreferredSize(new Dimension(500, 400));
            setBackground(Color.WHITE);
            setFocusable(true);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            world.draw(g);
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new Main();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

    }

}