Mario "Bewegen"

geschrieben am 26.01.2012 15:38:32
( Link )
Hallo leute habe ein problem mit einem von mir geschribenen sprite...
Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT and MAIN JSL targets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

dcb "INIT"
JSR SPRITE_INIT_ROUTINE
RTL

dcb "MAIN"
JSR SPRITE_MAIN_ROUTINE
RTL


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SPRITE_ROUTINE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SPRITE_INIT_ROUTINE:
STZ $0F62
STZ $0F63
RTS
SPRITE_MAIN_ROUTINE:
LDA #$80
STA $0DAC
STA $0DAD

LDA $7B
BNE ANotPressed
LDA $72
BNE ANotPressed
LDA $71
BNE ANotPressed
LDA $77
AND #$04
BEQ ANotPressed

LDA $0F62
CMP #$01
BEQ MoveRoutine
LDA $0F62
CMP #$01
BCC SpriteToMario
LDA $0F62
CMP #$01
BCS MarioToSprite
RTS
SpriteToMario:
LDA $94 ;\
STA $E4,x ;|Sprite gets Mario position
LDA $95 ;|
STA $14E0,x ;|
LDA $96 ;|
STA $D8,x ;|
LDA $97 ;|
STA $14D4,x ;/

LDA $17
AND #$80
BNE TESTB
LDA #$01
STA $0F63
TESTB:
LDA $0F63
BEQ ANotPressed

LDA $17 ;\
;AND #$80 ;|If A is pressed go next time to sprite move routine
CMP #$80
BNE ANotPressed ;|
LDA #$01 ;|
STA $0F63 ;|
STA $0F62 ;|
ANotPressed: ;|
RTS ;/

MarioToSprite:
STZ $0F62
LDA $E4,x ;\
STA $94 ;| Mario gets Sprite position
LDA $14E0,x ;|
STA $95 ;|
LDA $D8,x ;|
STA $96 ;|
LDA $14D4,x ;|
STA $97 ;/

LDA #$29
STA $1DFC
STZ $18BD
STZ $9D
RTS

MoveRoutine:
LDA #$FF
STA $18BD
STA $9D
STZ $7D ;|
STZ $7B ;/

LDA $17
AND #$80
BNE TESTA
STZ $0F63
TESTA:
LDA $0F63
BNE NotPressed
LDA $17 ;\
AND #$80 ;|If A is pressed go next time to MarioToSprite Routine
BEQ NotPressed ;|
;LDA $15A0,x ;|
;BNE OFFScreenPressed
;LDA $186C,x ;|
;BNE OFFScreenPressed
LDA #$02 ;|
STA $0F62 ;|
RTS ;|
OFFScreenPressed:
LDA #$2A
STA $1DFC
LDA $94 ;\
STA $E4,x ;|Sprite gets Mario position
LDA $95 ;|
STA $14E0,x ;|
LDA $96 ;|
STA $D8,x ;|
LDA $97 ;|
STA $14D4,x ;/
RTS
NotPressed: ;/
LDA $15 ;\
AND #$01 ;|Check if sprite should move
BNE RightA ;|
LDA $15 ;|
AND #$02 ;|
BNE LeftA ;|
LDA $15 ;|
AND #$04 ;|
BNE DownA ;|
LDA $15 ;|
AND #$08 ;|
BNE UpA ;/
JSR Graphics ;draw Graphics
RTS
RightA:
LDA #$10
STA $B6,x
JSL $018022
JSR Graphics ;draw Graphics
RTS
LeftA:
LDA #$F0
STA $B6,x
JSL $018022
JSR Graphics ;draw Graphics
RTS
DownA:
LDA #$10
STA $AA,x
JSL $01801A
JSR Graphics ;draw Graphics
RTS
UpA:
LDA #$F0
STA $AA,x
JSL $01801A
JSR Graphics ;draw Graphics
RTS
;=============================================================================
;Graphics
;=============================================================================
PROPERTIES: dcb $04,$06,$08,$0A
Graphics:
JSR GET_DRAW_INFO
LDA $00
STA $0300,y

LDA $01
CLC
ADC #$10
STA $0301,y

LDA $0303,y
ORA $64
STA $0303,y

LDA #$24
STA $0302,y
LDY #$02
LDA #$00
JSL $01B7B3
RTS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GET_DRAW_INFO
; This is a helper for the graphics routine. It sets off screen flags, and sets up
; variables. It will return with the following:
;
; Y = index to sprite OAM ($300)
; $00 = sprite x position relative to screen boarder
; $01 = sprite y position relative to screen boarder
;
; It is adapted from the subroutine at $03B760
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPR_T1: dcb $0C,$1C
SPR_T2: dcb $01,$02

GET_DRAW_INFO: STZ $15A0,x ; reset sprite offscreen flag, vertical
STZ $186C,x ; reset sprite offscreen flag, horizontal
LDA $E4,x ; \
CMP $1A ; | set horizontal offscreen if necessary
LDA $14E0,x ; |
SBC $1B ; |
BEQ ON_SCREEN_X ; |
INC $186C,x ; /

ON_SCREEN_X: LDA $14E0,x ; \
XBA ; |
LDA $E4,x ; |
REP #$20 ; |
SEC ; |
SBC $1A ; | mark sprite invalid if far enough off screen
CLC ; |
ADC.W #$0040 ; |
CMP.W #$0180 ; |
SEP #$20 ; |
ROL A ; |
AND #$01 ; |
STA $15C4,x ; /
BNE INVALID ;

LDY #$00 ; \ set up loop:
LDA $1662,x ; |
AND #$20 ; | if not smushed (1662 & 0x20), go through loop twice
BEQ ON_SCREEN_LOOP ; | else, go through loop once
INY ; /
ON_SCREEN_LOOP: LDA $D8,x ; \
CLC ; | set vertical offscreen if necessary
ADC SPR_T1,y ; |
PHP ; |
CMP $1C ; | (vert screen boundry)
ROL $00 ; |
PLP ; |
LDA $14D4,x ; |
ADC #$00 ; |
LSR $00 ; |
SBC $1D ; |
BEQ ON_SCREEN_Y ; |
LDA $15A0,x ; | (vert offscreen)
ORA SPR_T2,y ; |
STA $15A0,x ; |
ON_SCREEN_Y: DEY ; |
BPL ON_SCREEN_LOOP ; /

LDY $15EA,x ; get offset to sprite OAM
LDA $E4,x ; \
SEC ; |
SBC $1A ; | $00 = sprite x position relative to screen boarder
STA $00 ; /
LDA $D8,x ; \
SEC ; |
SBC $1C ; | $01 = sprite y position relative to screen boarder
STA $01 ; /
RTS ; return

INVALID: PLA ; \ return from *main gfx routine* subroutine...
PLA ; | ...(not just this subroutine)
RTS ; /

wenn ich den code ausführe funktionirt grundsätzlich alles wie geplant...
aber wenn ich Marios position "Update":
Code
    LDA $E4,x    ;\
STA $94 ;| Mario gets Sprite position
LDA $14E0,x ;|
STA $95 ;|
LDA $D8,x ;|
STA $96 ;|
LDA $14D4,x ;|
STA $97 ;/

setzte ich ja einfach Marios X/Y position einfach wie ich sie gerne hätte aber wenn der screen nun scrollt kommt es zu dem problem das das spiel die falschen Blöcke lädt...
wie kann ich das verhindern?
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 26.01.2012 15:49:33
( Link )
Kannst du mal beschreiben, was genau du mit dem Code denn eigentlich erreichen willst?
-Das quadratische Rad neu erfinden-
Mit das quadratische Rad neu erfinden (englisch Reinventing the square wheel) bezeichnet man die Bereitstellung einer schlechten Lösung, wenn eine gute Lösung bereits existiert.

-Slowsort-
Slowsort (von engl. slow: langsam) ist ein langsamer, rekursiver Sortieralgorithmus, der nach dem Prinzip Vervielfache und kapituliere (engl. Multiply and surrender, eine Parodie auf Teile und herrsche) arbeitet.

geschrieben am 26.01.2012 15:50:53
( Link )
Gar nicht. Die Position direkt und in größerem Umfang zu verändern, damit kommt das Spiel nicht klar.

Die bessere Möglichkeit, Marios Position zu verändern, wäre, ihn dorthin zu bewegen (mit $7B und $7D). Das dauert zwar ungleich länger, muss aber sein.
geschrieben am 26.01.2012 16:01:30
( Link )
@RPGHacker grundsätzlich soll der player wenn er A(?) drückt eingefrohren werden und kann stattdessen eine art "cursor" bewegen wenn er dann noch einmal A Drückt wird er dahin "gebeamt" wo das sprite ist.
@WYE wenn ich nur 7D/7B setze kann ich ihn aber nicht durch Wände bewegen lassen oder?
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 26.01.2012 16:34:08
( Link )
Durch Wände nicht, nein.

Ich würde das Ganze anders angehen: Auf Knopfdruck Mario unsichtbar machen und den Cusror-Sprite an seiner Position anzeigen. Dann noch dafür sorgen, dass man ihn mit den Pfeiltasten bewegen kann und auf erneuten Knopfdruck Mario wieder erscheinen lassen, die Interaktion sowie das normale Verhalten der Pfeiltasten wiederherstellen und den Cursor verschwinden lassen.
geschrieben am 26.01.2012 18:16:30
( Link )
so wollte ich es zu erst auch machen ... ^^
die nachteile die es hätte wären aber doch ,dass ich 2 sprites brauche
1. was so aussieht wie mario und so tuht als würde es es an marios stelle blaiben
2. der cursor der den hauptpart übernimmt
wie kann ich machen das mario wenn ich ihn wie den cursor bewege keine blockcodes auslöst?
also das er keine interaktion mehr mit ihnen hat...
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->
geschrieben am 26.01.2012 19:48:02
( Link )
Das kannst du doch auch in einen Sprite packen. Du musst ja nicht ständig die Grafikroutine ausführen.

Und was die Interaktion angeht:
Zitat
$7E:185C 1 byte Player The player falls through interactive layers flag. Used by the moving holes in ghost house floors. #$00 = Don't fall through; #$01 = fall through.
geschrieben am 26.01.2012 20:10:47
( Link )
ok gibt es so eine Flag auch noch für sprites?
habe dazu nichts gefunden...
Und ich habe noch ein weiteres problem
Code
NoMove:
LDA #$2A
STA $1DFC
JSR Graphics
RTS
RightA:
JSR CheckDistance
BEQ NoMove
LDA #$10
STA $7B
JSR Graphics ;draw Graphics
RTS
LeftA:
JSR CheckDistance
BEQ NoMove
LDA #$F0
STA $7B
JSR Graphics ;draw Graphics
RTS
DownA:
JSR CheckDistance
BEQ NoMove
LDA #$10
STA $7D
JSR Graphics ;draw Graphics
RTS
UpA:
JSR CheckDistance
BEQ NoMove
LDA #$F0
STA $7D
JSR Graphics ;draw Graphics
RTS
CheckDistance:
REP #$20
LDA $0F64 ;\Check if X position is in the range of 6 Blocks
ADC #$0060 ;|
CMP $94 ;|
BCS Skip ;|
LDA $0F64 ;|
SBC #$0060 ;|
CMP $94 ;|
BCC Skip ;/

LDA $0F66 ;\Check if Y position is in the range of 6 Blocks
ADC #$0060 ;|
CMP $96 ;|
BCS Skip ;|
LDA $0F66 ;|
SBC #$0060 ;|
CMP $96 ;|
BCC Skip ;/
SEP #$20
LDA #$FF
RTS
Skip:
SEP #$20
LDA #$00
RTS

Zu den Labeln "Richting"A kommt man wenn man die entsprechende richtung drückt
$0F64/65 und $0F66/67 enthalten die Marios Startposition
Die Routine soll eigentlich nur dafür sorgen das sich Mario bewegt(das funktionirt) und überprüfen ob er sich nicht zuweit bewegt(dabei schmirt es ab)
WAS, WIE, WO???? Ne, Ne ich bin nicht die Signatur ...
Ich putze hier nur.

Mein Hack:
<!-- m --><a class="postlink" href="http://www.youtube.com/user/conankun88#p/a/u/0/8vdcyGylrg0">http://www.youtube.com/user/conankun88# ... vdcyGylrg0</a><!-- m -->