trac ticket #1
Erik Auerswald
auerswal at unix-ag.uni-kl.de
Sat Sep 3 11:27:13 EDT 2005
Hi,
I think I finally understood what is ask for in the ticket... since I
havn't found out how to change/annotate the ticket in the wiki I write a
mail.
Attached to the mail are 2 patches:
The first implements an obj_alarm() function the same way as
sprite_alarm(), but in engine/schedule.[hc].
The second patch uses this function to enforce a re-generation limit in
the singleton generator. The second patch is only included as a test
case for the otherwise unused obj_alarm() function and includes some
debugging output (the changes in the level 1 settings file are for
debugging purposes only). I don't think this patch is ready to apply to
svn.
Both patches use the delay_to_frames() function of my previous
timing-step1 patch.
If this really implements the request from the ticket I can apply patch 1
to svn (after the timing patch of course (at least the delay_to_frames()
function)).
Erik
-------------- next part --------------
diff -uNrB timing-step1/src/engine/schedule.c object_alarm/src/engine/schedule.c
--- timing-step1/src/engine/schedule.c 2005-09-02 20:54:53.000000000 +0200
+++ object_alarm/src/engine/schedule.c 2005-09-03 14:32:02.000000000 +0200
@@ -101,3 +101,13 @@
return 0;
}
}
+
+static void send_obj_alarm(msg_t msg, void *obj)
+{
+ obj_message(obj, msg);
+}
+
+void obj_alarm(unsigned int delay, void *obj, msg_t msg)
+{
+ schedule(delay_to_frames(delay), SCHED_NORMAL, send_obj_alarm, msg, obj);
+}
diff -uNrB timing-step1/src/engine/schedule.h object_alarm/src/engine/schedule.h
--- timing-step1/src/engine/schedule.h 2005-09-02 20:58:43.000000000 +0200
+++ object_alarm/src/engine/schedule.h 2005-09-03 14:31:27.000000000 +0200
@@ -27,5 +27,7 @@
{
return (delay * FRAMERATE) / 10;
}
+/* send a message to the object after a delay (in 100ms) */
+void obj_alarm(unsigned int delay, void *obj, msg_t msg);
#endif
-------------- next part --------------
diff -uNrB object_alarm/share/levels/1/settings generator_poc/share/levels/1/settings
--- object_alarm/share/levels/1/settings 2005-08-19 22:24:02.000000000 +0200
+++ generator_poc/share/levels/1/settings 2005-09-03 15:09:33.000000000 +0200
@@ -11,15 +11,15 @@
generator multi bird 400 300 3 rx=240 ry=120 vx=2 vy=2 timeout=30
# ...and two clouds
-generator singleton cloud 80 250 99 vx=0.5 ry=150 timeout=50
-generator singleton cloud 720 250 99 vx=-0.5 ry=150 timeout=70
+generator singleton cloud 80 250 99 vx=0.5 ry=150 timeout=50 objtag=cloud1
+generator singleton cloud 720 250 99 vx=-0.5 ry=150 timeout=70 objtag=cloud2
# players: sprite x y lives [keys]
generator player biplane 100 500 3 objtag=p1plane
generator player biplane 700 500 3 objtag=p2plane
# infinitely fuel at 5 sec intervals (after previous barrel taken)
-generator singleton fuel 400 520 0 timeout=50
+generator singleton fuel 400 520 0 timeout=50 objtag=fuel
# level ends when 5 birds are killed
trigger level-done spritekill bird 5 "msg=Five birds killed!"
diff -uNrB object_alarm/src/engine/generator.c generator_poc/src/engine/generator.c
--- object_alarm/src/engine/generator.c 2005-08-19 22:31:03.000000000 +0200
+++ generator_poc/src/engine/generator.c 2005-09-03 15:06:20.000000000 +0200
@@ -21,7 +21,8 @@
/* generator bitflags */
enum {
GENERATOR_ACTIVE = 1,
- GENERATOR_COUNTED = 2
+ GENERATOR_COUNTED = 2,
+ GENERATOR_SCHEDULED = 4
};
#define GENERATOR_ACTIVATE(g) ((g)->flags |= GENERATOR_ACTIVE)
#define GENERATOR_DEACTIVATE(g) ((g)->flags &= ~GENERATOR_ACTIVE)
@@ -31,6 +32,10 @@
#define GENERATOR_UNLIMIT_COUNT(g) ((g)->flags &= ~GENERATOR_COUNTED)
#define GENERATOR_IS_COUNT_LIMITED(g) ((g)->flags & GENERATOR_COUNTED)
+#define GENERATOR_SCHEDULE(g) ((g)->flags |= GENERATOR_SCHEDULED)
+#define GENERATOR_IS_SCHEDULED(g) ((g)->flags & GENERATOR_SCHEDULED)
+#define GENERATOR_CLEAR_SCHEDULE(g) ((g)->flags &= ~GENERATOR_SCHEDULED)
+
/* ------------- generator type ------------------ */
typedef struct generator {
@@ -250,6 +255,15 @@
obj_unlock(old);
break;
}
+ /* generate sprite after delay */
+ if(!GENERATOR_IS_SCHEDULED(g)) {
+printf("frame %u: scheduling generation of %s to %u\n", frame_nr(), g->tag, frame_nr() + delay_to_frames(g->timeout));
+ obj_alarm(g->timeout, obj, msg_generate());
+ GENERATOR_SCHEDULE(g);
+ }
+ break;
+ case MSG_GENERATE:
+printf("frame %u: got MSG_GENERATE for %s\n", frame_nr(), g->tag);
/* create new sprite... */
if (!(s = create_generator_sprite(g))) {
break;
@@ -268,6 +282,7 @@
/* generator has finished */
GENERATOR_DEACTIVATE(g);
}
+ GENERATOR_CLEAR_SCHEDULE(g);
break;
default:
return MSG_RET_UNKNOWN;
diff -uNrB object_alarm/src/engine/msg_types.h generator_poc/src/engine/msg_types.h
--- object_alarm/src/engine/msg_types.h 2005-08-19 22:31:03.000000000 +0200
+++ generator_poc/src/engine/msg_types.h 2005-09-03 14:41:44.000000000 +0200
@@ -54,6 +54,9 @@
MSG_BGSTUCK,
MSG_OUTOFBOUNDS,
+ /* tell a generator to generate a sprite */
+ MSG_GENERATE,
+
MSG_ENDOFTYPES /* Must be the last message type! */
};
@@ -209,4 +212,10 @@
return m;
}
+static INLINE msg_t msg_generate(void)
+{
+ msg_t m = {MSG_GENERATE};
+ return m;
+}
+
#endif
More information about the airstrike
mailing list