Migration to the new server completed.

Please add any new defect you notice here!


Die Migration auf den neuen Server ist abgeschlossen.

Bitte neue Defekte hier vermerken!

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
Shortcut: keiner
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 Spritenummer). 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 Multicolordarstellung 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.

(thumbnail)
Multicolor mit DESIGN 1
Beispiel 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 dem "Trainingsbuch zum Simon's Basic")
(thumbnail)
Anwendungsbeispiel
Beispiel 2 (beachten: TSB-Syntax!):

; 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 Spritewechsel
       bildschirm:
       anzeige
  30   REPEAT :
         n4=n4+1:
         wahl:               ; Spriteform 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 Spriteform 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 Spriteform
         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 

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