Java Can';不要让瓷砖展示
下面是一系列Java游戏开发教程。如果有帮助的话,我已经从Newboston了解了Java的基本知识。不管怎么说,我一直在学习本教程:我为本教程创建的程序有点像一个2D Minecraft,在这一点上,程序应该以特定的顺序显示一个窗口,其中有几块泥土、石头和天空。当我运行它时,它只显示一个空白的JFrame,我得到以下错误: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
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
作为方法参数提供的对象(如在paintComponent中)Graphics
- 无需扩展
此处-->如果不需要,则不进行扩展(您实际上没有向JFrame
添加行为)JFrame
- 确保调用
作为setVisible(true)
的最后一条语句JFrame
- 您忘记处理块120到125和块220到225(可能导致
方法中出现NullPointerException(这可能是错误的根源)draw
- 当您发布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();
}
}
});
}
}