BUMP

Aus C64-Wiki
Wechseln zu: Navigation, Suche
BUMP
Format: 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
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]

Einfach[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]

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