Moving sprites: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
mNo edit summary
m (add graphics code category)
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Sprites can be moved individually if they're not [[Sticky bit|stuck together]]. If they are, the sprite block can be moving by setting the [[sprites#driving sprite|driving sprite]]'s position.
Sprites can be moved individually if they're not [[Sticky bit|stuck together]]. If they are, the sprite block can be moved by only setting the [[sprites#driving sprite|driving sprite]]'s position. The chained sprites will move accordingly.


Like every location in VRAM, these values can be updated mid-frame to create [[scanline effects]].
Like every location in [[VRAM]], these positions can be updated mid-frame to create [[scanline effects]].


=== Horizontal position ===
=== Horizontal position ===
Their horizontal (X) position is set in VRAM, in [[Sprites|SCB4]]. It's relative to the left screen border.
The horizontal (X) position is set in VRAM, in [[Sprites|SCB4]]. It's relative to the left screen border.


Example: writing $0010 to $8402, puts sprite #2 at 16 pixels from the left.
Example: writing $0010 to $8402, puts sprite #2 at 16 pixels from the left.


ASM routine to set the X position of a given sprite:
ASM routine to set the X position of a given sprite:
<pre>
<syntaxhighlight>
;D0: Sprite #
;D0: Sprite #
;D1: X position
;D1: X position
SetSprX:
SetSprX:
     addi.w  #SCB4,d0
     addi.w  #SCB4,d0
     move.w  d0,VRAM_ADDR
     move.w  d0,VRAM_ADDR   ; Set VRAM address to SCB4+sprite #
     lsl.w  #7,d1
     lsl.w  #7,d1           ; Put position value to the left
     move.w  d1,VRAM_RW
     move.w  d1,VRAM_RW
     rts
     rts
</pre>
</syntaxhighlight>


=== Vertical position ===
=== Vertical position ===
Their vertical (Y) position is set in VRAM, in [[Sprites|SCB3]]. It's reversed (496-Y), and relative to the top screen border.
The vertical (Y) position is set in VRAM, in [[Sprites|SCB3]]. It's reversed (496-Y), and relative to the top screen border.
A value of $1F0 sets the sprite to Y=0, $110 sets it at 224 (out of the visible area).
A value of $1F0 sets the sprite to Y=0, $110 sets it at 224 (right out of the visible area).


Example: writing 496-14 ($1E2) to $8205, puts sprite #5 at 14 pixels from the top.
Example: writing $F100 ((496-14)<<7) at VRAM address $8205, puts sprite #5 at 14 pixels from the top.
 
Be aware that the vertical position word also holds the size and the sticky bit of the sprite.


ASM routine to set the Y position of a given sprite:
ASM routine to set the Y position of a given sprite:
<pre>
<syntaxhighlight>
;D0: Sprite #
;D0: Sprite #
;D1: Y position
;D1: Y position
SetSprY:
SetSprY:
     addi.w  #SCB3,d0
     addi.w  #SCB3,d0
     move.w  d0,VRAM_ADDR
     move.w  d0,VRAM_ADDR   ; Set VRAM address to SCB3+sprite #
     neg.w  d1
     neg.w  d1             ; Do 496-position
     addi.w  #496,d1
     addi.w  #496,d1
     lsl.w  #7,d1
     lsl.w  #7,d1           ; Put position value to the left
     move.w  VRAM_RW,d2
     move.w  VRAM_RW,d2     ; Read VRAM
     andi.w  #$007F,d2      ; Preserves the sticky bit and size attributes
     andi.w  #$007F,d2      ; Preserve the sticky bit and size attributes
     or.w    d1,d2
     or.w    d1,d2           ; Change position value
     move.w  d2,VRAM_RW
     move.w  d2,VRAM_RW
     rts
     rts
</pre>
</syntaxhighlight>
 
==Example==
 
[[File:nyandemo.png|right]]
 
Animates ~100 individual and grouped sprites.
 
Source and romset: [[Media:nyanmvs.zip|nyanmvs.zip]]


[[Category: Code]]
[[Category: Code]]
[[Category: HowTo]]
[[Category:Graphics Code]]

Latest revision as of 04:47, 26 November 2015

Sprites can be moved individually if they're not stuck together. If they are, the sprite block can be moved by only setting the driving sprite's position. The chained sprites will move accordingly.

Like every location in VRAM, these positions can be updated mid-frame to create scanline effects.

Horizontal position

The horizontal (X) position is set in VRAM, in SCB4. It's relative to the left screen border.

Example: writing $0010 to $8402, puts sprite #2 at 16 pixels from the left.

ASM routine to set the X position of a given sprite:

;D0: Sprite #
;D1: X position
SetSprX:
    addi.w  #SCB4,d0
    move.w  d0,VRAM_ADDR    ; Set VRAM address to SCB4+sprite #
    lsl.w   #7,d1           ; Put position value to the left
    move.w  d1,VRAM_RW
    rts

Vertical position

The vertical (Y) position is set in VRAM, in SCB3. It's reversed (496-Y), and relative to the top screen border. A value of $1F0 sets the sprite to Y=0, $110 sets it at 224 (right out of the visible area).

Example: writing $F100 ((496-14)<<7) at VRAM address $8205, puts sprite #5 at 14 pixels from the top.

Be aware that the vertical position word also holds the size and the sticky bit of the sprite.

ASM routine to set the Y position of a given sprite:

;D0: Sprite #
;D1: Y position
SetSprY:
    addi.w  #SCB3,d0
    move.w  d0,VRAM_ADDR    ; Set VRAM address to SCB3+sprite #
    neg.w   d1              ; Do 496-position
    addi.w  #496,d1
    lsl.w   #7,d1           ; Put position value to the left
    move.w  VRAM_RW,d2      ; Read VRAM
    andi.w  #$007F,d2       ; Preserve the sticky bit and size attributes
    or.w    d1,d2           ; Change position value
    move.w  d2,VRAM_RW
    rts

Example

Animates ~100 individual and grouped sprites.

Source and romset: nyanmvs.zip