Hi everyone

 first of all, this is my first post, so if I ask FAQs or deserve to
RTFM, please tell me.

I am learning clojure, and trying to adapt some game code written in a
Java framework called Slick. After a couple of beginner's mistake (the
kind you do to learn ;) ), I got a working convestion of a Scoller
example. Still, there are some things that I don't find very elegant,
or where I'm pretty sure to be reinventing some wheel.

Code is here :

http://tinyurl.com/dj4l9z
or
git://github.com/phtrivier/clj-slick-tank.git

* The game is tile-based. I need to build up a collision map ("can the
tank walk on cell [3,2] ?"). Java does it with a two-dimensional array
of booleans. From discussion here :
http://groups.google.com/group/clojure/browse_thread/thread/5eb78c620eac19ea/b4d75ac4644c06a9?lnk=gst&q=two+dimensional+vector#b4d75ac4644c06a9
, I choosed to use a vector of vector (i probably should'nt have, but
that's another point). I wrote this :

(defn blocked?
  "Is a position blocked in the screen?"
  [screen x y]
  (let [i (int x)
        j (int y)]
    (true? (get (get (screen :blocked) i) j))))

(defn make-row-generator
  [cell-generator w]
  (fn [i]
    (vec (map (fn [j] (cell-generator i j))
              (range 0 w)))))

(defn make-matrix
  [w h cell-generator]
  (vec (map (make-row-generator cell-generator w)
            (range 0 h))))

(defn make-collision-map
  "Builds a double dimensioned array telling
whether a cell is blocked"
  [m w h]
  (make-matrix
   w h
   (fn [i j]
     (let [tileId (.getTileId m i j 0)]
       (let [res
             (Boolean/parseBoolean
              (.getTileProperty m tileId "blocked" "false"))]
         res
         )))))

(the 'm' is a slick-specific stucture that holds the tile map).
Am I duplicating some existing library to build matrices ? Is there a
cleaner way to do it ?

* In a method I check for collisions :

 ;; Movement
(defn try-move
  "Try and move a player in the screen given a direction.
                Returns a list with the moved player, and a
                boolean indicating whether the move was successfull.
        "
  [player screen dx dy]
  (let [new_x (+ (player :x) dx)
        new_y (+ (player :y) dy)]

    (let [bxy (blocked? screen new_x new_y)
          bx (blocked? screen new_x (player :y))
          by (blocked? screen   (player :x) new_y)]
      (if bxy
        (if bx
          (if by
            [player, false]
            [(assoc player :y new_y), true])
          [(assoc player :x new_x), true])
        [(assoc player :x new_x :y new_y), true]))))

Will i get used to the nested 'if' blocks someday ? Any way to write
the equivalent of a switch case here, if only to improve
readibility ?

* Finally, my code starts with a rather ugly

(ns tank
  (:import (org.newdawn.slick Animation
                              AppGameContainer
                              BasicGame
                              GameContainer
                              Graphics
                              Input
                              SlickException
                              SpriteSheet)
           (org.newdawn.slick.tiled TiledMap)
           (org.newdawn.slick.util Log)))

I know there is no way to import org.newdawn.slick.* (as discussed
here :
http://groups.google.com/group/clojure/browse_thread/thread/fa00a0ff4c264f9a/bcde2b6a4742fe6b?lnk=gst&q=import+all+classes+from+package#bcde2b6a4742fe6b
). What do you do in programs that need huge list of imports ? I'm
kinda spoiled by the Eclipse way of doing this, which is roughly :
import everything, forget about it, and let you IDE clear up the list.
And at least for development part it make things easier. If I hadn't
had the exact list of import to copy paste in this case, I would
probably have gone bored and depressed by the second class to import
manually (lazyness is not only for evaluation ;) )

Thanks for any ideas, sorry if post is too long / newbie-like.

Cheers
PH

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to