home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings3 / listing7x1.s < prev    next >
Text File  |  1977-12-31  |  8KB  |  278 lines

  1.  
  2. ; Listing7x1.s    KOLLISIONEN ZWISCHEN SPRITE UND PLAYFIELD
  3. ;        In diesem Beispiel durchquert ein Sprite Quadrate mit
  4. ;        verschiedenen Farben. Wenn er eine bestimmte Farbe berührt,
  5. ;        schaltet sich ein Signal ein.
  6.  
  7.  
  8.     SECTION CipundCop,CODE
  9.  
  10. Anfang:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Name lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; speichern die alte COP
  18.  
  19. ;    Pointen wie immer auf unser PIC
  20.  
  21.     MOVE.L    #PIC,d0
  22.     LEA    BPLPOINTERS,A1
  23.     MOVEQ    #3-1,D1
  24. POINTBP:
  25.     move.w    d0,6(a1)
  26.     swap    d0
  27.     move.w    d0,2(a1)
  28.     swap    d0
  29.     ADD.L    #40*256,d0
  30.     addq.w    #8,a1
  31.     dbra    d1,POINTBP
  32.  
  33. ;    Pointen auf den Sprite
  34.  
  35.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  36.     MOVE.L    #MEINSPRITE0,d0        ; Adresse des Sprite in d0
  37.     move.w    d0,6(a1)
  38.     swap    d0
  39.     move.w    d0,2(a1)
  40.     add.l    #16,a1
  41.  
  42.     move.l    #COPPERLIST,$dff080    ; unsere COP
  43.     move.w    d0,$dff088        ; START COP
  44.     move.w    #0,$dff1fc        ; NO AGA!
  45.     move.w    #$c00,$dff106        ; NO AGA!
  46.  
  47. mouse:
  48.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  49.     bne.s    mouse
  50.  
  51.     bsr.s    BewegeSprite0    ; Bewege den Sprite
  52.     bsr.s    CheckColl    ; Kontrolliere die Kollisionen und
  53.                 ; greife eventuell ein
  54.  
  55. Warte:
  56.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  57.     beq.s    Warte
  58.  
  59.     btst    #6,$bfe001    ; Mouse gedrückt?
  60.     bne.s    mouse
  61.  
  62.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  63.     move.w    d0,$dff088        ; starten die alte COP
  64.  
  65.     move.l    4.w,a6
  66.     jsr    -$7e(a6)    ; Enable
  67.     move.l    gfxbase(PC),a1
  68.     jsr    -$19e(a6)    ; Closelibrary
  69.     rts
  70.  
  71. ;    Daten
  72.  
  73.  
  74. GfxName:
  75.     dc.b    "graphics.library",0,0
  76.  
  77. GfxBase:
  78.     dc.l    0
  79.  
  80. OldCop:
  81.     dc.l    0
  82.  
  83. ; Diese Routine bewegt den Sprite um 2 Pixel pro Durchgang nach links
  84.  
  85. BewegeSprite0:
  86.     subq.b    #1,HSTART0
  87.     rts
  88.  
  89. ; Diese Routine kontrolliert, ob es eine kollision gegeben hat.
  90. ; Wenn ja, dann schaltet sie einen "Signalgeber" ein.
  91. ; Dieser Signalgeber ist einfach ein Quadrat, das mit COLOR7 gefüllt ist.
  92. ; Durch modifizieren in der Copperlist dieser Farbe, kann man ihn
  93. ; "einschalten" (Rot) oder "ausschalten" (Grau).
  94.  
  95. CheckColl:
  96.     move.w    $dff00e,d0    ; liest CLXDAT ($dff00e)
  97.                 ; das Lesen dieses Registers bewirkt auch
  98.                 ; seine sofortige Löschung, es ist also besser,
  99.                 ; man kopiert es sich in d0 und macht dort dann
  100.                 ; die Tests
  101.     move.w    d0,d7
  102.     btst.l    #1,d0        ; das Bit 1 signalisiert die Kollision zwischen
  103.                 ; Sprite 0 und Playfield
  104.     beq.s    no_coll        ; wenn es keine gegeben hat, dann überspringe
  105.  
  106. ja_coll:
  107.     move.w    #$f00,Kollisions_Sensor ; "anschalten" des Signals (COLOR07),
  108.                      ; indem wir die Copperlist (Rot) verändern
  109.     bra.s    exitColl        ; Raus
  110.  
  111. no_coll:
  112.     move.w    #$555,Kollisions_Sensor ; "ausschalten" des Signales (COLOR07),
  113.                     ; indem wir die Copperlist (Grau) verändern
  114. exitColl:
  115.     rts
  116.  
  117.  
  118.  
  119.     SECTION GRAPHIC,DATA_C
  120.  
  121. COPPERLIST:
  122. SpritePointers:
  123.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  124.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  125.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  126.     dc.w    $13e,0
  127.  
  128.  
  129. ; Das ist das Register CLXCON (kontrolliert die Art der Registrierung)
  130.  
  131. ; Die Bit von 0 bis 5 sind die Werte, die von den Planes eingenommen w. müssen
  132. ; Die Bit 6 bis 11 zeigen, welche Planes aktiv für Kollisionen sind
  133. ; Die Bit 12 bis 15 zeigen, welche ungeraden Sprites aktiviert werden sollen
  134. ; (für die Spriteregistrierung)
  135.  
  136.              ;5432109876543210
  137.     dc.w    $98,%0000000111000011    ; CLXCON
  138.  
  139. ; Diese Werte weisen darauf hin, daß die Planes 1,2 und 3 für Kollisionen
  140. ; aktiviert wurden, wenn eine Sprite also auf ein Pixel mit folgenden
  141. ; Eigenschaften stoßt:
  142. ;
  143. ;        Plane 1 = 1
  144. ;        Plane 2 = 1
  145. ;        Plane 3 = 0
  146.  
  147.  
  148.     dc.w    $8E,$2c81    ; DiwStrt
  149.     dc.w    $90,$2cc1    ; DiwStop
  150.     dc.w    $92,$38        ; DdfStart
  151.     dc.w    $94,$d0        ; DdfStop
  152.     dc.w    $102,0        ; BplCon1
  153.  
  154.     dc.w    $104,$0024    ; BplCon2 - alle Sprites über das Playfield
  155.  
  156.     dc.w    $108,0        ; Bpl1Mod
  157.     dc.w    $10a,0        ; Bpl2Mod
  158.  
  159.             ; 5432109876543210
  160.     dc.w    $100,%0011001000000000    ; 3 Bitplane Lowres
  161.  
  162. BPLPOINTERS:
  163.     dc.w $e0,0,$e2,0
  164.     dc.w $e4,0,$e6,0
  165.     dc.w $e8,0,$ea,0
  166.  
  167. ; Bitplane-Farben
  168.     dc.w    $180,$000    ; COLOR0    ; schwarzer Hintergrund
  169.     dc.w    $182,$620
  170.     dc.w    $184,$fff
  171.     dc.w    $186,$e00
  172.     dc.w    $188,$808
  173.     dc.w    $18a,$f4a
  174.     dc.w    $18c,$aaa
  175.     dc.w    $18e    ; COLOR07 - Dieser Wert wird danach con der Routine
  176.             ; CheckColl als Signal verwendet, wenn eine Kollision
  177.             ; eingetreten ist.
  178. Kollisions_Sensor:
  179.     dc.w    0    ; AN DIESEM PUNKT schreibt die Routine CheckColl in
  180.             ; der Copperlist die richtige Farbe
  181.  
  182. ; Sprite-Farben
  183.     dc.w    $1A2,$00f    ; COLOR17, also COLOR1 des Sprite0
  184.     dc.w    $1A4,$0c0    ; COLOR18, also COLOR2 des Sprite0
  185.     dc.w    $1A6,$0c0    ; COLOR19, also COLOR3 des Sprite0
  186.  
  187.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  188.  
  189.  
  190. ; ************ Hier ist der Sprite: KLARERWEISE in CHIP RAM! ************
  191.  
  192. MEINSPRITE0:        ; Länge 6 Zeilen
  193. VSTART0:
  194.     dc.b 200    ; Vertikale Anfangsposition des Sprite (da $2c a $f2)
  195. HSTART0:
  196.     dc.b $d8    ; Horizontale Anfangsposition des Sprite (da $40 a $d8)
  197. VSTOP0:
  198.     dc.b 206    ; 200+6=206
  199. VHBITS:
  200.     dc.b $00
  201.     dc.w    $0008,$0000
  202.     dc.w    $1818,$0000
  203.     dc.w    $2C28,$1010
  204.     dc.w    $7FF8,$0000
  205.     dc.w    $3FC0,$0000
  206.     dc.w    $01F0,$0000
  207.     dc.w    $0000,$0000
  208.  
  209. PIC:
  210.     incbin    "collpic.raw"
  211.  
  212.     end
  213.  
  214. In diesem Beispiel zeigen wir, wie man  Kollisionen  zwischen  Sprite  und
  215. Playfield  erkennen  kann.  Wie  wir  schon  in der Lektion gesehen haben,
  216. verwenden wir dazu die Register CLXDAT und CLYCON. CLXDAT dient nur  dazu,
  217. um  zu  wissen, obe eine Kollision stattgefunden hat (genau gleich wie bei
  218. zwei Sprites, nur werden andere Bits verwendet). Die Verwendung von CLXCON
  219. hingegen  ist  etwas  komplexer.  Sehen  wir  es uns gut an, indem wir das
  220. Listing studieren. Wir haben in der Copperlist folgendes geschrieben:
  221.  
  222.             ;5432109876543210
  223.     dc.w    $98,%0000000111000011  ; CLXCON
  224.  
  225. Die Bit von 6  bis  11  dienen  zur  Bestimmung,  welche  Planes  für  die
  226. Kollisionen  aktiviert  werden sollen. In unserem Beispiel sind die Planes
  227. 1,2 und 3 aktiviert (die Planes, die angezeigt werden). Die Bit von 0  bis
  228. 5  hingegen  dienen  dazu,  zu  bestimmen,  welchen  Wert  von  den Planes
  229. angenommen werden muß,  damit  eine  Kollision  stattfindet.  Bei  unserem
  230. Beispiel  tritt  eine  Kollision  auf,  wenn die drei Planes die folgenden
  231. Werte aufweisen: Plane3 = 0, Plane2 = 1 und Plane1 = 1, also  die  Sequenz
  232. %011=3.  Es  wird  also  eine  Kollision  zwischen  dem  Sprite und COLOR3
  233. erkannt. Bemerkt, daß es uninteressant ist, welchen Wert  die  Planes  4,5
  234. und 6 annehmen, da sie deaktiviert sind.
  235.  
  236. Veränder die Copperlist so:
  237.  
  238.             ;5432109876543210
  239.     dc.w    $98,%0000000111000010  ; CLXCON
  240.  
  241. Nun sind die aktivierten Planes immer noch 1,2 und 3, aber der  Wert,  der
  242. angenommen  werden  muß  ist  %010,  also COLOR2. Ihr könnt es überprüfen,
  243. indem ihr das Programm nochmal startet. Es funktioniert  mit  den  anderen
  244. Farben genau gleich.
  245.  
  246. Und  wenn wir eine Kollision mit mehr als einer Farbe erkennen möchten? In
  247. einigen Fällen ist es möglich, indem man  nicht  alle  angezeigten  Planes
  248. aktiviert. Verändert die Copperlist auf diese Art:
  249.  
  250.             ;5432109876543210
  251.     dc.w    $98,%0000000110000010  ; CLXCON
  252.  
  253. Nun  haben  wir  zum  Kollisionsregistrieren  nur  die  Planes  2  und  3
  254. freigegeben.  Das bedeutet, daß Plane 1 keinen Einfluß auf die Kollisionen
  255. mehr hat. Es ist nur notwendig, daß : Plane3 = 0 und Plane2 = 1. Da dieser
  256. Zustand  sowohl  bei  der  Situation  %010  wie auch bei %011 gegeben ist,
  257. werden beide Farben eine Kollision verursachen. Nun werden  COLOR2  (%010)
  258. und COLOR3 (%011) eine auslösen.
  259.  
  260. Sehen wir ein anderes Beispiel. Modifiziert die Copperlist:
  261.  
  262.             ;5432109876543210
  263.     dc.w    $98,%0000000001000001  ; CLXCON
  264.  
  265. Nun ist nur Plane 1 aktiviert, und die Kollision kann erkannt werden, wenn
  266. Plane1 = 1 ist. Das passiert bei allen ungeraden Farben. Man hat:
  267.  
  268.   %001  COLOR 1
  269.   %011  COLOR 3
  270.   %101  COLOR 5
  271.   %111  COLOR 7
  272.  
  273. In all diesen Kombinationen ist Plane1 auf 1.
  274.  
  275. Das ist natürlich auch alles gültig, wenn die Planeanzahl verschieden  von
  276. 3 ist...
  277.  
  278.