BUMP
BUMP | |
Syntax: | BUMP(<Kollisionsquelle>) |
Parameter | |
<Kollisionsquelle>: numerischer Ausdruck im Wertebereich von 1 bis 2 | |
Einordnung | |
Typ: | numerische Funktion |
Kontext: | Sprites |
Aufgabe: | Ermitteln, welche Sprites miteinander oder mit dem Bildschirmvordergrund kollidiert sind |
Abkürzung: | bU |
Token: | $ce $03 (206 3) |
Verwandte Befehle | |
COLLISION, JOY, PEN, POT |
Anmerkung: Dieser Artikel beschreibt die BASIC-Funktion BUMP ab Commodore BASIC V7.0 oder höher.
Die Funktion BUMP dient dazu, abzufragen, ob und welche Sprites seit dem letzten Aufruf miteinander oder mit dem Bildschirmvordergrund kollidiert sind.
Gültige Werte für den Parameter Kollisionsquelle:
- 1: ermittelt, welche Sprites miteinander kollidiert sind.
- 2: ermittelt, welche Sprites mit dem Bildschirmvordergrund kollidiert sind.
Andere Werte für Kollisionsquelle verursachen die Fehlermeldung ?ILLEGAL QUANTITY ERROR.
Hinweis: Die Sprite-Nummerierung folgt der Konvention in BASIC 7.0, beginnt also mit 1 anstatt mit 0.
Das Ergebnis der BUMP-Abfrage ist ein Wert von 0 bis 255, wobei jedes Bit ein Sprite repräsentiert: Bit 0 mit Wertigkeit 1 steht für Sprite 1, Bit 1 mit Wertigkeit 2 für Sprite 2 usw. bis Bit 7 mit Wertigkeit 128 für Sprite 8.
Durch Aufruf der Funktion wird das entsprechende VIC-Register wieder auf 0 gesetzt, somit muss für komplexere Abfragen das Ergebnis in einer Variablen abgelegt werden.
Sprite-Sprite-Kollisionen werden auch im Rahmenbereich des Bildschirms ausgelöst. Der vertikale Kollisionsbereich erstreckt sich von Sprite-Position 0 bis 255, der horizontale Kollisionsbereich von Position 0 bis 352 bei PAL-Ausgabe bzw. 0 bis 362 bei NTSC.
Für eine Kollision müssen sich die Sprites nicht nur überlappen, sondern es müssen tatsächlich sichtbare Pixel übereinander liegen.
Aufgrund der Langsamkeit des BASIC-Interpreters werden häufig noch während der Verarbeitung einer Kollisionsbedingung schon weitere für das selbe Sprite generiert.
Für eine BUMP-Abfrage muss COLLISION nicht aktiv sein.
Beispiele[Bearbeiten | Quelltext bearbeiten]
Einfach[Bearbeiten | Quelltext bearbeiten]
IF BUMP(1)=5 THEN 100
Nur wenn Sprite 1 (Bit 0 gesetzt = 1) genau nur mit Sprite 3 kollidiert (Bit 2 gesetzt = 4) ist, wird Zeile 100 angesprungen.
IF BUMP(2) THEN 100
Hat mindestens ein Sprite eine Kollision mit dem Bildschirmvordergrund ausgelöst, wird Zeile 100 angesprungen.
IF BUMP(2) AND 64 THEN 100
Wenn Sprite 7 (Bit 6 gesetzt = 64) mit dem Bildschirmvordergrund kollidiert ist (unabhängig vom Kollisionsstatus anderer Sprites) Zeile 100 anspringen.
IF (BUMP(2) AND 96) = 96 THEN 100
Wenn Sprite 6 (Bit 5 gesetzt = 32) und Sprite 7 (Bit 6 gesetzt = 64) mit dem Bildschirmvordergrund kollidiert sind (unabhängig vom Kollisionsstatus anderer Sprites) Zeile 100 anspringen.
100 B=BUMP(2): REM KOLLISIONSSTATUS VORDERGRUND MERKEN 110 IF B AND 4 THEN SP=3: GOSUB 2000 120 IF B AND 8 THEN SP=4: GOSUB 2000 ...
Kollisionsstatus mehrerer Sprites unabhängig voneinander abfragen, in SP identifizieren und entsprechend dem jeweiligen Sprite eine Aktion in Unterprogramm ab Zeile 2000 durchführen.
ON BUMP(2) GOTO 100,200,300
Verzweigt mit Hilfe einer ON-GOTO-Konstruktion: Zeile 100 wird angesprungen, wenn nur Sprite 1 eine Kollision mit dem Vordergrund ausgelöst hat, Zeile 200 wird aufgerufen nur bei Sprite 2 und Zeile 300, wenn sowohl Sprite 1 als auch Sprite 2 eine Kollision verursacht haben. Bei allen anderen möglichen Kombinationen wird die Programmausführung beim nächsten Befehl fortgesetzt.
Komplex[Bearbeiten | Quelltext bearbeiten]
Ein kleines Spiel: Manövriere das "Raumschiff" (das gedrehte Quadrat) durch die sich bewegenden Bälle, siehe auch das Beispiel bei COLLISION.
10 REM SPRITES UND VARIABLEN INITIALISIEREN 20 GRAPHIC 1,1:CIRCLE 1,12,10,5:PAINT 1,12,10:SSHAPE S$,0,0,23,20 30 BOX 1,27,5,37,15,45:SSHAPE R$,24,0,47,20:SPRSAV R$,8 40 I$="{links}{rechts}{oben}{unten}":DIM DX(4),DY(4):DX(1)=5:DX(2)=-5:DY(3)=5:DY(4)=-5 50 DIM BM(8),SP(8):BM=1 60 FOR I=1 TO 7:BM(I)=BM:BM=BM2*2:SP(I)=1+(I AND 3):SPRSAV S$,I:NEXT 70 REM GRAFIK AUFBAUEN UND SPRITES EINSCHALTEN 80 SCNCLR 1:WIDTH 1:COLOR 1,1 90 BOX 1,0,0,319,12,0,1:BOX 1,0,187,319,199,0,1 100 FOR I=1 TO 7:MOVSPR I,40*I+5,200:MOVSPR I,A(I)#SP(I):SPRITE I,1,I,1:NEXT 110 MOVSPR 8,320,150:SPRITE 8,1,1,0:REM "RAUMSCHIFF" EINSCHALTEN 120 B=BUMP(2):B=0:REM VERALTETE KOLLISIONEN LOESCHEN 130 GS=0 140 COLLISION 1,1000:REM KOLLISION MIT RAUMSCHIFF UEBER SUBROUTINE 150 REM HAUPTTEIL 160 DO 170 DO:GET K$:IN=INSTR(I$,K$):IF IN THEN MOVSPR 8,-(DX(IN)),-(DY(IN)):GET K$:IN=INSTR(I$,K$):IF IN THEN MOVSPR 8,-(DX(IN)),-(DY(IN)) 180 IF RSPPOS(8,0)<24 THEN GS=2:EXIT:REM GS (GAMESTATUS) = SIEG 190 B=BUMP(2) AND NOT B:LOOP UNTIL B 200 IF GS THEN EXIT 210 FOR I=1 TO 7 220 IF B AND BM(I) THEN BEGIN 230 Y=RSPPOS(I,1):IF Y<99 THEN MOVSPR I,180#SP(I):MOVSPR I,+0,56:ELSE MOVSPR I,0#SP(I):MOVSPR I,+0,223 240 BEND 250 NEXT 260 LOOP UNTIL GS 270 REM SPRITES AUSSCHALTEN 280 FOR I=1 TO 8:SPRITE I,0:MOVSPR I,0#0:NEXT 290 IF GS=1 THEN CHAR 1,18,8,"GAME":CHAR 1,18,10,"OVER!":ELSE CHAR 1,15,8,"GESCHAFFT!" 300 CHAR 1,10,13,"NOCHMAL SPIELEN (J/N)?" 310 DO:GETKEY K$:LOOP UNTIL K$="J" OR K$="N" 320 IF K$="J" THEN 80 330 GRAPHIC 0 340 END 1000 GS=1:REM GAMESTATUS = GAME OVER 1010 RETURN
APPEND | BANK | BEGIN | BEND | BLOAD | BOOT | BSAVE | BUMP | CATALOG | COLLISION | COLOR | CONCAT | DCLEAR | DCLOSE | DOPEN | DVERIFY | ENVELOPE | FAST | FETCH | FILTER | GO64 | MOVSPR | (OFF) | PEN | PLAY | POINTER | POT | (QUIT) | RECORD | RREG | RSPCOLOR | RSPPOS | RSPRITE | RWINDOW | SLEEP | SLOW | SOUND | SPRCOLOR | SPRDEF | SPRITE | SPRSAV | STASH | SWAP | TEMPO | WIDTH | WINDOW | XOR