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

  1.  
  2. ; Listing7w1.s    KOLLISIONEN ZWISCHEN SPRITES
  3.  
  4.  
  5.     SECTION CipundCop,CODE
  6.  
  7. Anfang:
  8.     move.l    4.w,a6        ; Execbase
  9.     jsr    -$78(a6)    ; Disable
  10.     lea    GfxName(PC),a1    ; Name lib
  11.     jsr    -$198(a6)    ; OpenLibrary
  12.     move.l    d0,GfxBase
  13.     move.l    d0,a6
  14.     move.l    $26(a6),OldCop    ; speichern die alte COP
  15.  
  16. ;    Pointen wie immer auf unser PIC
  17.  
  18.     MOVE.L    #PIC,d0
  19.     LEA    BPLPOINTERS,A1
  20.     MOVEQ    #2-1,D1
  21. POINTBP:
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.     swap    d0
  26.     ADD.L    #40*256,d0
  27.     addq.w    #8,a1
  28.     dbra    d1,POINTBP
  29.  
  30. ;    Pointen auf den Sprite
  31.  
  32.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  33.     MOVE.L    #MEINSPRITE0,d0        ; Adresse des Sprite in d0
  34.     move.w    d0,6(a1)
  35.     swap    d0
  36.     move.w    d0,2(a1)
  37.     add.l    #16,a1
  38.  
  39.     MOVE.L    #MEINSPRITE2,d0        ; Adresse des Sprite in d0
  40.     move.w    d0,6(a1)
  41.     swap    d0
  42.     move.w    d0,2(a1)
  43.  
  44.     move.l    #COPPERLIST,$dff080    ; unsere COP
  45.     move.w    d0,$dff088        ; START COP
  46.     move.w    #0,$dff1fc        ; NO AGA!
  47.     move.w    #$c00,$dff106        ; NO AGA!
  48.  
  49. mouse:
  50.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  51.     bne.s    mouse
  52.  
  53.     bsr.s    BewegeSprite0    ; Bewege das Flugzeug
  54.     bsr.s    BewegeSprite1    ; Bewege die Rakete gegen das Flugzeug
  55.     bsr.s    CheckColl    ; Kontrolliere die Kollisionen und
  56.                 ; greife eventuell ein
  57.  
  58. Warte:
  59.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  60.     beq.s    Warte
  61.  
  62.     btst    #6,$bfe001    ; Mouse gedrückt?
  63.     bne.s    mouse
  64.  
  65.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  66.     move.w    d0,$dff088        ; starten die alte COP
  67.  
  68.     move.l    4.w,a6
  69.     jsr    -$7e(a6)    ; Enable
  70.     move.l    gfxbase(PC),a1
  71.     jsr    -$19e(a6)    ; Closelibrary
  72.     rts
  73.  
  74. ;    Daten
  75.  
  76. GfxName:
  77.     dc.b    "graphics.library",0,0
  78.  
  79. GfxBase:
  80.     dc.l    0
  81.  
  82. OldCop:
  83.     dc.l    0
  84.  
  85. ; Diese Routine bewegt den Sprite, der das Flugzeug darstellt, gradlinig
  86. ; um jeweils 2 Pixel nach links. Sie greift auf das Byte HSTART zu
  87.  
  88. BewegeSprite0:
  89.     subq.b    #1,HSTART0
  90.     rts
  91.  
  92. ;    -        -        -        -
  93.  
  94. ; Dieses Routine bewegt die Rakete. Sie tut das nur, wenn das Flugzeug nah
  95. ; genug ist, um getroffen zu werden. Es ist soweit, wenn dessen HSTART $b0
  96. ; erreicht hat. Wenn ihr das Flugzeug retten wollt, versucht die Rakete bei
  97. ; $AA abzuschießen, also zu früh, oder bei Position $c1, wo es schon zu
  98. ; spät ist.
  99.  
  100. BewegeSprite1:
  101.     cmp.b    #$b0,HSTART0    ; Ist das Flugzeug in Schußweite?
  102.     bhi.s    nicht_in_Schussweite ; noch nicht schießen, wenn es zu weit
  103.                      ; weg ist
  104.     subq.b    #1,VSTART2    ; laß die Rakete steigen, indem auf das VSTART
  105.     subq.b    #1,VSTOP2    ; wie das VSTOP eingewirkt wird
  106. nicht_in_Schussweite:
  107.     rts
  108.  
  109. ;    -        -        -        -
  110.  
  111. ; Diese Routine kontrolliert, ob es eine Kollision gab. Wenn ja, löscht
  112. ; sie die beiden Sprites, indem sie deren Pointer in der Copperlist auf
  113.  
  114.  
  115. CheckColl:
  116.     move.w    $dff00e,d0 ; liest CLXDAT ($dff00e)
  117.                ; ein Lesevorgang dieses Register bewirkt
  118.                ; auch dessen komplette Löschung, es ist deshalb
  119.                ; ratsam, es sich in d0 zu kopieren, und dann
  120.                ; dort die Tests durchzuführen
  121.     btst.l    #9,d0
  122.     beq.s    no_coll     ; wenn keine Kollision, überspringe
  123.  
  124.     MOVEQ    #0,d0          ; ansonsten lösche die Sprites
  125.     LEA    SpritePointers,a1 ; Pointer Sprite 0
  126.     move.w    d0,6(a1)      ; Lösche Spritepointer 0 in der Copperlist
  127.     move.w    d0,2(a1)
  128.     add.w    #16,a1        ; Pointer Sprite 2
  129.     move.w    d0,6(a1)    ; Lösche Pointer auf Sprite 2 in der Copperlist
  130.     move.w    d0,2(a1)
  131. no_coll:
  132.     rts
  133.  
  134.  
  135.     SECTION GRAPHIC,DATA_C
  136.  
  137. COPPERLIST:
  138. SpritePointers:
  139.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  140.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  141.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  142.     dc.w    $13e,0
  143.  
  144.     dc.w    $8E,$2c81    ; DiwStrt
  145.     dc.w    $90,$2cc1    ; DiwStop
  146.     dc.w    $92,$38        ; DdfStart
  147.     dc.w    $94,$d0        ; DdfStop
  148.     dc.w    $102,0        ; BplCon1
  149.     dc.w    $104,$0024    ; BplCon2 - Sprites über den Bitplanes
  150.     dc.w    $108,0        ; Bpl1Mod
  151.     dc.w    $10a,0        ; Bpl2Mod
  152.  
  153.             ; 5432109876543210
  154.     dc.w    $100,%0010001000000000    ; Bit 13 an 2 Bitplane Lowres
  155.  
  156. BPLPOINTERS:
  157.     dc.w $e0,0,$e2,0    ; erstes Bitplane
  158.     dc.w $e4,0,$e6,0    ; zweites Bitplane
  159.  
  160.     dc.w    $180,$000    ; COLOR0    ; schwarzer Hintergrund
  161.     dc.w    $182,$005    ; COLOR1    ; COLOR 1 des Bitplane
  162.     dc.w    $184,$a40    ; COLOR1    ; COLOR 2 des Bitplane
  163.     dc.w    $186,$f80    ; COLOR1    ; COLOR 3 des Bitplane
  164.  
  165.     dc.w    $1A2,$06f    ; COLOR17, also COLOR1 des Sprite0
  166.     dc.w    $1A4,$0c0    ; COLOR18, also COLOR2 des Sprite0
  167.     dc.w    $1A6,$0c0    ; COLOR19, also COLOR3 des Sprite0
  168.  
  169.     dc.w    $1AA,$444    ; COLOR21, also COLOR1 des Sprite2
  170.     dc.w    $1AC,$888    ; COLOR22, also COLOR2 des Sprite2
  171.     dc.w    $1AE,$0c0    ; COLOR23, also COLOR3 des Sprite2
  172.  
  173.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  174.  
  175.  
  176. ; *********** Hier ist der Sprite: Klarerweise ist er in CHIP RAM! ************
  177.  
  178. MEINSPRITE0:        ; Länge 6 Zeilen
  179. VSTART0:
  180.     dc.b 180    ; Vertikale Anfangsposition (von $2c bis $f2)
  181. HSTART0:
  182.     dc.b $d8    ; Horizontale Anfangsposition (von $40 bis $d8)
  183. VSTOP0:
  184.     dc.b 186    ; 180+6=186
  185. VHBITS:
  186.     dc.b $00
  187.     dc.w    $0008,$0000
  188.     dc.w    $1818,$0000
  189.     dc.w    $2C28,$1010
  190.     dc.w    $7FF8,$0000
  191.     dc.w    $3FC0,$0000
  192.     dc.w    $01F0,$0000
  193.     dc.w    $0000,$0000
  194.  
  195. MEINSPRITE2:        ; Länge 16 Zeilen
  196. VSTART2:
  197.     dc.b 224    ; Vertikale Anfangsposition (von $2c bis $f2)
  198. HSTART2:
  199.     dc.b $86    ; Horizontale Anfangsposition (von $40 bis $d8)
  200. VSTOP2:
  201.     dc.b 240
  202.     dc.b 0
  203.     dc.w    $0200,$0000
  204.     dc.w    $0200,$0000
  205.     dc.w    $0200,$0000
  206.     dc.w    $0000,$0200
  207.     dc.w    $0000,$0700
  208.     dc.w    $0000,$0700
  209.     dc.w    $0500,$0200
  210.     dc.w    $0200,$0500
  211.     dc.w    $0500,$0200
  212.     dc.w    $0200,$0500
  213.     dc.w    $1540,$0200
  214.     dc.w    $0200,$1DC0
  215.     dc.w    $0000,$1FC0
  216.     dc.w    $0000,$1740
  217.     dc.w    $0500,$0200
  218.     dc.w    $0000,$0000
  219.     dc.w    $0000,$0000
  220.  
  221. ;    Bild der Startrampe
  222.  
  223. PIC:
  224.     incbin    "Landschaft.raw"
  225.  
  226.     end
  227.  
  228. In  diesem Beispiel sehen wir, wie man die Kollision zwischen zwei Sprites
  229. registrieren kann.
  230. Wir haben zwei Objekte, die sich kreuzen. Achtet darauf, daß wir  für  die
  231. zwei  Objekte  die  Sprites  0 und 2 gewählt haben, also zwei Sprites, die
  232. verschiedenen Paaren angehören. Das erlaubt uns zum Einen  die  Verwendung
  233. von  zwei  verscheidenen Farbpaletten, ist aber andererseits notwendig, um
  234. die Kollisionen überhaupt erkennen zu können. Denn  es  ist  nur  möglich,
  235. Kollisionen  zwischen  Sprites  aus verschiedenen Gruppen zu erkennen, und
  236. nicht zwischen Sprites aus ein und demselben Paar. Um  eine  Kollision  zu
  237. erkennen  muß  nur ein Bit im Register CLXDAT kontrolliert werden, wie wir
  238. schon in der Lektion gehört haben.
  239.  
  240. Wenn dieses Bit auf  1  steht,  dann  hat  sich  effektiv  eine  Kollision
  241. zugetragen.  In unserem Beispiel beschränken wir uns lediglich darauf, die
  242. beiden Sprites zu löschen, indem wir die Pointer auf 0 zeigen lassen.  Ihr
  243. könnt  es  natürlich  verbessern,  indem  ihr  eine  schöne  Explosion
  244. dazuzeichnet. Es ist sehr einfach. Als  erstes  zeichnet  ihr  euch  einen
  245. Sprite,  der  eine  Explosion darstellt, und fügt ihn im Listing ein (Aber
  246. bitte in die SECTION, die in  die  CHIP  kommt!!).  Dann  modifiziert  die
  247. Routine  CheckColl:  wenn  eine  Kollision  auftritt,  dann  ersetzt  die
  248. folgenden Zeilen
  249.  
  250.  
  251.     MOVEQ    #0,d0          ; ansonsten lösche die Sprites
  252.     LEA    SpritePointers,a1 ; Spritepointer 0
  253.     move.w    d0,6(a1)      ; lösche Spritepointer0 in der Copperlist
  254.     move.w    d0,2(a1)
  255.  
  256. durch diese
  257.  
  258.     MOVE.L    #EXPLOSIONS_SPRITE,d0    ; Adresse des Explosionssprite
  259.     LEA    SpritePointers,a1    ; Spritepointer 0
  260.     move.w    d0,6(a1)      ; verändert Spritepointer 0 in der Copperlist
  261.     swap    d0
  262.     move.w    d0,2(a1)
  263.  
  264. dadurch wird das Bild des Flugzeuges durch das der Explosion ersetzt.  Ihr
  265. müßt  dann  natürlich  noch  die  Byte,  die  die  Position des Flugzeuges
  266. kontrollieren, in die Kontrollbytes der Explosion kopieren. Das könnt  ihr
  267. nun  aber  schon alleine. Ihr müßt nur bei VSTOP etwas aufpassen: wenn die
  268. Explosion eine andere Höhe hat als das Flugzeug, dann könnt ihr nicht  nur
  269. das  alte  VSTOP  einsetzen,  sondern  ihr  müßt  es  anpassen.  Aber  nix
  270. schwieriges.
  271.  
  272. In diesem Beispiel haben wir gezielt sehr einfache Bahnen gewählt  (gerade
  273. Linien),  um  den  Mechanismus  der  Kollision besser zu zeigen. Ihr könnt
  274. statt dieser Routinen auch solche mit Tabellen einsetzen, wie wir  sie  in
  275. einigen vorigen Beispielen verwendet haben.
  276.  
  277.  
  278.