' Einfaches 3D-Rennen DIM SHARED s!, xOffs! DECLARE SUB ZeichneRechteck (xp1!, yp1!, xp2!, yp2!, f%) SCREEN 7 po! = 0! v! = 0! xpo! = 0! tAlt! = TIMER SCREEN , , 0, 1 DO ' Himmel LINE (0, 0)-(319, 99), 9, BF ' Kurvenpunkt berechnen q! = po! - 240! * INT(po! / 240!) IF q! > 228! THEN ra! = 0! ELSEIF q! > 220! THEN ra! = (q! - 228!) * .000025 ELSEIF q! > 188! THEN ra! = -.0002 ELSEIF q! > 180! THEN ra! = (184! - q!) * .00005 ELSEIF q! > 158! THEN ra! = .0002 ELSEIF q! > 150! THEN ra! = (q! - 150!) * .000025 ELSEIF q! > 80! THEN ra! = 0! ELSEIF q! > 76! THEN ra! = (q! - 80!) * .000025 ELSEIF q! > 64! THEN ra! = -.0001 ELSEIF q! > 60! THEN ra! = (60 - q!) * .000025 ELSEIF q! > 34! THEN ra! = 0! ELSEIF q! > 30! THEN ra! = (34 - q!) * .000025 ELSEIF q! > 20! THEN ra! = .0001 ELSEIF q! > 16! THEN ra! = (q! - 16!) * .000025 ELSE ra! = 0! END IF ' Strasse FOR y% = 100 TO 199 y1! = CSNG(y%) - 97! p! = po! + 30! / y1! o! = ra! * (120! - y1!) ^ 3! - xpo! * y1! IF p! - INT(p!) > .5 THEN f1% = 15 f2% = 8 ELSE f1% = 4 f2% = 15 END IF x1% = CINT(INT(o! - y1! * 2.5)) + 160 IF x1% > 0 THEN LINE (0, y%)-(x1% - 1, y%), 2 END IF x2% = CINT(INT(o! - y1! * 2!)) + 160 IF x2% > 0 AND x1% < x2% THEN LINE (x1%, y%)-(x2% - 1, y%), f1% END IF x1% = CINT(INT(o! - y1! * .1)) + 160 IF x2% < x1% THEN LINE (x2%, y%)-(x1% - 1, y%), 8 END IF x2% = CINT(INT(o! + y1! * .1)) + 160 IF x2% > 0 AND x1% < x2% THEN LINE (x1%, y%)-(x2% - 1, y%), f2% END IF x1% = CINT(INT(o! + y1! * 2!)) + 160 IF x2% < x1% AND x2% < 320 THEN LINE (x2%, y%)-(x1% - 1, y%), 8 END IF x2% = CINT(INT(o! + y1! * 2.5)) + 160 IF x1% < x2% AND x1% < 320 THEN LINE (x1%, y%)-(x2% - 1, y%), f1% END IF IF x2% < 320 THEN LINE (x2%, y%)-(319, y%), 2 END IF NEXT y% q! = po! - 240! * INT(po! / 240!) IF q! > 2! AND q! < 12! THEN ' Darstellung einer Start-Ampel s! = 30! / (12.2 - q!) xOffs! = ra! * (120! - s!) ^ 3! - xpo! * s! ' S„ulen ZeichneRechteck -2.9, -1.3, -2.5, 1!, 7 ZeichneRechteck 2.5, -1.3, 2.9, 1!, 7 ' Querbalken ZeichneRechteck -2.9, -1.6, 2.9, -1.2, 7 ' Ampel ZeichneRechteck -1.8, -1.9, 1.8, -.9, 0 ' Lichter ZeichneRechteck -1.6, -1.7, -1!, -1.1, 12 ZeichneRechteck -.3, -1.7, .3, -1.1, 14 ZeichneRechteck 1!, -1.7, 1.6, -1.1, 2 END IF ' Leitplanken darstellen q! = po! - 12! * INT(po! / 12!) IF q! < 10! THEN s! = 30! / (10.2 - q!) xOffs! = ra! * (120! - s!) ^ 3! - xpo! * s! ' Linke Leitplanke ZeichneRechteck -2.8, -.3, -2.5, 1!, 15 ZeichneRechteck -2.8, -.1, -2.5, .4, 0 ZeichneRechteck -2.7, 0!, -2.6, .1, 14 ZeichneRechteck -2.7, .2, -2.6, .3, 14 ' Rechte Leitplanke ZeichneRechteck 2.5, -.3, 2.8, 1!, 15 ZeichneRechteck 2.5, -.1, 2.8, .4, 0 ZeichneRechteck 2.6, 0!, 2.7, .1, 14 ZeichneRechteck 2.6, .2, 2.7, .3, 14 END IF PCOPY 0, 1 t$ = INKEY$ SELECT CASE t$ CASE CHR$(0) + "H" v! = v! + .3 CASE CHR$(0) + "P" v! = v! - .3 CASE CHR$(0) + "K" xpo! = xpo! - .05 CASE CHR$(0) + "M" xpo! = xpo! + .05 END SELECT t! = TIMER dt! = t! - tAlt! ' Fliehkraft simulieren xpo! = xpo! - 500! * ra! * v! ^ 2! * dt! ' Reibung auf Wiese simulieren IF ABS(xpo!) > 2.5 THEN v! = v! - 1.5 * dt! * SGN(v!) END IF po! = po! + dt! * v! tAlt! = t! LOOP UNTIL t$ = CHR$(27) OR ABS(xpo!) > 10! OR po! > 732.5 SCREEN 0 WIDTH 80, 25 IF ABS(xpo!) > 10! THEN PRINT "Crash! Game Over!" ELSE PRINT "Finish!" END IF SUB ZeichneRechteck (xp1!, yp1!, xp2!, yp2!, f%) x1% = CINT(INT(xOffs! + xp1! * s!)) + 160 y1% = CINT(INT(s! * yp1!)) + 97 x2% = CINT(INT(xOffs! + xp2! * s!)) + 160 y2% = CINT(INT(s! * yp2!)) + 97 IF x2% >= 0 AND y2% >= 0 AND x2% > x1% AND y2% > y1% AND x1% < 319 AND y1% < 199 THEN LINE (x1% + 1, y1% + 1)-(x2%, y2%), f%, BF END IF END SUB