diff trunk/tests/ChipmunkDemos/samples/Pump.d @ 16:af2f61a96318

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/tests/ChipmunkDemos/samples/Pump.d	Sat Dec 04 02:02:29 2010 +0100
@@ -0,0 +1,173 @@
+
+// written in the D programming language
+
+module samples.Pump;
+
+import chipmunkd.chipmunk;
+
+import samples.ChipmunkDemo;
+
+import gameApp;
+
+import std.math;
+
+enum M_PI = PI;
+enum M_PI_2 = PI*0.5f;
+
+static cpSpace *space;
+static cpConstraint *motor;
+
+enum numBalls = 5;
+static cpBody *balls[numBalls];
+
+static void
+update(int ticks)
+{
+	cpFloat coef = (2.0f + arrowDirection.y)/3.0f;
+	cpFloat rate = arrowDirection.x*30.0f*coef;
+	
+	cpSimpleMotorSetRate(motor, rate);
+	motor.maxForce = (rate ? 1000000.0f : 0.0f);
+
+	enum int steps = 2;
+	enum cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
+	
+	for(int i=0; i<steps; i++){
+		cpSpaceStep(space, dt);
+		
+		for(int j=0; j<numBalls; j++){
+			cpBody *ball = balls[j];
+			if(ball.p.x > 320.0f){
+				ball.v = cpvzero;
+				ball.p = cpv(-224.0f, 200.0f);
+			}
+		}
+	}
+}
+
+static cpBody *
+add_ball(cpVect pos)
+{
+	cpBody *_body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForCircle(1.0f, 30, 0, cpvzero)));
+	_body.p = pos;
+	
+	cpShape *shape = cpSpaceAddShape(space, cpCircleShapeNew(_body, 30, cpvzero));
+	shape.e = 0.0f; shape.u = 0.5f;
+	
+	return _body;
+}
+
+static cpSpace *
+init()
+{
+	space = cpSpaceNew();
+	space.gravity = cpv(0, -600);
+	
+	cpBody *staticBody = &space.staticBody;
+	cpShape *shape;
+	
+	// beveling all of the line segments slightly helps prevent things from getting stuck on cracks
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-256,16), cpv(-256,300), 2.0f));
+	shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-256,16), cpv(-192,0), 2.0f));
+	shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-192,0), cpv(-192, -64), 2.0f));
+	shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-128,-64), cpv(-128,144), 2.0f));
+	shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-192,80), cpv(-192,176), 2.0f));
+	shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-192,176), cpv(-128,240), 2.0f));
+	shape.e = 0.0f; shape.u = 0.0f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-128,144), cpv(192,64), 2.0f));
+	shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	cpVect verts[] = [
+		cpv(-30,-80),
+		cpv(-30, 80),
+		cpv( 30, 64),
+		cpv( 30,-80),
+	];
+
+	cpBody *plunger = cpSpaceAddBody(space, cpBodyNew(1.0f, INFINITY));
+	plunger.p = cpv(-160,-80);
+	
+	shape = cpSpaceAddShape(space, cpPolyShapeNew(plunger, 4, verts.ptr, cpvzero));
+	shape.e = 1.0f; shape.u = 0.5f; shape.layers = 1;
+	
+	// add balls to hopper
+	for(int i=0; i<numBalls; i++)
+		balls[i] = add_ball(cpv(-224 + i,80 + 64*i));
+	
+	// add small gear
+	cpBody *smallGear = cpSpaceAddBody(space, cpBodyNew(10.0f, cpMomentForCircle(10.0f, 80, 0, cpvzero)));
+	smallGear.p = cpv(-160,-160);
+	cpBodySetAngle(smallGear, cast(float)-M_PI_2);
+
+	shape = cpSpaceAddShape(space, cpCircleShapeNew(smallGear, 80.0f, cpvzero));
+	shape.layers = 0;
+	
+	cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, smallGear, cpv(-160,-160), cpvzero));
+
+	// add big gear
+	cpBody *bigGear = cpSpaceAddBody(space, cpBodyNew(40.0f, cpMomentForCircle(40.0f, 160, 0, cpvzero)));
+	bigGear.p = cpv(80,-160);
+	cpBodySetAngle(bigGear, cast(float)M_PI_2);
+	
+	shape = cpSpaceAddShape(space, cpCircleShapeNew(bigGear, 160.0f, cpvzero));
+	shape.layers = 0;
+	
+	cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, bigGear, cpv(80,-160), cpvzero));
+
+	// connect the plunger to the small gear.
+	cpSpaceAddConstraint(space, cpPinJointNew(smallGear, plunger, cpv(80,0), cpv(0,0)));
+	// connect the gears.
+	cpSpaceAddConstraint(space, cpGearJointNew(smallGear, bigGear, -M_PI_2, -2.0f));
+	
+	
+	// feeder mechanism
+	cpFloat bottom = -300.0f;
+	cpFloat top = 32.0f;
+	cpBody *feeder = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForSegment(1.0f, cpv(-224.0f, bottom), cpv(-224.0f, top))));
+	feeder.p = cpv(-224, (bottom + top)/2.0f);
+	
+	cpFloat len = top - bottom;
+	cpSpaceAddShape(space, cpSegmentShapeNew(feeder, cpv(0.0f, len/2.0f), cpv(0.0f, -len/2.0f), 20.0f));
+	
+	cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, feeder, cpv(-224.0f, bottom), cpv(0.0f, -len/2.0f)));
+	cpVect anchr = cpBodyWorld2Local(feeder, cpv(-224.0f, -160.0f));
+	cpSpaceAddConstraint(space, cpPinJointNew(feeder, smallGear, anchr, cpv(0.0f, 80.0f)));
+
+	// motorize the second gear
+	motor = cpSpaceAddConstraint(space, cpSimpleMotorNew(staticBody, bigGear, 3.0f));
+
+	return space;
+}
+
+static void
+destroy()
+{
+	cpSpaceFreeChildren(space);
+	cpSpaceFree(space);
+}
+
+chipmunkDemo Pump = {
+	"Pump",
+	null,
+	&init,
+	&update,
+	&destroy,
+};