Moving sprites: Difference between revisions
m (6 revisions: Import from wikkii) |
No edit summary |
||
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 | 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 | Like every location in [[VRAM]], these positions can be updated mid-frame to create [[scanline effects]]. | ||
=== Horizontal position === | === Horizontal position === | ||
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. | ||
Line 21: | Line 21: | ||
=== Vertical position === | === Vertical position === | ||
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 | Example: writing $1E2 (496-14) to $8205, puts sprite #5 at 14 pixels from the top. | ||
ASM routine to set the Y position of a given sprite: | ASM routine to set the Y position of a given sprite: | ||
Line 42: | Line 42: | ||
rts | rts | ||
</pre> | </pre> | ||
==Example== | |||
[[File:nyandemo.png|right]] | |||
Animates ~100 individual and grouped sprites. | |||
Source and romset: [[http://furrtek.free.fr/noclass/neogeo/nyanmvs.zip nyanmvs.zip]] | |||
[[Category: Code]] | [[Category: Code]] |
Revision as of 23:57, 2 July 2011
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 lsl.w #7,d1 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 $1E2 (496-14) to $8205, puts sprite #5 at 14 pixels from the top.
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 neg.w d1 addi.w #496,d1 lsl.w #7,d1 move.w VRAM_RW,d2 andi.w #$007F,d2 ; Preserves the sticky bit and size attributes or.w d1,d2 move.w d2,VRAM_RW rts
Example
Animates ~100 individual and grouped sprites.
Source and romset: [nyanmvs.zip]