|
Subject: playing with copies (was:Re: [stella] discovering the tricks(maybe)) From: Piero Cavina <p.cavina@xxxxxxxxxxxxx> Date: Thu, 6 Mar 1997 22:42:07 +0100 |
At 13:00 -0700 6-03-1997, Nick S Bensema wrote:
>>
>>I suspect that a common technique for putting more objects on the screen
>>must be based on the multiple copies feature of Atari 2600 sprites.
>>
>>Think about Activision Plaque Attack enemies (or a lot of other shooters),
>>where you have groups of three aliens:
>>
>> X X X
>
>Space Invaders, and I think Galaxian, used groups of six, or rather,
>two groups of three.
uh, Galaxian maybe more that 6 if I remember correctly (creeps...)
>
>This is a perfect opportunity to make your life simpler through tables.
yeah!
>It would probably take 16 bytes; 14 if you take it as given in your
>code that 000 means nothing shows up... very wise, since there is no
>NUSIZ register for "nothing shows up".
hmm, not really, as 000 means one copy only (see stella reference guide).
we need a way to say that a sprite is missing. (see below)
>>is needed, as said above. Or maybe you might use the other sprite to draw
>>the exploding alien. Or just let them disappear... :-)
>
>Or the missile. Of course, Space Invaders did id the hard way, and I
>suggest you check the source code to figure out how they pulled
>that one off.
thanks no, I've enough for this week and there's Bob code to study :-)
Here we go: a routine to handle collisions between a sprite in multiple
copies and a missile.
The result will be a sprite with the appropriate configuration shifted in
the correct position.
; WARNING: UNTESTED CODE!!
;
;MXPOS: missile X position. Missile must have width=1 clock.
;SXPOS: sprite position. Sprite must be in "med" mode, note that the second
copy position will be
;SXPOS+16 and the third SXPOS+32.
;SCONF: index to sprite configuration, 5 possible values (see table below).
$4 means that the sprite ;does not exist!
;
; NUSIZ sprite
;SCONF register mode
;
; 0 xxxxx000 X....
; 1 xxxxx001 X.X..
; 2 xxxxx010 X...X
; 3 xxxxx011 X X X
;
; 4 -------- .....
;we suppose that a collision between the sprite and a missile has been
detected.
;1 - find out which copy has been hit.
;hint: MXPOS>=SXPOS, as the copies as drawn left to right from the first @
SXPOS
LDA MXPOS
SEC
SBC SXPOS
LSR A
LSR A
LSR A
LSR A ; divide by 16 so that A=0..2, index to the hit copy
;2 - find the index to the table values for the new configuration/offset:
; X = index to hit copy * 4 + index to sprite configuration
ASL A
ASL A ; whoops! that's stupid after four LSR, I've left all otherwise the
code might be obscure
CLC
ADC SCONF
TAX
;3 - get the new configuration
LDA newconftable,X
BMI error ; this situation is impossible, don't do anything
STA SCONF
;4 - get the offset and add it to get the new position
CLC
LDA SXPOS
ADC offsettable,X
STA SXPOS
error:
RTS
;done. will it work?
newconftable byte $4, $0, $0, $1
byte $FF, $0, $FF, $2
byte $FF, $FF, $0, $1
offsettable byte $0, $10, $20, $10
byte $FF, $0, $FF, $0
byte $FF, $FF, $0, $0
; $FF means "ERROR" - a table value that should never be accessed.
; example
;
;SCONF=3 "X X X"
;SXPOS=120
;MXPOS=138
;
;MXPOS-SXPOS=18
;[18/16] = 1 so the second copy was hit.
;
;X = 1*4+3 = 7
;
;The indexed value of sconftable is 2 = "X X", now the second copy is
missing.
;The indexed value of offsettable is 0, thus the X position doesn't change.
Ciao,
P.
--
To unsubscribe, send the word UNSUBSCRIBE in the body of a message to
stella-request@xxxxxxxxxxx
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [stella] discovering the tricks, crackers | Thread | [stella] Special VCS emulator, Dan Boris |
| Re: [stella] Making carts, Glenn Saunders | Date | Re: [stella] Making carts, huber |
| Month |