2013-02-18 121 views
-3

我最近一直在用java编程一个平台游戏,当我尝试使用单独的类来存储我的地图(平铺)时,我遇到了一个问题。然后我试图通过将地图移动到主类中来修复它,但它没有帮助。地图渲染错误slick2d

这是导致问题的代码(当 world.map1.render(0,0)被删除时,没有问题存在) - 我知道我应该使用getters和setter。我只是觉得他们很痛苦。

public void render(GameContainer arg0, Graphics arg1) throws SlickException { 
    world.map1.render(0, 0); 
} 

这是主要的方法

public static void main(String[] args) throws SlickException{ 
    AppGameContainer app = new AppGameContainer(new Game()); 
    app.setDisplayMode(864, 480, false); 
    app.setVSync(true); 
    app.start(); 
    playerSheet = new SpriteSheet("resources/images/link3goldstudmod.png", 64, 64); 
    player = new Player(playerSheet); 
    world = new World(); 

} 

,这是世界级的

import org.newdawn.slick.SlickException; 
import org.newdawn.slick.tiled.TiledMap; 

public class World { 
    TiledMap map1; 
    World() throws SlickException{ 
     map1 = new TiledMap("resources/maps/map1.tmx"); 
    } 
} 

编辑:我忘了张贴问题/堆废话/不管。我多么愚蠢。

Mon Feb 18 16:33:58 MST 2013 INFO:Slick Build #264 
Mon Feb 18 16:33:58 MST 2013 INFO:LWJGL Version: 2.8.5 
Mon Feb 18 16:33:58 MST 2013 INFO:OriginalDisplayMode: 1920 x 1080 x 32 @60Hz 
Mon Feb 18 16:33:58 MST 2013 INFO:TargetDisplayMode: 864 x 480 x 0 @0Hz 
Mon Feb 18 16:33:58 MST 2013 INFO:Starting display 864x480 
Mon Feb 18 16:33:58 MST 2013 INFO:Use Java PNG Loader = true 
WARNING: Found unknown Windows version: Windows 8 
Attempting to use default windows plug-in. 
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin 
Mon Feb 18 16:33:59 MST 2013 INFO:Found 3 controllers 
Mon Feb 18 16:33:59 MST 2013 INFO:0 : USB Receiver 
Mon Feb 18 16:33:59 MST 2013 INFO:1 : USB Receiver 
Mon Feb 18 16:33:59 MST 2013 INFO:2 : Logitech Speaker 
Mon Feb 18 16:33:59 MST 2013 ERROR:null 
java.lang.NullPointerException 
    at zeldaplatform.Game.render(Game.java:36) 
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:703) 
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:456) 
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:361) 
at zeldaplatform.Game.main(Game.java:27) 
Mon Feb 18 16:33:59 MST 2013 ERROR:Game.render() failure - check the game code. 
org.newdawn.slick.SlickException: Game.render() failure - check the game code. 
at org.newdawn.slick.GameContainer.updateAndRender(GameContainer.java:706) 
at org.newdawn.slick.AppGameContainer.gameLoop(AppGameContainer.java:456) 
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:361) 
at zeldaplatform.Game.main(Game.java:27) 

这不是一个错误,因为它编译得很好,然后控制台给了我这个。窗口瞬间显示,然后消失。

+1

'错误'如果您不告诉我们什么错误,您如何期待我们的帮助? – Doorknob 2013-02-18 23:37:58

+1

看起来你不明白对象,变量或范围。您可能希望从Oracle的Java教程或Java初学者的书中入门。 – 2013-02-18 23:39:59

+0

@BrianRoach是什么让你觉得呢?我不知道会发生什么,因为我已经阅读了javadocs,并且我确实知道对象是什么以及它们应该用于什么目的。我只是急着写这个问题。如果我不知道变量是什么,我就不会开始光滑。是的,我可以写pong游戏(没有复制/粘贴)。但我用光滑的引擎不太好。它给我带来麻烦。很难找到教程和东西。 – 2013-02-18 23:58:18

回答

1

这是一个NullPointerException。有正好 NPE的一个原因;你试图使用的东西没有实例化,并且是null。在这种情况下,您的Game类中的world类或World类中的map1

考虑到你在你Game.main()开始实例化一个新Game,启动它,然后进行新的World分配到所述类的static场(你不发表您的Game类,但是这是唯一的办法你可以从main()做到这一点,堆栈跟踪显示它是Game.main()),它是前者。

AppGameContainerapp)是被解雇了start(),然后该线程进行调用Gamerender()方法的该实例已实例化并分配给您的World的静态字段之前。

不要使用static这样的字段;这实际上不是他们的目的。您应该将这些实例(playerSheet,playerworld)传递给构造函数Game并将它们分配给私有实例变量。

... 
Game myGame = new Game(playerSheet, player, world); 
AppGameContainer app = new AppGameContainer(myGame); 
... 
+0

我删除了所有的静态字段,现在我得到一个opengl“在当前线程中找不到opengl”的错误。而且据说唯一的解决办法是将世界级的东西添加到游戏类中。但上次我检查你应该把事情分开,除非我做私人课。我会尝试一下,看看会发生什么 – 2013-02-19 00:24:18

+1

没有看到/挖掘你的代码的其余部分...这是有道理的。你从'Game'类发布的'render()'方法正在被传递一个'Graphics'上下文,而你没有做任何事情;你需要这个上下文来渲染东西(并且你永远不想存储'Graphics'上下文并重用它)。 – 2013-02-19 00:30:45

+0

我看到了您的评论,并仔细查看了一些示例代码,我意识到光滑是非常挑剔的。挑剔到它不会让你设置变量或对象,直到你到达init()函数(在游戏循环之前)和..我把我在Game()中的东西移动到初始化,目前该程序运行良好。它显示我的地图。 (对我来说足够了!)而且,thx。非常。尽管我看到的示例代码对Graphics上下文没有任何帮助。 – 2013-02-19 00:50:15