diff trunk/tests/ChipmunkDemos/samples/UnsafeOps.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/UnsafeOps.d	Sat Dec 04 02:02:29 2010 +0100
@@ -0,0 +1,98 @@
+
+// written in the D programming language
+
+module samples.UnsafeOps;
+
+import chipmunkd.chipmunk;
+
+import samples.ChipmunkDemo;
+
+import gameApp;
+
+import std.math;
+
+static cpSpace *space;
+
+enum M_PI = PI;
+enum M_PI_2 = PI*0.5f;
+
+enum NUM_CIRCLES = 30;
+
+static cpShape *circles[NUM_CIRCLES];
+static cpFloat circleRadius = 30.0f;
+
+static void
+update(int ticks)
+{
+	if(arrowDirection.y){
+		circleRadius = cpfmax(10.0f, circleRadius + arrowDirection.y);
+		
+		for(int i=0; i<NUM_CIRCLES; i++){
+			circles[i]._body.m = cpMomentForCircle(1.0f, 0.0f, circleRadius, cpvzero);
+			cpCircleShapeSetRadius(circles[i], circleRadius);
+		}
+	}
+	
+	int steps = 1;
+	cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
+	
+	for(int i=0; i<steps; i++){
+		cpSpaceStep(space, dt);
+	}
+}
+
+static cpSpace *
+init()
+{
+	cpResetShapeIdCounter();
+	
+	space = cpSpaceNew();
+	space.iterations = 5;
+	space.gravity = cpv(0, -100);
+	
+	cpSpaceResizeStaticHash(space, 40.0f, 999);
+	cpSpaceResizeActiveHash(space, 30.0f, 2999);
+	
+	cpBody *_body, staticBody = &space.staticBody;
+	cpShape *shape;
+	
+	shape = cpSpaceAddStaticShape(space, cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(-320,240), 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddStaticShape(space, cpSegmentShapeNew(staticBody, cpv(320,-240), cpv(320,240), 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+
+	shape = cpSpaceAddStaticShape(space, cpSegmentShapeNew(staticBody, cpv(-320,-240), cpv(320,-240), 0.0f));
+	shape.e = 1.0f; shape.u = 1.0f;
+	shape.layers = NOT_GRABABLE_MASK;
+	
+	for(int i=0; i<NUM_CIRCLES; i++){
+		_body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForCircle(1.0f, 0.0f, circleRadius, cpvzero)));
+		_body.p = cpvmult(cpv(frand()*2.0f - 1.0f, frand()*2.0f - 1.0f), circleRadius*5.0f);
+		
+		circles[i] = shape = cpSpaceAddShape(space, cpCircleShapeNew(_body, circleRadius, cpvzero));
+		shape.e = 0.0f; shape.u = 1.0f;
+	}
+	
+	//strcat(messageString,
+	//	"chipmunk_unsafe.h Contains functions for changing shapes, but they can cause severe stability problems if used incorrectly.\n"
+	//	"Shape changes occur as instantaneous changes to position without an accompanying velocity change. USE WITH CAUTION!");
+	return space;
+}
+
+static void
+destroy()
+{
+	cpSpaceFreeChildren(space);
+	cpSpaceFree(space);
+}
+
+chipmunkDemo UnsafeOps = {
+	"Unsafe Operations",
+	null,
+	&init,
+	&update,
+	&destroy,
+};