annotate trunk/tests/ChipmunkDemos/samples/Sensors.d @ 16:af2f61a96318

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
1
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
2 // written in the D programming language
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4 module samples.Sensors;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6 import chipmunkd.chipmunk;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8 import samples.ChipmunkDemo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 enum CollisionTypes {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 BALL_TYPE,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 BLOCKING_SENSOR_TYPE,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 CATCH_SENSOR_TYPE,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 };
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 struct Emitter {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 int queue;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 int blocked;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 cpVect position;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 static Emitter emitterInstance;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 static cpBool
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 blockerBegin(cpArbiter *arb, cpSpace *space, void *unused)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 mixin(CP_ARBITER_GET_SHAPES!("arb", "a", "b"));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 Emitter *emitter = cast(Emitter *) a.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 emitter.blocked++;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 return cpFalse; // Return values from sensors callbacks are ignored,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 blockerSeparate(cpArbiter *arb, cpSpace *space, void *unused)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 mixin(CP_ARBITER_GET_SHAPES!("arb", "a", "b"));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 Emitter *emitter = cast(Emitter *)a.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 emitter.blocked--;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 postStepRemove(cpSpace *space, cpShape *shape, void *unused)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 cpSpaceRemoveBody(space, shape._body);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 cpSpaceRemoveShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 cpBodyFree(shape._body);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 cpShapeFree(shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 static cpBool
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 catcherBarBegin(cpArbiter *arb, cpSpace *space, void *unused)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 mixin(CP_ARBITER_GET_SHAPES!("arb", "a", "b"));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 Emitter *emitter = cast(Emitter *) a.data;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 emitter.queue++;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 cpSpaceAddPostStepCallback(space, cast(cpPostStepFunc)&postStepRemove, b, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 return cpFalse;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 static cpFloat frand_unit(){return 2.0f*(frand()) - 1.0f;}
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 int steps = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 if(!emitterInstance.blocked && emitterInstance.queue){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 emitterInstance.queue--;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForCircle(1.0f, 15.0f, 0.0f, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 _body.p = emitterInstance.position;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 _body.v = cpvmult(cpv(frand_unit(), frand_unit()), 100.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 cpShape *shape = cpSpaceAddShape(space, cpCircleShapeNew(_body, 15.0f, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 shape.collision_type = CollisionTypes.BALL_TYPE;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 space.iterations = 10;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 space.gravity = cpv(0, -100);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 cpBody *staticBody = &space.staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 // Data structure for our ball emitter
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 // We'll use two sensors for it, one to see if the emitter is blocked
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 // a second to catch the balls and add them back to the emitter
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 emitterInstance.queue = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 emitterInstance.blocked = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 emitterInstance.position = cpv(0, 150);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 // Create our blocking sensor, so we know when the emitter is clear to emit another ball
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 shape = cpSpaceAddShape(space, cpCircleShapeNew(staticBody, 15.0f, emitterInstance.position));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 shape.sensor = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 shape.collision_type = CollisionTypes.BLOCKING_SENSOR_TYPE;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 shape.data = &emitterInstance;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 // Create our catch sensor to requeue the balls when they reach the bottom of the screen
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-2000, -200), cpv(2000, -200), 15.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119 shape.sensor = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 shape.collision_type = CollisionTypes.CATCH_SENSOR_TYPE;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 shape.data = &emitterInstance;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 cpSpaceAddCollisionHandler(space, CollisionTypes.BLOCKING_SENSOR_TYPE, CollisionTypes.BALL_TYPE, &blockerBegin, null, null, &blockerSeparate, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124 cpSpaceAddCollisionHandler(space, CollisionTypes.CATCH_SENSOR_TYPE, CollisionTypes.BALL_TYPE, &catcherBarBegin, null, null, null, null);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136 chipmunkDemo Sensors = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
137 "Sensors",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
138 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
139 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
140 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
141 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
142 };