REM Racer program REM by Scott Teresi, www.teresi.us REM July 18, 1997 REM Added screen edge repelling force August 7, 1997 NUM = 5: REM NUMBER OF OBJECTS MAXSPD = 1: REM MAXIMUM ALLOWABLE SPEED LOWACC = 0: REM NEW ACCELERATION CHOSEN BETWEEN LOWACC AND HIGHACC VALUES HIGHACC = .01 MINTIME = 100: REM MIN. TIME AN OBJECT WILL KEEP SAME ACCELERATION MAXTIME = 200: REM MAX. TIME AN OBJECT CAN KEEP SAME ACCELERATION REPEL = .5: REM STRENGTH OF SCREEN EDGE REPEL BUFFER = 6: REM IF BUFFER = 6, REPEL ZONE IS 1/6 OF SCREEN WIDTH RIGHTEDGE = 639 BOTTOMEDGE = 479 SCREEN 12: REM 640 BY 480 DIM POSX(NUM), POSY(NUM), SPDX(NUM), SPDY(NUM), ACCX(NUM), ACCY(NUM) DIM TIME(NUM) RANDOMIZE TIMER FOR I = 1 TO NUM POSX(I) = RND(1) * RIGHTEDGE POSY(I) = RND(1) * BOTTOMEDGE SPDX(I) = 0 SPDY(I) = 0 GOSUB NEWDIRECTION NEXT I REM *** MAIN LOOP *** MAINLOOP: FOR I = 1 TO NUM TIME(I) = TIME(I) - 1 IF TIME(I) < 1 THEN GOSUB NEWDIRECTION SPDX(I) = SPDX(I) + ACCX(I) SPDY(I) = SPDY(I) + ACCY(I) IF POSX(I) > RIGHTEDGE - (RIGHTEDGE / BUFFER) THEN SPDX(I) = SPDX(I) - REPEL * 1 / (RIGHTEDGE - POSX(I)) IF POSX(I) < RIGHTEDGE / BUFFER THEN SPDX(I) = SPDX(I) + REPEL * 1 / POSX(I) IF POSY(I) > BOTTOMEDGE - (BOTTOMEDGE / BUFFER) THEN SPDY(I) = SPDY(I) - REPEL * 1 / (BOTTOMEDGE - POSY(I)) IF POSY(I) < BOTTOMEDGE / BUFFER THEN SPDY(I) = SPDY(I) + REPEL * 1 / POSY(I) IF ABS(SPDX(I)) > MAXSPD THEN SPDX(I) = MAXSPD * SGN(SPDX(I)) IF ABS(SPDY(I)) > MAXSPD THEN SPDY(I) = MAXSPD * SGN(SPDY(I)) CIRCLE (POSX(I), POSY(I)), 1, 0 PSET (POSX(I), POSY(I)), 0 POSX(I) = POSX(I) + SPDX(I) POSY(I) = POSY(I) + SPDY(I) IF POSY(I) > BOTTOMEDGE THEN POSY(I) = BOTTOMEDGE - (POSY(I) - BOTTOMEDGE): SPDY(I) = -SPDY(I): ACCY(I) = -ACCY(I) IF POSY(I) < 0 THEN POSY(I) = -POSY(I): SPDY(I) = -SPDY(I): ACCY(I) = -ACCY(I) IF POSX(I) > RIGHTEDGE THEN POSX(I) = RIGHTEDGE - (POSX(I) - RIGHTEDGE): SPDX(I) = -SPDX(I): ACCX(I) = -ACCX(I) IF POSX(I) < 0 THEN POSX(I) = -POSX(I): SPDX(I) = -SPDX(I): ACCX(I) = -ACCX(I) CIRCLE (POSX(I), POSY(I)), 1, 15 PSET (POSX(I), POSY(I)), 15 NEXT I GOTO MAINLOOP NEWDIRECTION: ANGLE = RND(1) * 3.14159 * 2 ACC = RND(1) * (HIGHACC - LOWACC) + LOWACC ACCX(I) = COS(ANGLE) * ACC ACCY(I) = SIN(ANGLE) * ACC TIME(I) = RND(1) * (MAXTIME - MINTIME) + MINTIME RETURN