Probleme mit Custom-Sprite

geschrieben am 24.03.2013 12:31:37
( Link )
Hallo, da ich komischerweise keine Videos auf YouTube hochladen kann (Upload bleibt bei 0 %), muss ich mit Bildern arbeiten:

Ich habe den Reverse-Spiny (von Romi) zu einem Ceiling-Buzzy-Beetle weiterentwickelt. Er läuft an der Decke entlang und fällt kurz vor Mario herunter, um im Panzer schnell den Boden entlangzugleiten:


Wenn Mario draufhüpft, soll er sich in einen Buzzy-Beetle verwandeln, der sich zunächst in seinem Panzer befindet.

Nun die Probleme:

a) Wenn Mario draufspringt, liegt der Beetle wirklich als Panzer rum, aber er bleibt so und erwacht leider nicht. Diesen Code verwende ich, um einen Buzzy-Beetle draus zu machen:
Code
SUB_SPAWN_SPRITE    LDA #$11 			; lade Sprite-Nummer, Sprite = Buzzy Beetle
STA $9E,x ; hier wird Sprite-Nummer gespeichert (normale Sprites)
LDA #$0A ; lade #$0A = kicked
STA $14C8,x ; Sprite Status Table
JSL $07F7D2 ; Reset sprite tables.
RETURN4 RTS

Was muss ich tun, um den Stun-Timer zu aktivieren?

b) Wenn Mario auf ihn draufspringt, liegt er umgedreht da, statt wie vorher mit dem Panzerboden nach oben:

Ich habe es schon hiermit versucht (im obigen Code gleich unter STA $14C8,x), klappt aber nicht:
Code
		    LDA $15F6,x
ORA #$80
STA $15F6,x


c) Wie kann ich dafür sorgen, dass sich der ankommende Panzer auch in einen "stunned" Buzzy-Beetle verwandelt, wenn Mario ihn seitlich mit dem Cape attakiert?
Ich habe auf SMW-Central diesen "Cape collision detection"-Code gefunden:
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Spinning Cape Contact Routine by Bio(mostly ripped from the original wich start at $93BE);
;If contact is found, $01 is returned, if it isn't, $00 is returned ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SCCR
LDA $13E8
BEQ SCCRNOCONTACT
LDA $15D0,x
ORA $154C,x
ORA $1FE2,x
BNE SCCRNOCONTACT
LDA $1632,x
PHY
LDY $74
BEQ SCCRLABEL1
EOR #$01
SCCRLABEL1 PLY
EOR $13F9
BNE SCCRNOCONTACT
JSL $03B69F
LDA $13E9
SEC
SBC #$02
STA $00
LDA $13EA
SBC #$00
STA $08
LDA #$14
STA $02
LDA $13EB
STA $01
LDA $13EC
STA $09
LDA #$10
STA $03
SCCRFINNISH JSL $03B72B
BCC SCCRNOCONTACT
LDA #$01
RTS
SCCRNOCONTACT
LDA #$00
RTS

Ich muss also zum Code unter a) springen, wenn tatsächlich eine Cape-Berührung stattfindet, wie mache ich das genau?
geschrieben am 24.03.2013 12:55:02
( Link )
Zitat von Chris:
a) Wenn Mario draufspringt, liegt der Beetle wirklich als Panzer rum, aber er bleibt so und erwacht leider nicht. Diesen Code verwende ich, um einen Buzzy-Beetle draus zu machen:
Code
SUB_SPAWN_SPRITE    LDA #$11 			; lade Sprite-Nummer, Sprite = Buzzy Beetle
STA $9E,x ; hier wird Sprite-Nummer gespeichert (normale Sprites)
LDA #$0A ; lade #$0A = kicked
STA $14C8,x ; Sprite Status Table
JSL $07F7D2 ; Reset sprite tables.
RETURN4 RTS

Was muss ich tun, um den Stun-Timer zu aktivieren?

Ich würde mal $1540,x probieren, aber 'ne Garantie kann ich dafür alles andere als geben. Steht im Code des echten Buzzy-Beetle-Sprites nicht was dazu?

Zitat von Chris:
c) Wie kann ich dafür sorgen, dass sich der ankommende Panzer auch in einen "stunned" Buzzy-Beetle verwandelt, wenn Mario ihn seitlich mit dem Cape attakiert?
Ich habe auf SMW-Central diesen "Cape collision detection"-Code gefunden:
[...]
Ich muss also zum Code unter a) springen, wenn tatsächlich eine Cape-Berührung stattfindet, wie mache ich das genau?


Probier mal das hier:

Code
	; Hier die Kollisionsroutine einfügen
; (nein, besser irgendwo am Ende)

JSR SCCR
BEQ NoCapeContact
; Hier Code einfügen, der bei Cape-Kontakt ausgeführt wird
NoCapeContact:
; hier geht's weiter
geschrieben am 24.03.2013 14:55:54
( Link )
Gut, das Cape-Problem konnte dank deiner Hilfe beseitigt werden.

Der Rest nicht...ich habe schon verschiedene Sachen ausprobiert. Auch in anderen Sprites, die eigentlich den Stun-Timer verwenden, ist nichts Hilfreiches enthalten. Ich muss es halt so erstmal weiter testen.