Danke für dein lob, Dominik.
@ ExMariox555x:
Hier:
Wie ihr seht, ist die Main-OW noch nicht fertig. Aber dafür sieht man (zum größten Teil) das neue "Yoshi's Island", eine Eiswelt.
Ich befasse ich gerade mit asm und habe folgende zwei Fragen:
Ich habe zum Probieren mal einen Block erstellt, der bei Berührung den Coin-Counter um 01 erhöht und nach 99 wieder von 00 beginnt und ein Leben vergibt:
Code LDA $0DBF
INC
CMP #99
BCS NULL
STA $0DBF
LDA #$01
STA $1DFC
RTL
NULL:
STZ $0DBF
INC $18E4
RTL
Leider schnellt der Coin-Counter ununterbrochen nach oben (und beginnt wieder von vorne), solange Mario den Block berührt. Wie krieg ich es hin, dass der Coin-Counter sich nur um eine Münze erhöht, egal wie lange Mario den Block berührt? Erst nach Ablassen und erneutem Berühren soll der Coin-Counter um eine weitere Münze steigen.
Die zweite Frage ist vor allem an RPG Hacker gerichtet, da ich etwas aus seinem asm-Tutorial nicht verstehe:
Du schreibst, dass BCC springt, wenn die Carry Flag clear ist. Das passiert, wenn bei einer Subtraktion das Ergebnis kleiner als 00 ist, z. B.
LDA #$02
CMP #$03.
So weit, so gut. Darunter hast du einen Beispielcode aufgeführt, der Mario zu Feuermario machen soll, nur wenn er klein oder Super-Mario ist (also $19 = $00 oder $01):
CodeLDA $19 ; Lade das Powerup
CMP #$02 ; Vergleiche mit $02
BCC FeuerMario ; Kleiner $02? Dann mache Mario zu Feuer Mario
[...]
FeuerMario:
LDA #$03 ;\ Dieser Code wird immer ausgeführt
STA $19 ;/
Du schreibst: "...Benutzt ihr BCC, so wird, wenn die Bedingung erfüllt ist, der Code unter "BCC" gar nicht ausgeführt. Anders wird aber der Code unter "FeuerMario:" selbst dann ausgefüllt, wenn die Bedingung nicht erfüllt ist...."
Vielleicht bin ich etwas schwer von Begriff, aber wenn
$19 = $00 oder $01 und CMP #$02, dann ist das Ergebnis unter $00 und die Carry Flag damit clear und BCC müsste doch springen??
Die Overworld sieht doch sehr interessant aus, gefällt mir! Die Level-Bilder ebenfalls, gute kombination aus SMW- und sonstigen Grafiken. Werde die Demo auf jeden Fall mal testen.
Ich habe mich mal mit dem Sprite-Programming-Tutorial von Iceguy befasst und dazu einige Fragen:
1) Im CFG-Editor kann man das Object-Clipping einstellen, und zwar von 0 bis F. Weiß jemand, was die einzelnen Variablen 0 bis F bedeuten, worin sie sich unterscheiden? Konnte dazu nichts weiter finden.
2) Im Tutorial wird gezeigt, wie ein Sprite Mario bei seitlicher Berührung verletzt und bei Berührung durch Mario von oben stirbt, hier ein Auszug:
CodeJSL $01A7DC ; führe Mario-Sprite-Kontakt-Routine aus
BCC NoContact ; springt weiter, wenn keine Berührung (also Carry Flag = clear)
LDA $0E ; vergleicht Marios und Sprites y-Position
CMP #$E6 ; wenn größer als #$E6, dann seitliche Berührung, ansonsten Berührung von oben
BPL SpriteWins
...
Mir erschließt sich erstens nicht, wie man ausgerechnet auf #$E6 kommt. Kann man das irgendwo nachlesen? Wie groß wäre denn der Wert, wenn Mario den Sprite von unten berührt?
Zweitens verstehe ich das BPL nicht. Dieses springt doch erst bei einer positiven Zahl, also ab #$00. Aber größer als #$E6 ist auch #$E7 bis #$FF, und diese Zahlen sind negativ. Also dürfte er doch hier noch nicht springen?
Außerdem habe ich diese Variante in einigen Sprites, auf denen diese Eigenschaft zutrifft (also bei seitl. Berührung: Mario wird verletzt, bei obiger Berührung des Sprites: Sprite stirbt), nicht gefunden. Speziell habe ich beim Classic Goomba und bei Bullet Bill geguckt. Es scheint also auch andere Möglichkeiten zu geben, oder?
Zu Bild 1: könnte meiner Meinung nach etwas mehr Farbe gebrauchen. Ansonsten schicke Zeichnung.
Zu Bild 2: Perfekt! Ein sehr schönes titelbild.
Zu Bilder 3 und 4: Schöner Hintergrund, passt auch sehr gut zu SMW. Könnte praktisch ein Original-Hintergrund sein
.
Zu Bild 5: Der Hintergrund ist meiner Meinung nach etwas Mario-untypisch, passt irgendwie nicht so recht zu SMW.
Zu Bild 6 und 7: Der Switch-Palace-Hintergrund ist dir wieder sehr gut gelungen, passt.
Zu Bild 8: schickes Schloss, gefällt mir.
Zu Bild 9: Sieht sehr futuristisch und SMW-fremd aus. Ist nicht so mein Fall.
Ich finde es gut, dass du keine Custom-Musik verwenden willst. Bin gespannt, wie's weitergeht.
Ich hab die Demo jetzt auch mal gespielt und bin beeindruckt von deinen Levels. Man merkt, dass du viel Zeit und Arbeit reingesteckt hast. Sie sind eine echte Augenweide mit ihrer ganzen Deko, und auch die Paletten gefallen mir. Jedes Level ist anders, eine Welt für sich, wenn man so will.
Gut ist auch, dass in den Levels keine Zeitbegrenzung vorhanden ist, so dass man alles in Ruhe erforschen kann.
Zwei Dinge möchte ich allerdings noch erwähnen:
- Wenn Mario stirbt, erscheint "Time up!". Das lässt sich beheben:
Zitat052F1 $00:D0F1 1 byte ASM ASM that handles the 'TIME UP!' message. Change 'D0' to '80' to disable it.
- In Level 3, also das Waldlevel mit dem Wasser, würde ich das Wasser animieren.
Ansonsten sehr guter Hack. Ich bin auf alles Weitere, was du noch kreierst, gespannt.
Ich bastel gerade an einem Fisch und möchte, dass er sich wie in SMW nach einer bestimmten Zeit umdreht und in die entgegengesetzte Richtung schwimmt (horizontal). Und wenn er eine Wand berührt, soll die Dauer bis zum automatischen Richtungswechsel noch mal von vorne beginnen. Wie mache ich das ? (ich möchte nicht den Originalfisch verwenden...)
CodeBITSET JSL $019138 ; interact with objects
LDA $164A ; check if sprite is in water
BNE INWATER
JSL $01802A ; fall down if not in water
INWATER LDA $1588,x ; ... if sprite is touching a wall.
AND #$03 ; (bit 0 and 1)..
BEQ NOFLIP ; If bits aren't set, don't flip the sprite.
LDA $157C,x ;\
EOR #$01 ; | Flip sprite's direction when touching wall.
STA $157C,x ;/
NOFLIP LDY $157C,x ; speed...
LDA XSpeed,y
STA $B6,x
LDY $151C,x
LDA SpriteSpeed,y
STA $AA,x
JSL $018022 ; update sprite x-position without gravity
JSL $01801A ; update sprite y-position without gravity
Ich schätze mal, ich muss mit einem Sprite-Table als Turn-Timer arbeiten. Kann mir jemand helfen?
Danke, dein Code hat mir schon sehr weitergeholfen, es gab nur Probleme mit der Object-Interaction, deshalb hab ich ihn noch etwas ändern müssen. (So ganz verstehe ich trotzdem nicht, warum ein zweiter, normaler Spritetable nötig ist und wie genau der den Stuntimer des ersten überprüft -->bin doch noch eher ein Anfänger bei sowas...)
Falls es dich interessiert, hier das Ergebnis:
Beim SMW-Cheep-Cheep hat mich für meinen Hack immer die fehlende vertikale Bewegung gestört, die beim SMB3-Cheep-Cheep da war.
Ich bin seit Tagen drauf und dran, die beweglichen braunen Plattformen, die sich in der Luft hin- und herbewegen, von allen Seiten solid zu machen, und allmählich mache ich Fortschritte, komme jetzt allerdings nicht weiter. Mein Stand:
Von unten:
Gut: Wenn Mario groß ist, kann er von unten nicht mehr durchspringen (es macht sogar den typischen "Solid-Sound")
Schlecht: Wenn Mario klein ist, kann er leider noch von unten durchspringen. Wie löse ich das ??
Hat Mario, wenn er klein ist, eine andere Y-Position im Verhältnis zum Sprite als wenn er groß ist?
Von der Seite:
Gut: Wenn sich die Plattform seitlich auf Mario zubewegt, wird er bei Berührung weggedrückt (wie beim Autoscrolling).
Schlecht: Wenn sich die Plattform von Mario seitlich wegbewegt, kann er seitlich durchspringen/durchlaufen. Es muss irgendwie gelingen, dass Marios Geschwindigkeit bei Berührung nicht höher ist als die der Plattform, er darf sie nicht "überholen".
Hier der bisherige Code:
CodeSOLIDBLOCK JSL $01A7DC ; check for Mario - sprite contact
BCC RETURN3 ; if not, return
LDA $0E ; Mario's y-position relative to sprite's y-position
CMP #$EC
BPL RANGEOUT ; branch if not touching sprite from above
RETURN3 RTS
RANGEOUT LDA $0E ;Mario Y - Sprite Y. positive if sprite is above mario.
CMP #$02 ;branch if high enough (underflows). Mario's position is higher than it looks
BMI TESTSIDE
LDA $7D ;the following only occurs when he's rising
BPL RETURN3
LDA #$08
STA $7D ;set mario speed to falling
LDA #$35 ;hit head
STA $1DFC
RTS ;return
TESTSIDE JSR SUB_HORZ_POS ;different clipping depending on what side mario is on
BEQ ONRIGHT ;branch if touching sprite from right side
LDA $B6,x ;touching from left side - load sprite x-speed
BPL LEFTRIGHT ;branch if sprite is moving right
STA $7B ;if moving left, sprite's speed = Mario's speed
RTS
LEFTRIGHT (MARIO BERÜHRT SEITLICH LINKS DIE PLATTFORM: HIER MUSS GEREGELT WERDEN, DASS MARIOS GESCHWINDINGKEIT
NICHT HÖHER IST ALS DIE DER PLATTFORM, WENN SIE SICH VON IHM HORIZONTAL WEGBEWEGT, ALSO NACH RECHTS!)
ONRIGHT LDA $B6,x ;touching from right side - load sprite x-speed
BMI RIGHTLEFT ;branch if sprite is moving left
STA $7B ; if moving right, sprite's speed = Mario's speed
RTS
RIGHTLEFT (MARIO BERÜHRT SEITLICH RECHTS DIE PLATTFORM: HIER MUSS GEREGELT WERDEN, DASS MARIOS GESCHWINDINGKEIT
NICHT HÖHER IST ALS DIE DER PLATTFORM, WENN SIE SICH VON IHM HORIZONTAL WEGBEWEGT, ALSO NACH LINKS!)
DONTCLIP RTS
Für einen Block möchte ich die Routine für die Münze, die aus einem ?-Block herauskommt, aktivieren. In der ROM-Map ($02:8A66) steht, dass dazu die low nybbles von $98 und $9A gecleart werden müssen. Was muss ich dazu genau machen?
Das hier: STZ $98
STZ $9A ??
Wieder mal eine etwas schwierigere Frage:
Ich möchte, dass sich mein Sprite, wenn er den Boden berührt, wie ein gekickter Schildkrötenpanzer verhält (er soll sich aber nicht in einen Panzer verwandeln). Er soll also:
- Bricks von der Seite zerstören, ?-Blöcke aktivieren,
- andere Gegner aus dem Weg räumen
- und, wenn Mario draufspringt, anhalten und tragbar sein.
Leider finde ich kein "Disassembly" von einem Schildkrötenpanzer. Weiß jemand, ob das irgendwie möglich ist oder gibt es irgendwo Codes für diese Verhaltensweise?
Mir gefällt die OW auch gut, aber ich würde auch die Animation aus den Seen entfernen.
Der Title-Screen ist auch nicht schlecht, ich würde aber den weißen Hintergrund mit etwas Farbe versehen, vielleicht sogar mit einem Farbverlauf.
zu 1.: Hast du in LM im 8x8-Graphics-Editor kontrolliert, ob die Hammerbros.-Grafik-Datei auch tatsächlich in die ROM eingefügt wurde? Ansonsten musst du wohl die angegebenen Tiles in der ASM-Datei mal mit der Grafik-Datei abgleichen. Normalerweise ist der Körper auch in der selben SP3-Datei wie die Hammer, wenn du unter Tilemaps die hammer_bros (SP3).bin gewählt hast.
Bei 2. kann ich dir nicht helfen, mich würde das aber auch interessieren.
Die Tilemap ist offensichtlich falsch. Versuch's mal mit dieser:
CodeTILEMAP dcb $46,$4A,$7F,$00
dcb $46,$5A,$2F,$00
dcb $48,$4A,$7F,$00
dcb $48,$5A,$2F,$00
Gut, hier mal etwas ausführlicher, da das unter der Tilemap auch Einfluss darauf hat:
CodeTILEMAP dcb $46,$4A,$7F,$00
dcb $46,$5A,$2F,$00
dcb $48,$4A,$7F,$00
dcb $48,$5A,$2F,$00
HORZ_DISP dcb $00,$00,$08
dcb $00,$08,$00
VERT_DISP dcb $F8,$08,$08
TILE_SIZE dcb $02,$00,$00
PROPERTIES dcb $40,$00 ;xyppccct format
Falls das immer noch nicht funktioniert, dann lade dir mal den herunter:
http://www.smwcentral.net/download.php? ... pe=sprites
Ich find's komisch, dass der Hammer Brother im Sprite-Tool so verkorkst ist.
geschrieben am 02.08.2012 17:53:27 in
RISE
Das Waldlevel gefällt mir gut, wie immer. Aber das Unterwasserlevel gefällt mir richtig gut. Schöne Paletten, auch die Blasen sind eine gute Idee, auch wenn's fast schon zu viele sind. Der Welleneffekt passt auch gut da rein.
Ich finde nur diese Noten-Deko im Boden etwas seltsam.
Einen Code, den man in einem bestimmten Level ausführen möchte, muss man in levelcode.asm und/oder levelinitcode.asm einfügen. Hierzu muss man erstmal schauen, welcher Teil des Codes in levelcode.asm und welcher Teil in levelinitcode.asm rein muss. Da kann ich bei deinem Code auf die Schnelle nicht sagen. Versuch mal, alles in levelcode.asm einzufügen.
Dazu suchst du dir die entsprechende Levelnummer in dieser Datei raus und fügst den Code ein. Zum Beispiel:
...
Level105:
(dein Code)
RTS
...
Wenn du den Code in mehreren Levels ausführen möchtest (z.B. neben Level 105 auch Level 109), dann musst du den Code nicht für jedes Level extra einfügen, sondern beziehst dich auf Level105:
...
Level109:
JMP Level105
RTS
...
Am Ende musst du level.asm ganz normal mit Xkas patchen, natürlich vorher Freespace bestimmen. In level.asm wird sich ja auf die anderen mitgelieferten Dateien bezogen.
Kann mir jemand einen Custom-Block herstellen, der für Sprites wie eine Ranke funktioniert, für Mario aber nur Luft ist?
Du musst erstmal herausfinden, welche Palette dein Sprite überhaupt benutzt. Dazu kann man im CFG-Editor die CFG-Datei des Sprites öffnen, dort steht dann die Palette.
Dann öffnest du zweimal Lunar Magic, einmal mit deiner ROM und einmal mit einer anderen ROM oder einem Backup. Beim letzteren fügst du dann die mitgelieferte Palette ein und kopierst einfach die Farben der Palette (bzw. Palettenzeile), die dein Sprite benutzt, in die entsprechende Zeile deiner ROM.