ON ERROR IF ERR = 17 CHAIN @lib$+"../examples/tools/touchide" ELSE REPORT : END REM Lottery machine simulation using the Box2D (v2.3.1) Physics Engine. REM v1.01 by Richard Russell, http://www.rtrussell.co.uk/, 03-May-2020. REM Lottery graphics (C) Can Stock Photo / AlexLMX, used with permission: REM www.canstockphoto.com/lottery-machine-with-lottery-balls-62931518.html REM This program is compatible with both BBCSDL and BB4W (plus libraries). REM!Embed @dir$+".lottopics/lottobkg.jpg", @dir$+".lottopics/lottofgd.png" REM!Embed @dir$+".lottopics/paddle.png", @dir$+".lottopics/lotto0.png" REM!Embed @dir$+".lottopics/lotto1.png", @dir$+".lottopics/lotto2.png" REM!Embed @dir$+".lottopics/lotto3.png", @dir$+".lottopics/lotto4.png" REM!Embed @dir$+".lottopics/lotto5.png", @dir$+".lottopics/lotto6.png" REM!Embed @dir$+".lottopics/lotto7.png", @dir$+".lottopics/lotto8.png" REM!Embed @dir$+".lottopics/lotto9.png", @lib$+"box2ddbg" REM!Embed @lib$+"box2dlib", @lib$+"box2dgfx", @lib$+"DejaVuSans.ttf" Width% = 800 Height% = 600 VDU 23,22,Width%;Height%;8,16,16,128 OFF INSTALL @lib$+"box2dlib" : PROC_b2Init INSTALL @lib$+"box2dgfx" INSTALL @lib$+"box2ddbg" ON ERROR PROCcleanup : IF ERR = 17 CHAIN @lib$+"../examples/tools/touchide" ELSE REPORT : END ON CLOSE PROCcleanup : QUIT gravity_x = 0.0 gravity_y = -58.8 myWorld%% = FN_b2CreateWorld(gravity_x, gravity_y) PROC_gfxInit(gfx{}, Width%, Height%, 20) PROC_gfxLoad(backgnd{}, @dir$+".lottopics/lottobkg.jpg", 20) PROC_gfxLoad(foregnd{}, @dir$+".lottopics/lottofgd.png", 20) PROC_gfxLoad(paddle{}, @dir$+".lottopics/paddle.png", 20.5) DIM ball{(9)} = paddle{} FOR N% = 0 TO 9 PROC_gfxLoad(ball{(N%)}, @dir$+".lottopics/lotto"+STR$N%+".png", 40) NEXT @vdu%!220 = -11 PROC_b2DebugInit(myWorld%%, %01011, 20) IF INKEY$(-256) = "W" THEN *FONT Arial PROC_gfxMultiply(foregnd{}) PROC_gfxMultiply(paddle{}) FOR N% = 0 TO 9 : PROC_gfxMultiply(ball{(N%)}) : NEXT ELSE OSCLI "font """ + @lib$ + "DejaVuSans""" ENDIF ground%% = FN_b2StaticBox(myWorld%%, 20.0, -0.1, 0.0, 20.0, 0.1) drum%% = FN_b2StaticBox(myWorld%%, 26.5, 20.0, 0.0, 0, 0) PROC_b2SetBullet(drum%%, 1) DIM x(89), y(89), peg%%(5) FOR i% = 0 TO 35 a = 4 * (i% + 1.5) x(i%) = 9*SINRAD(a) y(i%) = -9*COSRAD(a) NEXT rim1%% = FN_b2ChainFixture(drum%%, 36, x(), y(), 1.0, 0.0, 1.0, FALSE) FOR i% = -9 TO 9 STEP 3 a = 180 + 3.8 * i% x = 9*SINRAD(a) y = -9*COSRAD(a) tube%% = FN_b2BoxFixture(drum%%, x, y+10, 0, 0.05, 10.0, 0.0, 0, 1.0) NEXT FOR i% = 0 TO 5 x = 1.7 * (i% - 2.5) peg%%(i%) = FN_b2BoxFixture(drum%%, x, 9.2, 0, 0.1, 0.1, 0.0, 0, 1.0) NEXT FOR i% = 0 TO 35 a = 360 - 4 * (i% + 1.5) x(i%) = 9*SINRAD(a) y(i%) = -9*COSRAD(a) NEXT rim2%% = FN_b2ChainFixture(drum%%, 36, x(), y(), 1.0, 0.0, 1.0, FALSE) DIM ball%%(59) FOR i% = 1 TO 59 x = 22.2 + 1.7 * ((i% - 1) DIV 10) y = 30.0 + 1.4 * ((i% - 1) MOD 10) ball%%(i%) = FN_b2DynamicBody(myWorld%%, x, y, 0.0, 0, 0, 0, 0, 0) ball%% = FN_b2CircleFixture(ball%%(i%), 0, 0, 0.7, 0.2, 0.0, 0.8 + RND(1)*0.4) PROC_b2UserDataBody(ball%%(i%), ball{((i% - 1) DIV 6)}) NEXT paddle%% = FN_b2KinematicBody(myWorld%%, 26.5, 20.0, 0, 0, 0, 1.0, 0, 0) PROC_b2UserDataBody(paddle%%, paddle{}) FOR i% = 0 TO 2 a = 2*PI*i%/3 + 0.9 x = 8.8 * COS(a) y = 8.8 * SIN(a) bumper%% = FN_b2BoxFixture(paddle%%, x, y, a, 0.2, 0.2, 0.0, 0, 1.0) NEXT trap%% = FN_b2KinematicBody(myWorld%%, 26.5, 10.1, 0.0, 0.0, 0.0, 0, 0, 0) side%% = FN_b2BoxFixture(trap%%, 0.0, +0.9, 0, 0.9, 0.1, 1.0, 0, 1.0) base%% = FN_b2BoxFixture(trap%%, 0.9, 0.0, 0, 0.1, 0.9, 1.0, 0, 1.0) wall%% = FN_b2BoxFixture(trap%%, 0.0, -0.9, 0, 0.9, 0.1, 1.0, 0, 1.0) x() = -17, -17, 0.0, 1.5, 1.5, 5.6 y() = 9.0, 5.6, 5.7, 6.6, 9.1, 9.3 chute%% = FN_b2ChainFixture(ground%%, 6, x(), y(), 1.0, 0.0, 1.0, FALSE) barrier%% = FN_b2BoxFixture(ground%%, -0.5, 9.0, 0, 0.05, 1.0, 1.0, 0, 1.0) DIM number{(59)} = paddle{} VDU 5 : COLOR 7, 234, 234, 234 file$ = @tmp$ + "number.tmp.bmp" FOR N% = 1 TO 59 : N$ = STR$(N%) GCOL 7 : RECTANGLE FILL 0, 0, 32, 24 GCOL 0 : MOVE 0,22 : PRINT N$; OSCLI "GSAVE """ + file$ + """ 0, 2, " + STR$(WIDTH(N$)) + ", 20" PROC_gfxLoad(number{(N%)}, file$ , 20) NEXT timeStep = 1.0/60.0 velIterations% = 8 posIterations% = 3 start% = TIME + 200 ready% = start% + 1000 *REFRESH OFF REPEAT PROC_gfxBlit(gfx{},backgnd{}, 20, 15, 0) PROC_gfxRender(gfx{}, myWorld%%) above% = 0 below% = 0 drawn% = 0 FOR N% = 1 TO 59 PROC_b2GetBody(ball%%(N%), x, y, a) PROC_gfxPlot2(gfx{}, number{(N%)}, x, y, a) IF y > 29 above% += 1 IF y < 11 below% += 1 : PROC_b2SetBullet(ball%%(N%), 1) IF y < 8 drawn% += 1 NEXT IF above% = 0 IF below% = 0 PROC_b2SetVelocity(paddle%%, 0, 0, 7.0) IF drawn% = 6 PROC_b2SetVelocity(paddle%%, 0, 0, 0.0) PROC_gfxPlot1(gfx{}, foregnd{}, 20, 5.5, 0) IF INKEY-51 PROC_b2DebugDraw(myWorld%%) IF INKEY-82 WAIT 10 PROC_gfxDisplay FOR N% = 0 TO 5 IF TIME > start% + N%*40 PROC_b2SetFilter(peg%%(N%), &0001, &FFFE, 0) NEXT IF below% > drawn% hold% += 1 ELSE hold% = 0 IF hold% >= 30 PROC_b2SetBody(trap%%, 26.5, 10.1, 0.05) : ready% = TIME + 1000 IF TIME > ready% IF drawn% < 6 PROC_b2SetBody(trap%%, 26.5, 10.1, -PI/2) PROC_b2WorldStep(myWorld%%, timeStep, velIterations%, posIterations%) UNTIL FALSE PROCcleanup END DEF PROCcleanup ON ERROR OFF VDU 23,22,640;500;8,20,16,128 *REFRESH ON myWorld%% += 0 : IF myWorld%% PROC_b2DestroyWorld(myWorld%%) : myWorld%% = 0 PROC_b2DebugExit PROC_gfxExit PROC_b2Exit ENDPROC