MOB SET

Aus C64-Wiki
Wechseln zu: Navigation, Suche
MOB SET
Format: MOB SET <n>, <bn>, <f>, <pr>, <r>
Parameter
n: 0..7 (Spritenummer)
bn: 0..255 (Blocknummer)
f: 0..15 (Farbe für B (Hires) oder C (Multi))
pr: 0 oder 1 (Sprite-Priorität)
r: 0 oder 1 (Auflösung, Hires oder Multi)
Einordnung
Typ: Anweisung
Kontext: Sprites
Aufgabe: Sprite-Eigenschaften festlegen
Abkürzung: keine
Verwandte Befehle
DESIGN - @ - CMOB


Dieser Artikel beschreibt das Simons'-Basic-Schlüsselwort MOB SET.

Typ: Anweisung
Syntax: MOB SET <n>, <bn>, <f>, <pr>, <r>

Mit MOB SET erledigt man einen Teil der Sprite-Definitionen, und zwar legt dieser Befehl vor allem fest, welches der acht Sprites sich auf welchen Speicherblock beziehen soll. Dafür sind die ersten beiden Parameter des Befehls zuständig (<n> und <bn>). Welche Blocknummern für <bn> gewählt werden dürfen, kann man beim Befehl DESIGN nachlesen.

Die nächste Eigenschaft, die MOB SET festlegt, ist die Farbe des Definitionsbuchstaben B bei hochauflösenden Sprites bzw. C bei Multicolor-Sprites (siehe @). (Die anderen Definitionsbuchstaben färbt CMOB ein.)

Der vierte Parameter steuert die Priorität eines Sprites gegenüber dem Hintergrund (die Priorität gegenüber den anderen Sprites regelt der C64 über die Sprite-Nummer). Ein Wert von 0 für <pr> bedeutet, dass das Sprite immer vor den Zeichen auf dem Bildschirm agiert. Eine 1 dagegen lässt ein Sprite hinter Bildschirmzeichen verschwinden.

Zuletzt wird endgültig festgelegt, ob ein Sprite hochauflösend sein soll (Wert 0 für <r>) oder aber in Multicolor-Darstellung erscheint (Wert 1). Diese Angaben mussten zwar auch bei der Pixeldefinition (DESIGN und @) bereits gemacht werden, hatten dort aber nur beschreibenden Charakter. Erst mit MOB SET erhält ein Sprite seinen Darstellungsmodus tatsächlich zugewiesen.

Beachten: Die Zuordnung der Buchstaben B und C ändert sich je nach Darstellungsmodus des Sprites. Das ist ärgerlich und führt oft zu einer Fehlersuche, ist aber nicht zu ändern. Siehe dazu die Befehle @ und CMOB.

Beispiele[Bearbeiten]

Beispiel 1[Bearbeiten]

Multicolor mit DESIGN 1


; definiert ein Multicolor-Sprite für den Simons'-Basic-Textmodus
; die Zeile 1750 macht das Sprite sichtbar
; 
1700 PROC msprite
1710   DESIGN 1, 14*64
1720   @...bbbbb....
1721   @.bbb...bbb..
1722   @bb.cc.cc.bb.
1723   @bb...c...bb.
1724   @bb...c...bb.
1725   @.bbbcccbbb..
1726   @...bbbbb....
1727   @b...ddd.....
1728   @bb..ddd.....
1729   @bbbbdddbb...
1730   @..bbdddbb...
1731   @....ddd.bb..
1732   @....ddd..bb.
1733   @....ddd...b.
1734   @....ddd.....
1735   @..ccc.ccc...
1736   @.ccc...ccc..
1737   @.cc.....cc..
1738   @ccc.....ccc.
1739   @ccc.....ccc.
1740   @bbbbbbbbbbbb
1750   COLOUR 9,9: MOB SET 2,14,8,0,1: CMOB 7,6: s8=300: z8=205: MMOB 2,0,0,s8,z8,2,200
1760 END PROC

Entnommen aus "Das Trainingsbuch zum Simons' Basic".

Beispiel 2[Bearbeiten]

Anwendungsbeispiel


Achtung: TSB-Syntax!

Die Formatierung dieser Druckausgabe des Demoprogramms wurde vorgenommen mit dem Tool "BLister" auf der Diskette der Simons-Basic-Erweiterung TSB.

; in dieser kleinen Anwendung werden Sprites definiert 
; und verwendet und zur Untermalung hier und da Töne 
; eingesetzt

  10 los!
  20 REPEAT :
       n4=0:                             ; Zähler für Sprite-Wechsel
       bildschirm:
       anzeige
  30   REPEAT :
         n4=n4+1:
         wahl:                           ; Sprite-Form und -Position 
         setzen:                         ; auswählen und anzeigen
         warte:                          ; auf Reaktion warten
         anzeige:                        ; Ergebnis anzeigen
       UNTIL r=1 OR en
  40   IF r<>1 THEN treffer
  50   aus:
       n3=n3+1:                          ; Durchgänge zählen (à 1 Minute)
       en=0
  60 UNTIL r=1 OR (n3=3)                 ; nach 3 Durchgängen ist Schluss
  70 anzeige:
     PRINT "{home}"
  80 END 

1000 PROC los!                           ; Variablen-Initialisierung
1010   b0=14:
       b1=13:
       b2=15:
       m=0:                              ; Spritenummer
       ms=0:                             ; Anzahl der Fehler des Getesteten
       n1=0:                             ; Anzahl der Treffer
       n2=0:
       n3=0:
       n4=0:
       en=0:                             ; Flags
       first=-1:
       an=-1
1020   zl=12:
       sp=19:
       x=0:
       y=122
1030   r$="{C=a}{Sh*}{C=s}{C=-} {C=-}{C=z}{Sh*}{C=x}":
       zt=3:                             ; schnellste Reaktionszeit
       z0=0:
       z1=-1
1040   DIM mob(2),fa(3),sp(3),zl(3)
1045   fa(0)=6
1050   mob(1)=b0:
       fa(1)=5:                          ; Spritefarben
       sp(1)=7:                          ; Spritepositionen
       zl(1)=9
1055   mob(2)=b1:
       fa(2)=14:
       sp(2)=17:
       zl(2)=9
1060   fa(3)=10:
       sp(3)=27:
       zl(3)=9:
       PRINT "{CTRL n}{CRTL h}"          ; Kleinschrift fixieren
1070   COLOUR 0,0,fa(0):
       sprites:
       ti$="000000":
       t0=0:                             ; Zeitnahme-Variablen
       t1=0
1080 END PROC 

1100 PROC setzen
1110   MOB SET m,mob(nr),fa(f),0,0
1115   x=sp(z)*8+24
1120   MMOB m,x,y,x,y,3,0
1130 END PROC 

1300 PROC aus
1310   MOB OFF m
1320 END PROC 

1400 PROC zufall
1410   z=INT(RND(1)*3)+1
1420 END PROC 

1500 PROC wahl
1510   zufall:
       f=z
1520   zufall:
       nr=z-1:
       IF nr<1 THEN CALL wahl
1530   zufall:
       t0=time
1540 END PROC 

1600 PROC bildschirm
1605   aus:
       INSERT r$,0,0,40,25,fa(0)
1610   PRINT AT(0,2)"{C=q}"DUP("{Sh*}",38)"{C=w}"
1615   PRINT AT(0,20)"{C=q}"DUP("{Sh*}",38)"{C=w}"
1620   PRINT AT(0,22)"{C=q}"DUP("{Sh*}",38)"{C=w}"
1625   COLOUR ,12:
       PRINT AT(6,1)"R E A K T I O N S - T E S T"
1630   INSERT r$,8,6,7,7,fa(0)
1635   INSERT r$,8,16,7,7,fa(0)
1640   INSERT r$,8,26,7,7,fa(0)
1645   COLOUR ,fa(1):
       PRINT AT(1,6)"Den roten Ball im rotem Kasten treffen"
1650   COLOUR ,fa(0)
1655   zufall:
       INSERT r$,zl(z)-1,sp(z)-1,7,7,fa(3):
       ka=sp(z)
1660   PRINT AT(4,16)"Schusstaste ist die Taste  : ";:
       COLOUR ,fa(3):
       PRINT "F7"
1665   COLOUR ,fa(0)
1670   PRINT AT(4,18)"Vorzeitig Test beenden mit : ";:
       COLOUR ,fa(3):
       PRINT "F1"
1675   COLOUR ,fa(0)
1680   IF an THEN DO
1682     COLOUR ,fa(3):                ; Dieser DO-Abschnitt nur beim allerersten Mal
         PRINT AT(12,21)"Starten mit F7":
         besser:
         m=1:
         nr=1:
         f=3:
         setzen
1684     REPEAT :
           r=INKEY :
         UNTIL r=7
1686     PRINT AT(12,21)DUP(" ",14):
         COLOUR ,fa(0):
         an=0:
         besser:
         besser
1688   DOne
1690 END PROC 

1700 PROC warte
1710   fl=0:
       t1=0:
       re=0:
       IF sp(z)=ka THEN fl=1           ; Flag: Sprite im roten Kasten? 
1720   FOR i=1 TO 100
1730     r=INKEY :                     ; Welche F-Taste gedrückt?
         re=time:                      ; Zeitnahme für "verpasst"
         IF fl THEN IF r=7 THEN IF f=3 THEN IF nr=1 THEN t1=re:
           treffer:                    ; Treffer wenn Kasten, Taste, Farbe und Sprite-Form richtig
           re=0
1735     IF r THEN i=100
1740   NEXT :
       IF r=1 THEN re=0:               ; F1 gedrückt (vorzeitig Beenden)
         END PROC 
1745   IF r THEN IF fl=0 THEN schlecht ; falscher Kasten
1750   IF f<>3 THEN t1=0:              ; falsche Farbe
         re=0:
         IF r THEN schlecht
1755   IF nr<>1 THEN t1=0:             ; falsche Sprite-Form
         re=0:
         IF r THEN schlecht
1760   IF re THEN IF fl=0 THEN re=0    ; Zeit bei falschem Kasten zurücksetzen
1770 END PROC 

1800 PROC schlecht                     ; tiefer Ton
1810   aus:
       VOL 15:
       ENVELOPE 1,1,5,15,15:
       MUSIC 6,"{clr}1c3{F2}":
       PLAY 1
1820   WAVE 1,00100001:
       VOL 0:
       WAVE 1,00100000
1825   ms=ms+1
1830 END PROC 

1900 PROC gut                          ; Fanfare
1910   aus:
       VOL 15:
       ENVELOPE 1,1,5,15,15:
       MUSIC 8,"{clr}1a4{F1}{clr}ga4{F1}{clr}1b4{F1}{clr}gb4{F1}{clr}1c5{F2}":
       PLAY 1
1920   WAVE 1,00100001:
       WAVE 1,00100000:
       VOL 0
1930 END PROC 

1950 PROC besser                       ; hohe Töne anhängen
1960   aus:
       VOL 15:
       ENVELOPE 1,1,5,15,15:
       MUSIC 8,"{clr}1a4{F1}{clr}ga4{F1}{clr}1d5{F2}":
       PLAY 1
1970   WAVE 1,00100001:
       WAVE 1,00100000:
       VOL 0
1980 END PROC 

2000 PROC sprites                      ; Spriteform definieren
2010   DESIGN 0,mob(1)*64
2020   @........bbbbb...........
2021   @.....bbbbbbbbbbb........
2022   @....bbbbbbbbbbbbb.......
2023   @...bbbbbbbbbbbbbbb......
2024   @..bbbbbbbbbbbbbbbbb.....
2025   @..bbbbbbbbbbbbbbbbb.....
2026   @.bbbbbbbbbbbbbbbbbbb....
2027   @.bbbbbbbbbbbbbbbbbbb....
2028   @bbbbbbbbbbbbbbbbbbbbb...
2029   @bbbbbbbbbbbbbbbbbbbbb...
2030   @bbbbbbbbbbbbbbbbbbbbb...
2031   @bbbbbbbbbbbbbbbbbbbbb...
2032   @bbbbbbbbbbbbbbbbbbbbb...
2033   @.bbbbbbbbbbbbbbbbbbb....
2034   @.bbbbbbbbbbbbbbbbbbb....
2035   @..bbbbbbbbbbbbbbbbb.....
2036   @..bbbbbbbbbbbbbbbbb.....
2037   @...bbbbbbbbbbbbbbb......
2038   @....bbbbbbbbbbbbb.......
2039   @.....bbbbbbbbbbb........
2040   @........bbbbb...........
2050   DESIGN 0,mob(2)*64
2060   @..........b.............
2061   @.........bbb............
2062   @........bbbbb...........
2063   @.......bbbbbbb..........
2064   @......bbbbbbbbb.........
2065   @.....bbbbbbbbbbb........
2066   @....bbbbbbbbbbbbb.......
2067   @...bbbbbbbbbbbbbbb......
2068   @..bbbbbbbbbbbbbbbbb.....
2069   @.bbbbbbbbbbbbbbbbbbb....
2070   @bbbbbbbbbbbbbbbbbbbbb...
2071   @.bbbbbbbbbbbbbbbbbbb....
2072   @..bbbbbbbbbbbbbbbbb.....
2073   @...bbbbbbbbbbbbbbb......
2074   @....bbbbbbbbbbbbb.......
2075   @.....bbbbbbbbbbb........
2076   @......bbbbbbbbb.........
2077   @.......bbbbbbb..........
2078   @........bbbbb...........
2079   @.........bbb............
2080   @..........b.............
2090 END PROC 

2100 PROC anzeige                      ; Ergebnisse 
2110   COLOUR ,12:
       PRINT AT(19,21)"";:             ; Anzahl der Fehler
       USE "F=##",ms;
2115   PRINT AT(27,21)MID$(time$,4,1)":"RIGHT$(time$,2)" m";
2120   USE " (###)",n4:                ; Anzeige der Laufdauer
       IF re THEN vf=vf+1:             ; Anzahl der verpassten richtigen Kombinationen
         schlecht:
         ms=ms-1
2125   z0=VAL(MID$(time$,4,1)):
       IF z1<>z0 THEN z1=z0:
         en=1
2130   PRINT AT(1,23)"";:
       USE "Treffer=##:verpasst=##:Bestzeit:#,## s",n1,vf,zt
2135   COLOUR ,fa(0):
       IF first THEN en=0:
         first=0
2140 END PROC 

2200 PROC treffer
2210   IF t1=0 THEN END PROC 
2220   z=(t1-t0)/60-.38
2230   PRINT AT(1,21)"Zeit:";:
       USE "###,## s",z
2240   IF z<.01 THEN z=zt
2250   gut
2260   n1=n1+1:
       IF z<zt THEN zt=z:              ; Bestzeit merken
         IF n1>1 THEN besser
2270 END PROC