2008/1/5, Justin Heyes-Jones <[EMAIL PROTECTED]>: > > On 04/01/2008, Luke J Crook <[EMAIL PROTECTED]> wrote: > > Elliott Slaughter wrote: > > Cool. > > As it happens I've been playing with lispbuilder-sdl writing a > component based engine. The main loop is pretty simple, it just > updates a list of active objects. Each object has a set of components. > One controls animation and drawing, another is physics movement and > collision, a third is the AI or player controls and logic for each > entity. > > What's nice is you can stop the game, add or remove objects and so on, > and then restart the engine. When I'm using lispworks I can do that > without stopping the engine using the repl in lispworks and starting > the engine in emacs. Presumably theres some way to do that in slime > and have to repl's on the same lisp?
Maybe you can use multiple threads? Threading is implementation dependent, but there are some libraries that provide portable multi-threading (like http://common-lisp.net/project/bordeaux-threads/) I'm currently making a pong type game and I aim to make that part of a > tutorial on using lispbuilder-sdl for dynamic game programming. > > The code is at > http://code.google.com/p/lisp-game-engine/ > > but it's not really documented or finished yet. > > -- from dgp.lisp > > (defun engine-init() > "sets up the game engine and returns" > (if *engine-active* > (error "engine-init was already called")) > (sdl:init-sdl) > (sdl:init-sub-systems) > (setf (sdl:frame-rate) 60) ; Set target framerate (or 0 for unlimited) > ;;; TODO handle full screen here > (sdl:window *WINDOW-WIDTH* *WINDOW-HEIGHT* :title-caption "Game > engine" :icon-caption "Game engine") > ;;; init other stuff we want available > (sdl:initialise-default-font) > (setf (sdl:frame-rate) 60) ; Set target framerate (or 0 for unlimited) > (setf *engine-active* t)) > > (defun engine-quit() > "shut sdl down and clean up everything that engine-init did" > (if (null *engine-active*) > (error "engine-init was not called")) > (sprites:flush-image-cache) > (setf *active-game-objects* nil) ; free all game objects to the > garbage collector > (sdl:quit-sub-systems) > (sdl:quit-sdl) > (setf *engine-active* nil)) > > (defun engine-run() > "The main game engine loop, it updates objects then draws them" > (if (null *engine-active*) > (error "engine-init was not called")) > (sdl:with-events () > (:quit-event () t) > > ;;; I've cut out the keyboard handling here for clarity > > (:idle () ;; redraw screen on idle > ;; fill the background > (sdl:clear-display *BG-COLOR*) > > ;; Do stuff here! > > (show-frame-rate) > ;; Update the whole screen > (sdl:update-display)))) > > > So basically a typical session looks like this > > (engine-init) > > add some objects the the active object list > > (engine-run) > > starts the game going (press escape to get back to the repl) > > rewrite some code, add or remove objects and so on > > (engine-run) > > Until you want to clean up everything > > (engine-quit) > > It would be fairly easy I think to add a REPL to main game screen > using our font stuff if that would be useful. It would be pretty handy > for full screen debugging. > > Justin Heyes-Jones > _______________________________________________ > application-builder mailing list > application-builder@lispniks.com > http://www.lispniks.com/mailman/listinfo/application-builder >
_______________________________________________ application-builder mailing list application-builder@lispniks.com http://www.lispniks.com/mailman/listinfo/application-builder