Magic Disk 64

home to index to text: MD8912-KURSE-GRAFIKKURS_TEIL_1-4.txt
MD8912-KURSE-GRAFIKKURS_TEIL_1-4.koala.png
           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 Bildschirmbereich. 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. Hierzu müssen wir lediglich die entsprechenden Bildkoordinaten in die Koordinatenregister unseres Sprites schreiben. Das sind für Sprite 0 die Register 0 und 1 für die Xund Y-Koordinate. Positionieren 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 beeindrucken. 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 kontinuierlich auf seiner Stelle stehen bleibt und sich nicht von seiner linksoben- Position wegbewegen läßt. Sprites sind somit also tatsächlich unabhängige Grafikobjekte, mit denen man ganz eigene Dinge machen kann.
Nun, man muß zugeben, daß ein unbewegliches Sprite auf die Dauer ziemlich langweilig 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 unseres Sprites erhöht, oder erniedrigt.
Hier ein Beispiel ( wir setzen voraus, daß alle Daten schon im Speicher stehen, und das Sprite ordungsgemäß eingeschaltet 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 einmal 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 einfach - Zack - auf dem Bildschirm erscheinen 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 Bildschirm 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 verantwortlich. 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 neunten 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 "100000000"- 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 Beispielen vorhin, war es - wenn Sie Ihren 64 er 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 Anfangspunkt die Bildschirmposition 256 . Achten 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 :
100101100 Demnach müssen wir also Bit 1 im Register 16 setzen. Dieses hat den Dezimalwert 2 . Die restlichen 8 Bits haben insgesamt 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 hervorragend zur gezielten Manipulation von Bits benutzen, ohne voher irgendwelche Binärzahlen 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 Entscheidungstabelle 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 vergleichen, 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 immer das nte Bit der ersten Zahl mit dem nten Bit der zweiten Zahl verglichen und dann ein aus den beiden Bits resultierendes 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 resultierende 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 nten Bits einer Zahl war nämlich nur dann 1, wenn das Bit der ersten Zahl ODER ( OR) das Bit der zweiten Zahl gesetzt war. ODER wenn beide Bits gesetzt waren. Nur wenn Beide 0 waren, war das resultierende Bit ebenfalls gleich 0 !

Valid HTML 4.0 Transitional Valid CSS!