Magic Disk 64

home to index to html: MD8912-KURSE-GRAFIKKURS_TEIL_1-5.html
MD8912-KURSE-GRAFIKKURS_TEIL_1-5.koala.png
           Teil 5 Grafikkurs            
----------------------------------------
Ich habe hier dann auch noch gleich eine
Wertigkeitstabelle  für  NOT  angegeben.
Sie sehen, daß es sich hier etwas anders
verhält,  als bei den beiden ersten Ope-
ratoren. NOT  ist  eigentlich  auch  gar
kein  Operator,  man  stellt  es nämlich
einfach nur einer Zahl voran. Was  jetzt
geschieht ist folgendes : alle Bits die-
ser Zahl werden in ihr  Gegenteil  umge-
wandelt (0 ist nämlich NICHT (NOT) 1 und
somit  das  Gegenteil  von  1  und umge-
kehrt). Auch hier wieder ein Beispiel : 
NOT 1001 0110 (dez. 150)                
------------------------                
 =  0110 1001 (dez. 105)                
Ist doch ganz einfach, oder ?           
Nun, wozu brauchen wir das denn, bei der
Spriteprogrammierung. Ich möchte da noch
einmal  das  Beispiel  mit  Register  16
strapazieren. Wir hatten ja gesagt,  daß
in  diesem Register jedes Sprite ein ei-
genes neutes Bit für die X-Position hat.
Nun kann es sehr leicht  vorkommen,  daß
wenn man in einem Programm mehrere Spri-
tes über den Bildschirm bewegt,  langsam
aber sicher den Öberblick verliert, wel-
ches Sprite nun das 9. Bit gesetzt haben
muß und welches nicht. Würden wir jedes-
mal,  wenn  ein  neues  Sprite in den X-
Bereich über 256  rücken  müßte  einfach
dessen neuntes Bit hineinPOKEn, so könn-
te es gut sein, daß wir  damit  wiederum
das  neunte Bit eines andern Sprites lö-
schen, was vielleicht nicht sein sollte,
und zur Folge hätte, daß  diese  Sprites
munter  und  lustig  über den Bildschirm
hüpfen, und sich nich  fließend  bewegen
würden.                                 
Um  diesem  Problem entgegenzugehen, be-
nutzen wir ganz  einfach  die  logischen
Operatoren,  denn die wissen ja mit Bits
umzugehen. Angenommen, Sprite  2  und  4
wären  schon in einem X-Bereich über 256
und wir wollten  nun  auch  noch  Sprite
Nummer   1  hinzuschalten.  Register  16
sieht demnach also zuerst einmal folgen-
dermaßen aus :                          
0001 0100                               
Um  jetzt Sprite 1 hier auch noch bedie-
nen zu können, müssen wir lediglich  Bit
1  setzen. Hier hilft uns OR direkt wei-
ter. Wir müssen nur den jetzigen  Inhalt
von   Register   16  mit  dem  Binärwert
"0000 0010" (dezimal 2) durch OR logisch
verknüpfen. Nach der Entscheidungstabel-
le  von  oben sieht das Ergebnis dann so
aus :                                   
    0001 0100                           
OR  0000 0010                           
-------------                           
 =  0001 0110                           
Es wäre geschafft ! Wir hätten nun Bit 1
gesetzt, ohne die anderen zu  verändern,
geschweige  denn, die ganze Zahl ins De-
zimalsystem oder umgekehrt umrechnen  zu
müssen. Programmatisch gesehen, sähe das
dann so aus :                           
POKE V+16, PEEK(V+16) OR 2              
Ähnlich verhält es sich umgekehrt. Ange-
nommen, Sprite 2 sollte wieder herunter-
geschaltet  werden. Hierzu gibt es jetzt
2 Methoden.                             
Zuerst  einmal  die  Umständlichere  von
beiden, mit Hilfe von AND. Wir  verknüp-
fen hierzu den jetzigen Inhalt von Regi-
ster 16 mit  dem  Binärwert  "1111 1011"
(dez. 251). Hier die Rechnung :         
    0001 0110                           
AND 1111 1011                           
-------------                           
 =  0001 0010                           
Es waren also bei AND alle Bits gesetzt,
bis auf das eine,  daß  gelöscht  werden
sollte.  Sollte  eins der ursprünglichen
Bits 1 gewesen sein, so kam als Resultat
ebenfalls 1 heraus  -  es  wurde  nichts
verändert. Nur das eine Bit, daß bei AND
gelöscht   war,  hat  bewirkt,  daß  das
ursprünglich Bit ebenfalls gelöscht wur-
de  (denn 1 AND 0 = 0). Andere Bits, die
ursprünglich den Wert 0 aufwiesen,  wur-
den  sowieso nicht verändert (denn 0 AND
1 = 0). Hier wieder  ein  Beispiel,  wie
das im Programm aussehen sollte :       
POKE V+16, PEEK(V+16) AND 251           
Also auch das gezielte Löschen von  Bits
ist  möglich.  Doch  es  geht,  wie eben
schon erwähnt, auch einfacher. Sie  müs-
sen  doch zugeben, daß das Berechnen der
sogenannten AND-Maske,  der  Zahl  also,
mit   der  man  die  ursprüngliche  Zahl
verknüpfen möchte, ziemlich  zeitaufwen-
dig  und mühselig ist. Doch wozu gibt es
denn NOT, nimmt uns dieser Operator doch
alle Arbeit ab ! Wir müssen NOT  einfach
nur  den  Wert  des  zu  löschenden Bits
übergeben, es verwandelt diesen doch  in
sein  Gegenteil,  also das, was wir dann
mit AND knüpfen müssen ! Hier  ein  Bei-
spiel,  bei dem ebenfalls das 2. Bit von
Register 16 wieder gelöscht wird,  dies-
mal jedoch ohne umständliches Herumrech-
nen :                                   
    NOT  0000 0100 = 1111 1011          
-->      0001 0110                      
    AND  1111 1011 (Ergebnis der NOT-   
                    Operation)          
----------------------------------------
     =   0001 0010                      
Im Prinzip haben wir also dasselbe getan
wie im Beispiel mit  AND,  nur  daß  die
Umrechnungsarbeit  diesmal von NOT über-
nommen wurde. Auch dieses Beispiel  kann
man  in einer Programmzeile zusammenfas-
sen :                                   
POKE V+16, PEEK(V+16) AND NOT 4         
Das wärs dann für heute. Sollten Sie das
mit  den logischen Operatoren nicht ganz
verstanden haben, dann empfehle ich  Ih-
nen  es  sich  noch  einmal anzuschauen,
denn nächsten Monat, wenn  wir  die  HI-
RES-Grafiken  und  den Rest, was es über
Sprites noch zu sagen  gibt,  abhandeln,
wird es in der Beziegung ganz schön rund
gehen.                                  
Bis  dahin  wünsche  ich Ihnen noch viel
Erfolg bei der ersten  Spriteprogrammie-
rung und sage Tschüß,                   
                        Ihr Uli Basters.



Valid HTML 4.0 Transitional Valid CSS!