annotate trunk/tests/ChipmunkDemos/samples/Tank.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.Tank;
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 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 static cpBody *tankBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 static cpBody *tankControlBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 enum int steps = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 enum cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 // turn the control _body based on the angle relative to the actual _body
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 cpVect mouseDelta = cpvsub(mousePos, tankBody.p);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 cpFloat turn = cpvtoangle(cpvunrotate(tankBody.rot, mouseDelta));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 cpBodySetAngle(tankControlBody, tankBody.a - turn);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 // drive the tank towards the mouse
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 if(cpvnear(mousePos, tankBody.p, 30.0)){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 tankControlBody.v = cpvzero; // stop
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 } else {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 cpFloat direction = (cpvdot(mouseDelta, tankBody.rot) > 0.0 ? 1.0 : -1.0);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 tankControlBody.v = cpvrotate(tankBody.rot, cpv(30.0f*direction, 0.0f));
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 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 static cpBody *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 add_box(cpFloat size, cpFloat mass)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 cpv(-size,-size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 cpv(-size, size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 cpv( size, size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 cpv( size,-size),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 cpFloat radius = cpvlength(cpv(size, size));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(mass, cpMomentForPoly(mass, 4, verts.ptr, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 _body.p = cpv(frand()*(640 - 2*radius) - (320 - radius), frand()*(480 - 2*radius) - (240 - radius));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 cpShape *shape = cpSpaceAddShape(space, cpPolyShapeNew(_body, 4, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 shape.e = 0.0f; shape.u = 0.7f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 return _body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 cpSpaceResizeActiveHash(space, 30.0f, 1000);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 space.iterations = 10;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 space.sleepTimeThreshold = 0.5f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 cpBody *staticBody = &space.staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 // Create segments around the edge of the screen.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(-320,240), 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(320,-240), cpv(320,240), 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(320,-240), 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-320,240), cpv(320,240), 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 for(int i=0; i<50; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 cpBody *_body = add_box(10.0, 1.0);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 cpConstraint *pivot = cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, _body, cpvzero, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 pivot.biasCoef = 0.0f; // disable joint correction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 pivot.maxForce = 1000.0f; // emulate linear friction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 cpConstraint *gear = cpSpaceAddConstraint(space, cpGearJointNew(staticBody, _body, 0.0f, 1.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 gear.biasCoef = 0.0f; // disable joint correction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 gear.maxForce = 5000.0f; // emulate angular friction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 // We joint the tank to the control _body and control the tank indirectly by modifying the control _body.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 tankControlBody = cpBodyNew(INFINITY, INFINITY);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 tankBody = add_box(15.0, 10.0);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 cpConstraint *pivot = cpSpaceAddConstraint(space, cpPivotJointNew2(tankControlBody, tankBody, cpvzero, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 pivot.biasCoef = 0.0f; // disable joint correction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110 pivot.maxForce = 10000.0f; // emulate linear friction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 cpConstraint *gear = cpSpaceAddConstraint(space, cpGearJointNew(tankControlBody, tankBody, 0.0f, 1.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 gear.biasCoef = 1.0f; // limit angular correction rate
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 gear.maxBias = 1.0f; // limit angular correction rate
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 gear.maxForce = 500000.0f; // emulate angular friction
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 cpBodyFree(tankControlBody);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128 chipmunkDemo Tank = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129 "Tank",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134 };