[plt-scheme] MrEd and continuations
Hi, I'm trying to write a simple game engine to use with opengl and
mred. Even though such applications must run with a main
update-draw-checkevents loop, I would like to express the behaviour of
a "game unit" (basically an object with callbacks for update, draw,
handle key event. . .) as a linear sequence of steps. I have decided
to use continuations for this.
Here is a very contrived example of the kind of thing I am trying to do:
(define behavior
(let ([exit '*])
(letrec ([execute
(lambda ()
(do ((i 0 (+ 1 i))) (#f)
(printf "behavior ~a~n" i)
(call/cc (lambda (x)
(set! execute x)
(exit)))))])
(lambda ()
(call/cc (lambda (x)
(set! exit x)
(execute)))))))
Of course, with a behaviour this simple it would make more sense to
simply manually store the state and increment it once a frame, but
this is for example only. A more usual behaviour would be something
which provides the player with a sequence of levels, or sets up a
menu, waits for input (done by returning right away except when it's
time to do something), then shows a new menu. This could also be
extended to providing AI for individual units on the playing field, as
their behaviours could then be implemented in a linear fashion instead
of manually managing a complicated state machine.
In any case, a problem arises when I actually try and use this code.
It seems that MrEd sets up a continuation barrier around its callbacks
(I'm curious as to the reasons for this), so the continuation I make
one update can no longer be called in the next update. What should I
do about this? Should I be looking for a different way to implement
this?
Thanks in advance
Henk Boom