annotate trunk/tests/ChipmunkDemos/samples/TheoJansen.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.TheoJansen;
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 import gameApp;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 import std.math;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 enum M_PI = PI;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 enum M_PI_2 = PI*0.5f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 static cpConstraint *motor;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 cpFloat coef = (2.0f + arrowDirection.y)/3.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 cpFloat rate = arrowDirection.x*10.0f*coef;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 cpSimpleMotorSetRate(motor, rate);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 motor.maxForce = (rate) ? 100000.0f : 0.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 enum int steps = 3;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 enum cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 }
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 cpFloat seg_radius = 3.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 make_leg(cpFloat side, cpFloat offset, cpBody *chassis, cpBody *crank, cpVect anchor)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 cpVect a, b;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 cpFloat leg_mass = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 // make leg
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 a = cpvzero, b = cpv(0.0f, side);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 cpBody *upper_leg = cpBodyNew(leg_mass, cpMomentForSegment(leg_mass, a, b));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 upper_leg.p = cpv(offset, 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 cpSpaceAddBody(space, upper_leg);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 cpSpaceAddShape(space, cpSegmentShapeNew(upper_leg, a, b, seg_radius));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 cpSpaceAddConstraint(space, cpPivotJointNew2(chassis, upper_leg, cpv(offset, 0.0f), cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 // lower leg
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 a = cpvzero, b = cpv(0.0f, -1.0f*side);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 cpBody *lower_leg = cpBodyNew(leg_mass, cpMomentForSegment(leg_mass, a, b));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 lower_leg.p = cpv(offset, -side);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 cpSpaceAddBody(space, lower_leg);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 shape = cpSegmentShapeNew(lower_leg, a, b, seg_radius);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 shape.group = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 shape = cpCircleShapeNew(lower_leg, seg_radius*2.0f, b);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 shape.group = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 shape.e = 0.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 cpSpaceAddConstraint(space, cpPinJointNew(chassis, lower_leg, cpv(offset, 0.0f), cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 cpSpaceAddConstraint(space, cpGearJointNew(upper_leg, lower_leg, 0.0f, 1.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 cpConstraint *constraint;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 cpFloat diag = cpfsqrt(side*side + offset*offset);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 constraint = cpPinJointNew(crank, upper_leg, anchor, cpv(0.0f, side));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 cpPinJointSetDist(constraint, diag);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 cpSpaceAddConstraint(space, constraint);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 constraint = cpPinJointNew(crank, lower_leg, anchor, cpvzero);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 cpPinJointSetDist(constraint, diag);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 cpSpaceAddConstraint(space, constraint);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 space.iterations = 20;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 space.gravity = cpv(0,-500);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 cpBody *staticBody = &space.staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 cpVect a, b;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 // Create segments around the edge of the screen.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 shape = cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(-320,240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103 shape = cpSegmentShapeNew(staticBody, cpv(320,-240), cpv(320,240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 shape = cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(320,-240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 cpFloat offset = 30.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 // make chassis
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116 cpFloat chassis_mass = 2.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 a = cpv(-offset, 0.0f), b = cpv(offset, 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 cpBody *chassis = cpBodyNew(chassis_mass, cpMomentForSegment(chassis_mass, a, b));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119 cpSpaceAddBody(space, chassis);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 shape = cpSegmentShapeNew(chassis, a, b, seg_radius);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 shape.group = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124 // make crank
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 cpFloat crank_mass = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 cpFloat crank_radius = 13.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 cpBody *crank = cpBodyNew(crank_mass, cpMomentForCircle(crank_mass, crank_radius, 0.0f, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128 cpSpaceAddBody(space, crank);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129 shape = cpCircleShapeNew(crank, crank_radius, cpvzero);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 shape.group = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 cpSpaceAddShape(space, shape);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 cpSpaceAddConstraint(space, cpPivotJointNew2(chassis, crank, cpvzero, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 cpFloat side = 30.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136 int num_legs = 2;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
137 for(int i=0; i<num_legs; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
138 make_leg(side, offset, chassis, crank, cpvmult(cpvforangle(cast(cpFloat)(2*i+0)/cast(cpFloat)num_legs*M_PI), crank_radius));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
139 make_leg(side, -offset, chassis, crank, cpvmult(cpvforangle(cast(cpFloat)(2*i+1)/cast(cpFloat)num_legs*M_PI), crank_radius));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
140 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
141
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
142 motor = cpSimpleMotorNew(chassis, crank, 6.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
143 cpSpaceAddConstraint(space, motor);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
144
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
145 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
146 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
147
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
148 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
149 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
150 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
151 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
152 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
153 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
154
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
155 chipmunkDemo TheoJansen = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
156 "Theo Jansen Machine",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
157 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
158 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
159 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
160 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
161 };