MOB SET
Aus C64-Wiki
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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.
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")
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.

