Hi I have been using clojure for a week now and I am working on
http://slick.cokeandcode.com/ to create games.
I use a proxy for BasicGame , which supplies me with (init) and the
game loop.
I have to initialize image-based resources either in the game loop or
at init so I defined everything @ init:
///////////////////// CODE:
(ns test
(:import (org.newdawn.slick BasicGame GameContainer Graphics
SlickException AppGameContainer)
(org.newdawn.slick.tiled TiledMap)
(org.newdawn.slick.util Log))
)
(def map-file "data/randmap.tmx")
(defn initialize-game [container]
do(
(Log/info "INIT FN START")
(def tiled-map (TiledMap. map-file))
(Log/info (str "tiled-map: " tiled-map))
(def tile-size (. tiled-map getTileWidth))
(Log/info (str "tiled-size: " tile-size))
(def ground-layer-index (. tiled-map getLayerIndex "ground"))
; caculate some layout values for rendering the tilemap. How many
tiles
; do we need to render to fill the screen in each dimension and how
far
; is
; it from the centre of the screen
(def display-height-in-tiles (/ (. container getHeight) tile-size))
(def display-width-in-tiles (/ (. container getWidth) tile-size))
; Hier enstehen kleine Ungereimtheiten wenn man den topOffset abzieht
; er aber 20,4 anstatt von z.b. 20 betrÃĪgt -> 0,4 verschobene map !
(def top-offset-in-tiles (int (/ display-height-in-tiles 2)))
(def left-offset-in-tiles (int (/ display-width-in-tiles 2)))
(def top-offset-in-tiles-buffer (- top-offset-in-tiles (/ display-
height-in-tiles 2)))
(def left-offset-in-tiles-buffer (- left-offset-in-tiles (/ display-
width-in-tiles 2)))
(Log/info "INIT FN FIN")
)
)
; image-based resources have to be loaded as part of init or the
gameloop
(def simple-test
(proxy [BasicGame] ["SimpleTest"]
(init [container] (initialize-game container) )
(update [container delta] (println "update called"))
(render [container g] (do (println "render
called!") ))
))
(def container (new AppGameContainer simple-test))
(.start container)
///////////////////// CODE
1. Question:
This simplified code above throws a nullpointer exception.
Here is the exception (after the initialize do is completed, as you
can see with the LOG message):
user=> (use 'test)
Wed Apr 07 10:49:27 CEST 2010 INFO:Slick Build #230
Wed Apr 07 10:49:27 CEST 2010 INFO:LWJGL Version: 2.1.0
Wed Apr 07 10:49:27 CEST 2010 INFO:OriginalDisplayMode: 1280 x 800 x
32 @60Hz
Wed Apr 07 10:49:27 CEST 2010 INFO:TargetDisplayMode: 640 x 480 x 0
@0Hz
0
Wed Apr 07 10:49:27 CEST 2010 INFO:Starting display 640x480
Wed Apr 07 10:49:27 CEST 2010 INFO:Controllers not available
Wed Apr 07 10:49:27 CEST 2010 INFO:INIT FN START
Wed Apr 07 10:49:28 CEST 2010 INFO:tiled-map:
org.newdawn.slick.tiled.tiled...@b
aa466
Wed Apr 07 10:49:28 CEST 2010 INFO:tiled-size: 48
Wed Apr 07 10:49:28 CEST 2010 INFO:INIT FN FIN
java.lang.NullPointerException (test.clj:0)
The exception points to the last row of the do of initialize-game.
user=> (. *e printStackTrace)
java.lang.NullPointerException (test.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:4543)
at clojure.lang.Compiler.load(Compiler.java:4857)
at clojure.lang.RT.loadResourceScript(RT.java:326)
at clojure.lang.RT.loadResourceScript(RT.java:317)
at clojure.lang.RT.load(RT.java:395)
at clojure.lang.RT.load(RT.java:367)
at clojure.core$load__5058$fn__5061.invoke(core.clj:3734)
at clojure.core$load__5058.doInvoke(core.clj:3733)
at clojure.lang.RestFn.invoke(RestFn.java:413)
at clojure.core$load_one__5010.invoke(core.clj:3578)
at clojure.core$load_lib__5031.doInvoke(core.clj:3615)
at clojure.lang.RestFn.applyTo(RestFn.java:147)
at clojure.core$apply__3243.doInvoke(core.clj:390)
at clojure.lang.RestFn.invoke(RestFn.java:443)
at clojure.core$load_libs__5043.doInvoke(core.clj:3641)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply__3243.doInvoke(core.clj:390)
at clojure.lang.RestFn.invoke(RestFn.java:460)
at clojure.core$use__5052.doInvoke(core.clj:3711)
at clojure.lang.RestFn.invoke(RestFn.java:413)
at user$eval__1.invoke(NO_SOURCE_FILE:1)
at clojure.lang.Compiler.eval(Compiler.java:4532)
at clojure.core$eval__3990.invoke(core.clj:1728)
at clojure.main
$repl__5813$read_eval_print__5825.invoke(main.clj:176)
at clojure.main$repl__5813.doInvoke(main.clj:193)
at clojure.lang.RestFn.invoke(RestFn.java:426)
at clojure.main$repl_opt__5853.invoke(main.clj:247)
at clojure.main$legacy_repl__5878.invoke(main.clj:288)
at clojure.lang.Var.invoke(Var.java:346)
at clojure.main.legacy_repl(main.java:29)
at clojure.lang.Repl.main(Repl.java:20)
Caused by: java.lang.NullPointerException
at test$initialize_game__7.invoke(test.clj:46)
at test$fn__10$fn__18.invoke(test.clj:55)
at clojure.proxy.org.newdawn.slick.BasicGame.init(Unknown
Source)
at
org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:371)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown
Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:
88)
at
clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:263)
at test$eval__23.invoke(test.clj:66)
at clojure.lang.Compiler.eval(Compiler.java:4532)
... 30 more
nil
If I remove the "do" at initialize-game it does not lead to an
exception.
Why does it throw the exception?
2. Question:
I read this in on clojure.org:
; Using def to modify the root value of a var at other than the top
level is usually an
; indication that you are using the var as a mutable global, and is
considered bad style.
; Consider either using binding to provide a thread-local value for
the var,
; or putting a ref or agent in the var and using transactions or
actions for mutation.
I have to initialize a tiled-map (special map created with the
tiled.org mapeditor) once.
So I want to create a var. (If question 1 is resolved and I can use
initialize ... )
Should I use refs or is it okay to use (def ...) in initialize?
Because the values specified in "initialize-game" should not be
mutable!
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
To unsubscribe, reply using "remove me" as the subject.