' Kollisionsdemo DECLARE FUNCTION Kollision% (s1%(), s2%(), dx%, dy%) DIM Stern1%(187), AndMskStern1%(187), Stern2%(2627), AndMskStern2%(2627) SCREEN 7 ' Sprites zeichnen und initialisieren ' Kleiner Stern LINE (10, 10)-(30, 20), 14 LINE -(20, 40), 14 LINE -(10, 10), 14 PAINT (20, 23), 14 LINE (10, 38)-(27, 12), 13 LINE -(29, 34), 13 LINE -(10, 38), 13 PAINT (22, 28), 13 GET (10, 10)-(30, 40), Stern1% ' AND-Maske generieren FOR y% = 10 TO 40 FOR x% = 10 TO 30 IF POINT(x%, y%) = 0 THEN PSET (x% + 40, y%), 15 ELSE PSET (x% + 40, y%), 0 END IF NEXT x% NEXT y% GET (50, 10)-(70, 40), AndMskStern1% ' Grosser Stern Pi! = 4! * ATN(1!) FOR i% = 1 TO 12 w! = CSNG(i%) * Pi! / 6! LINE (60! + 50! * COS(w!), 110! + 50! * SIN(w!))-(60! + 25! * COS(w! + .8), 110! + 25! * SIN(w! + .8)), i% LINE -(60! + 35! * COS(w! - 1!), 110! + 35! * SIN(w! - 1)), i% LINE -(60! + 50! * COS(w!), 110! + 50! * SIN(w!)), i% PAINT (60! + 40! * COS(w!), 110! + 40! * SIN(w!)), i% NEXT i% GET (10, 60)-(110, 160), Stern2% ' AND-Maske zum 2. Stern FOR y% = 60 TO 160 FOR x% = 10 TO 110 IF POINT(x%, y%) = 0 THEN PSET (x% + 120, y%), 15 ELSE PSET (x% + 120, y%), 0 END IF NEXT x% NEXT y% GET (130, 60)-(230, 160), AndMskStern2% ' Animation: Statische Hintergrundszene erstellen SCREEN , , 4 CLS FOR i% = 1 TO 50 LINE (10! + 300! * RND, 10! + 164! * RND)-(10! + 300! * RND, 10! + 164! * RND), 1 + CINT(INT(15! * RND)) NEXT i% LOCATE 24, 1 PRINT "Bewegen mit Pfeiltasten, Umschalten mit"; LOCATE 25, 1 PRINT "Leertaste, Ende mit Esc"; x1% = 40 y1% = 20 x2% = 100 y2% = 30 kollAlt% = 0 s1% = -1 sei% = 0 DO PCOPY 4, (sei% + 1) MOD 3 SCREEN , , 3, sei% koll% = Kollision%(AndMskStern1%(), AndMskStern2%(), x2% - x1%, y2% - y1%) IF koll% AND NOT kollAlt% THEN SOUND 70, 1 END IF kollAlt% = koll% SCREEN , , (sei% + 1) MOD 3, sei% IF koll% THEN LOCATE 25, 31 COLOR 12 PRINT "Crash!"; END IF LOCATE 25, 38 IF s1% THEN COLOR 13 PRINT "S1"; ELSE COLOR 4 PRINT "S2"; END IF PUT (x2%, y2%), AndMskStern2%, AND PUT (x2%, y2%), Stern2% PUT (x1%, y1%), AndMskStern1%, AND PUT (x1%, y1%), Stern1%, XOR sei% = (sei% + 1) MOD 3 SCREEN , , (sei% + 1) MOD 3, sei% DO t$ = INKEY$ LOOP WHILE t$ = "" SELECT CASE t$ CASE CHR$(0) + "H" IF s1% THEN IF y1% > 0 THEN y1% = y1% - 1 END IF ELSE IF y2% > 0 THEN y2% = y2% - 1 END IF END IF CASE CHR$(0) + "K" IF s1% THEN IF x1% > 0 THEN x1% = x1% - 1 END IF ELSE IF x2% > 0 THEN x2% = x2% - 1 END IF END IF CASE CHR$(0) + "M" IF s1% THEN IF x1% < 299 THEN x1% = x1% + 1 END IF ELSE IF x2% < 219 THEN x2% = x2% + 1 END IF END IF CASE CHR$(0) + "P" IF s1% THEN IF y1% < 169 THEN y1% = y1% + 1 END IF ELSE IF y2% < 99 THEN y2% = y2% + 1 END IF END IF CASE " " s1% = NOT s1% END SELECT LOOP UNTIL t$ = CHR$(27) SCREEN 0 WIDTH 80, 25 FUNCTION Kollision% (s1%(), s2%(), dx%, dy%) IF s1%(LBOUND(s1%)) <= dx% OR s1%(LBOUND(s1%) + 1) <= dy% OR s2%(LBOUND(s2%)) <= -dx% OR s2%(LBOUND(s2%) + 1) <= -dy% THEN Kollision% = 0 ELSE IF dx% < 0 THEN xPlus% = -dx% ELSE xPlus% = 0 END IF IF dy% < 0 THEN yPlus% = -dy% ELSE yPlus% = 0 END IF PUT (xPlus%, yPlus%), s1%, PSET ' Kollisionsfeststellung: Masken berlagert gibt "Lcher"! PUT (xPlus% + dx%, yPlus% + dy%), s2%, OR IF dx% < 0 THEN xMin% = xPlus% ELSE xMin% = xPlus% + dx% END IF IF dy% < 0 THEN yMin% = yPlus% ELSE yMin% = yPlus% + dy% END IF IF s1%(LBOUND(s1%)) < dx% + s2%(LBOUND(s2%)) THEN xMax% = xPlus% + s1%(LBOUND(s1%)) ELSE xMax% = xPlus% + dx% + s2%(LBOUND(s2%)) END IF IF s1%(LBOUND(s1%) + 1) < dy% + s2%(LBOUND(s2%) + 1) THEN yMax% = yPlus% + s1%(LBOUND(s1%) + 1) ELSE yMax% = yPlus% + dy% + s2%(LBOUND(s2%) + 1) END IF keineKoll% = -1 y% = yMin% WHILE keineKoll% AND y% < yMax% x% = xMin% WHILE keineKoll% AND x% < xMax% IF POINT(x%, y%) = 0 THEN keineKoll% = 0 END IF x% = x% + 1 WEND y% = y% + 1 WEND Kollision% = NOT keineKoll% END IF END FUNCTION