REM Demonstration of the Box2D (v2.2.1 or v2.3.1) Physics Engine REM by Richard Russell, http://www.rtrussell.co.uk/, 26-Jan-2013 MODE 8 : OFF ORIGIN 0,512 INSTALL @lib$+"box2dlib" : PROC_b2Init INSTALL @lib$+"box2ddbg" ON ERROR PROCcleanup : IF ERR=17 CHAIN @lib$+"../examples/tools/touchide" ELSE ERROR 0,REPORT$+" at line "+STR$ERL ON CLOSE PROCcleanup : QUIT gravity_x = 0.0 gravity_y = -9.8 scale = 40 myWorld%% = FN_b2CreateWorld(gravity_x, gravity_y) PROC_b2DebugInit(myWorld%%, %01011, scale) ground%% = FN_b2StaticBox(myWorld%%, 0.0, -0.1, 0.0, 0.0, 0.1) Freq = 4.0 Zeta = 0.7 DIM x(499), y(499) FOR i% = 1 TO 498 x(i%) = i% y(i%) = (RND(1)+RND(1)+RND(1)+RND(1)) / 6 NEXT y(0) = 5.0 : x(0) = x(1) y(499) = 5.0 : x(499) = x(498) road%% = FN_b2ChainFixture(ground%%, 500, x(), y(), 0.9, 0.0, 1.0, FALSE) x() = -3.0, 3.0, 3.0, 0.0, -2.3, -3.0 y() = -1.0, -1.0, 0.0, 1.8, 1.8, 0.4 car%% = FN_b2DynamicBody(myWorld%%, 5.0, 2.2, 0, 0, 0, 0, 0, 0) chassis%% = FN_b2PolygonFixture(car%%, 6, x(), y(), 0.1, 0.0, 1.0) wheel1%% = FN_b2DynamicBody(myWorld%%, 3.0, 0.5, 0, 0, 0, 0, 0, 0.5) tyre1%% = FN_b2CircleFixture(wheel1%%, 0, 0, 0.5, 0.9, 0.0, 1.0) wheel2%% = FN_b2DynamicBody(myWorld%%, 7.0, 0.5, 0, 0, 0, 0, 0, 0.1) tyre2%% = FN_b2CircleFixture(wheel2%%, 0, 0, 0.5, 0.9, 0.0, 1.0) spring1%% = FN_b2WheelJoint(myWorld%%, car%%, wheel1%%, 3.0, 0.5, 0.0, 1.0, Freq, Zeta) spring2%% = FN_b2WheelJoint(myWorld%%, car%%, wheel2%%, 7.0, 0.5, 0.0, 1.0, Freq, Zeta) PROC_b2WheelMotorTorque(spring1%%, 20.0, 1) PROC_b2WheelMotorTorque(spring2%%, 10.0, 0) timeStep = 1.0/60.0 velIterations% = 8 posIterations% = 3 motor = 0 scroll = 0 *REFRESH OFF GCOL 2 VDU 5 REPEAT CLS PROC_b2WheelMotorSpeed(spring1%%, -motor, 1) IF motor = 0 THEN PROC_b2WheelMotorTorque(spring2%%, 20.0, 1) ELSE PROC_b2WheelMotorTorque(spring2%%, 10.0, 0) ENDIF PROC_b2WorldStep(myWorld%%, timeStep, velIterations%, posIterations%) PROC_b2DebugDraw(myWorld%%) MOVE 100,-300 : PRINT "Right-arrow to accelerate, Left-arrow to reverse, space to brake." *REFRESH WAIT 1 CASE INKEY(0) OF WHEN 141: scale *= 1.05 WHEN 140: scale /= 1.05 ENDCASE MOUSE x%, y%, b% IF INKEY(-99) OR b% <> 0 AND ABS(x%-640) < 240 motor *= 0.9 : IF ABS(motor) < 1.0 motor = 0 IF INKEY(-122) OR b% <> 0 AND x% > 880 motor += 1.0 ELSE IF motor > 1.0 motor -= 1.0 IF INKEY(-26) OR b% <> 0 AND x% < 400 motor -= 1.0 ELSE IF motor < -1.0 motor += 1.0 IF INKEY(-1) PROC_b2DebugFlags(4, 0) ELSE PROC_b2DebugFlags(4, 4) PROC_b2GetBody(car%%, x, y, a) scroll = scale * (x - 8) IF scroll < 0 scroll = 0 PROC_b2DebugMatrix(-scroll, 0, scale) UNTIL FALSE PROCcleanup END DEF PROCcleanup myWorld%% += 0 : IF myWorld%% PROC_b2DestroyWorld(myWorld%%) : myWorld%% = 0 PROC_b2Exit ENDPROC