Teil 4 Grafikkurs ----------------------------------------
Wie Sie erkennen können, liegt unser Sprite (wenn es die Koordinaten 0/0 hat) ganz genau in der linken oberen Ecke des Bildschirms, allerdings im unsichtbaren Breich. Erst ab den Koordinaten X=24 und Y=50 beginnt der sichtbare Bildschirmbe- reich. Da sich unser Sprite in einem Koordinatenbereich befindet der kleiner als die ersten sichtbaren Koordinaten ist, kann man es natürlich noch nicht sehen. Wozu dies alles gut sein kann, werden wir später noch sehen. Zunächst einmal wollen wir unser Sprite einmal auf den Bildschirm bringen. Hier- zu müssen wir lediglich die entsprechen- den Bildkoordinaten in die Koordinaten- register unseres Sprites schreiben. Das sind für Sprite 0 die Register 0 und 1 für die X- und Y-Koordinate. Positionie- ren wir unser Sprite doch einfach einmal in der Ecke links oben, diesmal jedoch die Sichtbare :
POKE V+0,24 :REM X-KOORDINATE POKE V+1,50 :REM Y-KOORDINATE
So. Nun müßten Sie endlich unser Sprite auf dem Bildschirm sehen. Da steht es nun und läßt sich durch nichts beein- drucken. Lassen Sie doch einmal den Bildschirm nach oben scrollen, indem Sie mit dem Cursor in die untere linke Ecke fahren und eventuell vorhandenen Text "nach oben rollen" lassen. Sie werden bemerken, daß unser Sprite kontinuier- lich auf seiner Stelle stehen bleibt und sich nicht von seiner links-oben- Position wegbewegen läßt. Sprites sind somit also tatsächlich unabhängige Gra- fikobjekte, mit denen man ganz eigene Dinge machen kann. Nun, man muß zugeben, daß ein unbewegli- ches Sprite auf die Dauer ziemlich lang- weilig werden kann. Wie wäre es denn, wenn wir unseren kleinen Freund zuerst einmal aus dem oberen Bildschirmrand runterlaufen ließen, und ihm dann einen Richtungswechsel nach rechts verpaßten ? Nichts einfacher als das ! Hierzu müssen wir einfach eine Schleife schreiben, die die X-, beziehungsweise Y-Position unse- res Sprites erhöht, oder erniedrigt. Hier ein Beispiel (wir setzen voraus, daß alle Daten schon im Speicher stehen, und das Sprite ordungsgemäß eingeschal- tet wurde) :
10 v=53248 20 POKE V+0,24 :REM SICHTBARE X-KOORDINATE. 30 FOR I=39 TO 150 :REM VON 39 BIS 150 ZÄHLEN... 40 FOR K=0 TO 10:NEXT K :REM VERZöGE- RUNGSSCHLEIFE, SONST GEHTS ZU SCHNELL 50 POKE V+1,I :REM Y-POS SETZEN 60 NEXT I 70 : 80 FOR I=24 TO 255 :REM JETZT VON 24 BIS 255 ZÄHLEN... 90 FOR K=0 TO 10:NEXT K: :REM WIEDER VERZöGE- RUNG, DAMITS FÖRS AUGE SICHTBAR WIRD. 100 POKE V+0,I 110 NEXT I
Wenn Ihnen das hier zu unübersichtlich ist, dann starten Sie doch einfach ein- mal das Programm "MOVESPRITE" auf der Rückseite der Magic Disk. Hieran sehen Sie dann auch wozu so ein "unsichtbarer" Bildschirmbereich nützlich ist. Man kann nämlich ein Sprite kurzerhand in den sichtbaren Bereich hineinbewegen, daß ist bestimmt ein besserer Auftritt für unseren kleinen Freund, als wenn er ein- fach - Zack - auf dem Bildschirm er- scheinen würde... Vielleicht ist Ihnen in diesem Beispiel hier ja aufgefallen, daß ich die X- Koordinate nur bis 255 gezählt habe, und wenn das nicht der Fall war, dann hat Sie aber ganz sicher der Ausdruck "Low- Grenze" in der letzten Grafik stutzig gemacht. 255 ist ja der höchste Wert den ein Byte annehmen kann. Für die X- Koordinate ist dies also der größtmö- glichste einsetzbare Wert. Wenn Sie jetzt einmal ein Sprite an die X- Position 255 setzen, dann werden Sie sehen, daß es noch mitten auf dem Bild- schirm steht. Was aber, wenn wir den Bereich ab 255 noch nutzen, unser Sprite also noch ein bisschen weiter bewegen möchten ? Hierfür ist, wie Sie es in der Liste der VIC-Register vielleicht schon gesehen haben, Register Nummer 16 ver- antwortlich. Das Hauptproblem, das wir nämlich haben, ist, daß das X-Register eines Sprites nur auf 8 Bit begrenzt ist. In Register 16 stellt uns der VIC nun ein weiteres, neuntes Bit zur Verfü- gung. Das Register 16 selbst hat ja ebenfalls 8 Bits, für jedes Sprite eins. Für Sprite 0 ist Bit 0 zuständig, für Sprite 1 gibt es das Bit Nummer 1 und so weiter... Doch wozu brauchen wir die ganzen neun- ten Bits ? Ganz einfach, dadurch erhöht sich der Wertebereich des Ganzen nämlich auf (dezimal) 512 X-Positionen (die 0. Position miteingerechnet) ! Sie müssen sich also für die X-Position eine 9- Bit-Binärzahl vorstellen. Wollenten wir unser Sprite beispielsweise an Position 256 setzen, so wäre die 9-Bit- Kombination "1 0000 0000" - das neute Bit wäre also gesetzt, alle acht anderen gelöscht. Die ersten acht Bits kommen immer in das "normale" X-Register eines Sprites. Das neunte nun schreiben wir in Register 16. Bei Sprite 0 wäre das ja das 0. Bit dieses Registers. Dieses hat den Dezimalwert 1, also schreiben wir in V+16 den Wert 1 und schon hätten wir unser Sprite ein Stückchen weiter über die Low-Grenze hinausgeschoben. Also : POKE V+0,0 POKE V+16,1 Wollten wir es jetzt weiterbewegen, so müßten wir einfach wieder das X-Register verändern, das neute Bit in Register 16 ist ja jetzt gesetzt. In unserem Bei- spielen vorhin, war es - wenn Sie Ihren 64er gerade frisch eingeschaltet hatten - schon von Haus aus auf 0, deshalb ist unser Sprite dann auch in der linken Bildschirmhälfte erschienen. Wird jedoch das neute Bit der X-Koordinate gesetzt, dann dient nun als relativer Anfang- spunkt die Bildschirmposition 256. Ach- ten Sie also immer darauf, daß Sie beim Positionieren von Sprites immer eine 9-Bit-Zahl verwenden, wobei das neute Bit immer in Register 16 wandert und die restlichen acht im entsprechenden X- Register des Sprites landen. Setzen wir doch einfach einmal Sprite 1 an die X- Koordinate 300. Binär gesehen hat 300 die folgende Kombination : 1 0010 1100 Demnach müssen wir also Bit 1 im Regi- ster 16 setzen. Dieses hat den Dezimal- wert 2. Die restlichen 8 Bits haben ins- gesamt den Dezimalwert 44. Also :
POKE V+16,2 :REM HI-BIT SPRITE 1 SETZEN POKE V+2,44 :REM X-POSITION SPRITE 1
Sehen Sie Register 16 also bitte als eigenständiges Register an. Auch hier müssen 8-Bit Werte hineingeschrieben werden ! Wollten Sie also beispielsweise Sprite 0, 2 und 5 in einen X-Bereich hinter 256 setzen, so müßten Sie den entsprechenden Dezimalwert, nämlich 37, ganz normal in dieses Register hinenPO- KEen !!! Eine andere Möglichkeit gibt es durch die logischen Operatoren, die ich im BASIC-Kurs bewußt NICHT behandelt habe, da sie wirklich nur eine wichtige Rolle in der Grafik spielen. Deshalb möchte ich dies hier noch nachholen. Die logischen Operatoren kann man wie die arithmetischen Operatoren (+,-,*,/) verwenden. BASIC stellt uns ihrer drei zur Verfügung, nämlich AND, OR und NOT. Man kann logische Operatoren hervorra- gend zur gezielten Manipulation von Bits benutzen, ohne voher irgendwelche Binär- zahlen in Dezimalzahlen umrechnen zu müssen und umgekehrt. Bei AND und OR werden ganz einfach zwei Binärzahlen und ihre Bits miteinander verglichen, und nach einer logischen Entscheidungstabel- le resultiert aus dem Zustand dieser Bits ein bestimmtes Ergebnis. Das hört sich vielleicht komplizierter an als es ist. Beginnen wir doch einfach einmal mit einem Beispiel. AND ist englisch und heißt UND. Ich möchte nun einmal ganz einfach mit dem AND-Operator verglei- chen, und Ihnen das Ergebnis erklären. Hier erst einmal das Beispiel :
0100 0010 (dez. 66) AND 0101 0000 (dez. 80) ----------------------- = 0100 0000 (dez. 64)
Der Computer hat hier zwei 8-Bit-Zahlen miteinander geUNDet. Hierbei hat er im- mer das n-te Bit der ersten Zahl mit dem n-ten Bit der zweiten Zahl verglichen und dann ein aus den beiden Bits resul- tierendes Bit ermittelt. Hierbei ging er nach dem Schema vor, daß nur, wenn das Bit der ersten Zahl UND (AND) das Bit der zweiten Zahl 1 oder 0 war, das re- sultierende Bit ebenfalls gleich 1 oder 0 war. In allen anderen Fällen, also wenn das Bit der ersten Zahl gleich 0 und das Bit der zweiten Zahl gleich 1 war (beziehungsweise umgekehrt), war das resultierende Bit gleich 0 ! Ebenso verhält sich das bei OR, was auf Deutsch ODER heißt. Hier ein Beispiel :
0100 0010 (dez. 66) OR 0101 0000 (dez. 80) ----------------------- = 0001 0010 (dez. 18)
Sie sehen, als Ursprungszahlen habe ich dieselben genommen wie eben, jedoch ist das Ergebnis nun ein anderes. Hierbei waren ja auch die Enscheidungskriterien nicht dieselben. Das resultierende Bit aus den zwei n-ten Bits einer Zahl war nämlich nur dann 1, wenn das Bit der ersten Zahl ODER (OR) das Bit der zwei- ten Zahl gesetzt war. ODER wenn beide Bits gesetzt waren. Nur wenn Beide 0 waren, war das resultierende Bit eben- falls gleich 0 !