Posts by WebFritzi

    Wäre schon ganz gut, wenn da im Hint sowas stehen würde wie "Toggle to set True Drive Emulation On". Und wenn es an ist, dann eben "... Off". Dann weiß man, woran man ist.

    Ich überlege aber trotzdem, das Symbol durch etwas anderes zu ersetzen. Eine Diskette mit einem optionalen + oder so was.

    Ich denke ehrlich gesagt nicht, dass das eindeutiger wäre. Ich finde das Symbol eigentlich ganz gut. Nur die Abrundung hinten, finde ich, könnte man weg lassen.

    Hoogo Vielen herzlichen Dank für deinen ausführlichen Post. Ich werde es ausprobieren.


    LogicDeLuxe Danke. Das ist ne Menge Holz. Ich werde es daher erstmal mit Hoogos Anleitung probieren. Der Bereich B wird vier Zeilen betragen. Damit sollten mir auch Badlines nicht mehr in die Suppe spucken.


    TMA Da kommt meine Frage ursprünglich her. Aber ich bin so blöd, dass ich selbst das Video nicht verstanden hatte. ;-)

    Ok, ich glaube, ich habe verstanden.


    Bereich 0: Setze das Sprite ganz normal

    Bereich 1(A): Mach nix

    Bereich 2(B): Setze Pointer auf CB und setze $d001 auf Bereich 3.

    Bereich 3(C): CB wird gemalt. Passt erstmal. Setze Pointer auf CD und ändere $d001 nicht.

    Bereich 4(D): CD wird gemalt. Passt. Setze Pointer auf ED und setze $d001 auf Bereich 5.

    Bereich 5(E): ED wird gemalt. Passt. Setze Pointer auf EF und ändere $d001 nicht.

    Bereich 6(F): EF wird gemalt. Passt. Verlasse IRQ.


    Kannst du das so bestätigen, Hoogo?

    Das war mir schon klar. Ich vermutete ja schon, dass AAA ein halbes Sprite darstellen soll. Die Frage war, warum du den Bereich 0 leer gelassen hast? Jetzt habe ich verstanden, dass du damit den ganzen Bildschirm meinst und dass 0 schwarz darstellt (bzw. nix).


    Das mit CB verstehe ich immer noch nicht. Warum nicht als zweites BC, als drittes CD, als viertes DE und dann EF?

    Und warum brauche ich [CB], wenn doch B vor C erscheinen soll? Bin etwas verwirrt.

    0: Irgendwo bis zur 99 solltest Du das Sprite ganz normal eingerichtet haben, dass es [AB] anzeigt.

    1: Ganz normales anzeigen wie immer. Multiplexen könntest Du hier machen.

    2: Das Sprite [AB] kommt langsam an sein Ende, Rasterzeile 120 ist die letzte. ...B] ist dann vorbei, [C... soll ab 121 kommen.

    Soweit so klar.

    Quote

    3: Da Sprite fängt wieder mit dem gerade aktiven Spriteblock an.

    An welcher Stelle? Wir sind jetzt ja schon im kritischen Bereich (eigentlich schon dahinter). Wir sollten vorher schon $d001 neu gesetzt haben, oder?

    Quote

    [CB] kommt da enorm gelegen:

    Auf den Block konntest du im vorigen Bereich 2 schmerzlos einschalten, dort passt ..B] auf jeden Fall, egal, ab [AB] oder [CB]

    Und jetzt in Bereich 3 brauchst Du [C.., ob CB oder CD ist im ersten Moment auch egal.

    Gute Gelegenheit, auf [CD] umzuschalten.

    Leider verstehe ich hier gar nichts. Wieso kommt CB in Bereich 2 gelegen? Sagen wir, er ist gerade dabei B zu zeichnen. Wenn ich jetzt auf CB umschalte, übermalt er doch das B mit C... Ich hätte jetzt gedacht, dass ich irgendwo im Bereich 2 auf BC umschalte...


    EDIT: Dabei fällt mir auf, dass "umschalten" missverständlich ist. Ich denke jetzt mal, dass "umschalten" bedeutet in Bereich x den Block für Bereich x+1 vorzubereiten. Dann bedeutet "in Bereich 2 umschalten auf CB", dass in Bereich 3 wie gewollt das C erscheint. Aber wozu wieder das B? Der Sinn will mir nicht in den Kopf. Besser wäre doch CD, oder nicht? Dann müsste ich in Bereich 3 nicht umschalten.

    Hoogo Vielen Dank für deine Antwort mal wieder. ;-) Leider verstehe ich kaum etwas von dem, was du schreibst. :-( Sowas wie AAA steht für ein halbes Sprite, nehme ich an. Warum lässt du die 0-te Zeile frei? Hat das einen Sinn? Und warum brauche ich [CB], wenn doch B vor C erscheinen soll? Bin etwas verwirrt.

    Tatsächlich? D.h. wenn ich ansage, dass ein Sprite bei (x,y) gezeichnet werden soll, dann werden in jedem Fall die gesamten 21 Zeilen gezeichnet (es sei denn das Sprite überzeichnet sich selbst)? Hmm, dann könnte ich auch ohne Überlappung folgendes machen:


    1. Fange Zeile 118 ab

    2. Sage, dass $d001 = 120 sein soll

    3. Fange Zeile 130 ab

    4. Sprite-Pointer setzen und sagen, dass $d001 = 141 sein soll.

    Ich möchte gerne zwei Sprites vertikal aneinander hängen um so eine Höhe von mehr als 21 zu erlangen (z.B. 30). Um Sprites zu sparen (vielleicht brauche ich im Spielbetrieb noch einige mehr) will ich nur ein Sprite verwenden. Deshalb brauche ich einen Raster-Interrupt. Soweit so gut. Wenn es keine Badlines gäbe, könnte ich ja folgendes machen (Sprite-Zeilen sollen z.B. 120 und 141 sein):


    1. Fange Rasterzeile 120 ab (vielleicht zur Sicherheit auch 119 und dann auf 120 warten)

    2. Sage, dass $d001 = 120 sein soll (das heißt in der nächsten Rasterzeile (121) beginnen soll)

    3. Fange Rasterzeile 141 ab (vielleicht zur Sicherheit auch 140 und dann auf 141 warten)

    4. Sprite-Pointer wechseln und sagen, dass $d001 = 140 sein soll (das heißt in der nächsten Rasterzeile (141) beginnen soll).


    Das klappt soweit auch ganz gut bei mir. Nun gibt es aber diese verdammten Badlines (die ich immer noch nicht so richtig verstanden habe), die mir da in die Suppe spucken. So kommen dann die Ansagen 2 oder 4 zu spät und das Sprite wird gar nicht erst gezeichnet, so dass ich nur ein halbes Männchen habe. Wieviele Takte klaut mir eigentlich so ne blöde Badline?


    Nun gibt es wohl einen Trick mit sich überlappenden Sprites. Nur verstehe ich ihn nicht. Ich sehe schon irgendwie, dass die Überlappung dazu führen soll, dass die überlappenden Zeilen auf jeden Fall gezeichnet werden, egal, ob ich oben oder unten bin. Aber irgendwie raffe ich noch nicht, wie ich vorgehen soll. Sagen wir, die Sprites haben eine Zeile Überlappung. Welche Zeile muss ich nun beim Übergang abfangen und was muss ich dann machen, damit es klappt? Über Antworten würde ich mich sehr, sehr freuen.

    Sorry dafür, dass ich diesen alten Thread nochmal hervor hole, aber es passt hierher. Es soll ja um technische Details von MM gehen. Also, mir ist noch aufgefallen, dass die Verben in MM im unteren Teil des Bilschirms nicht in einer normalen C64-Zeile liegen, sondern um 2 Pixel nach unten versetzt sind.


    1. Wie ist das möglich? Vertikales Scrolling nach Raster-Interrupt?

    2. Wozu haben die das gemacht?


    Die oberste Zeile hingegen ist direkt auf Höhe mit der ersten "Normal-Zeile". Der Spiel-Bereich hingegen fängt ein Pixel weiter unten als die zweite "Normal-Zeile" an.


    Der Zeichensatz ist übrigens nicht exakt der aus dem ROM. Der Punkt ist anders. ;)

    Hier hatten wir die Technik mal ausgiebig analysiert: Maniac Mansion - technische Details?

    Wie fancy ist das denn bitte? Sehr interessant! Vielen Dank für den Link. Das werde ich auch mal versuchen. Ist ne nette Herausforderung. Mit den Überlappungen sollte das auch eigentlich relativ timing-sicher sein.


    Mir wird immer klarer, wie verdammt komplex Maniac Mansion ist. Und das Ganze auf 2 Disketten. Unfassbar. Darauf kann Ron Gilbert unheimlich stolz sein. Ist er auch, glaub ich. ;)

    Was üblicherweise gemacht wird, du schaltest bei der Statusanzeige auch den Bildschirm um, d.h. du hast dann eigene 8 Sprite-Pointer. Die setzt du auf ein leeres Sprite.

    Alles klar, hab's jetzt kapiert. Auch das funktioniert ganz hervorragend. Ich hatte eh für die Statuszeile einen anderen Bildschirmspeicher gewählt. Passt also ganz gut. Das sind bei mir 80 Bytes (also 2 Zeilen). Danach kommen meine Sprite-Definitionen.


    Auch dir vielen Dank! Habe mal das Ergebnis angehängt.


    (Schade, dass ich mit 135 Beiträgen meine Posts nicht uneingeschränkt editieren kann. So muss ich immer einen neuen Beitrag schreiben, wenn zu viel Zeit vergangen ist.)

    Files

    • myprogram.d64

      (174.85 kB, downloaded 10 times, last: )

    X-Position hinter den Rahmen setzen, ist wohl die einfachste Methode, ein Sprite teilweise unsichtbar zu machen, denn die kann man in jeder Rasterzeile ändern.

    Geil! Das klappt echt gut. Cooler Hack!

    Sprite in Hintergrundfarbe und hinter dem Zeichensatz wäre auch noch eine Möglichkeit.

    Daran hatte ich auch schon gedacht, aber mein Sprite ist Multicolor. Also geht nicht.

    Maniac Mansion zeichnet Spritesäulen, was schon sehr speziell ist. Ich wüßte so nichtmal ein Nicht-SCUMM-Titel, was diese Technik verwendet.

    Was sind denn Spritesäulen?

    Was üblicherweise gemacht wird, du schaltest bei der Statusanzeige auch den Bildschirm um, d.h. du hast dann eigene 8 Sprite-Pointer. Die setzt du auf ein leeres Sprite.

    Verstehe ich nicht ganz. Was meinst du mit "Bildschirm umschalten"? Die VIC-Bank oder den Bildschirmspeicher? Tatsächlich ist meine Statuszeile im Bitmap-Mode, weil ich 80 Zeichen in einer Zeile haben wollte. Da passt dann mehr rein.

    Hallo,


    mein Bildschirm ist in drei Teile aufgeteilt (Statusline oben, Game Area und dann Action Area ganz unten). Das Geschehen spielt sich in der Game Area ab. Dort habe ich einen Sprite, den ich bewegen kann. Wenn ich ihn hochbewege, ist es nicht so toll, wenn der Sprite in die Statusline hineinragt, d.h., ich würde ihn dort gerne abschneiden. Da ich drei Raster-Interrupts für die Bereiche habe, dachte ich: ey, kein Problem. Einfach in der Statusline Sprites ausschalten und dann in der Game Area Sprites an. Pustekuchen! Der zeichnet dann den gesamten Sprite nicht. Dazu habe ich gerade auf einer Seite zu Sprite Multiplexing gelesen: "The Y-coordinate for a sprite must have been set before the raster line reaches that Y-position, or the re-used sprite won't display at all!" Heißt wohl so viel wie: Geht nicht! Dann frage ich mich aber doch, wie z.B. bei Maniac Mansion der Sprite unter der Statusline abgeschnitten wird, wenn er z.B. die Treppe hinauf steigt.

    Ich habe noch eine Frage: Wie speichere ich ein ASM-Projekt auf Diskette ab? Bisher habe ich es so gemacht, dass ich mir immer eine Möglichkeit gelassen habe, ins BASIC zurück zu gelangen. Dort habe ich dann einfach SAVE"NAME",8 geschrieben. Nun habe ich aber ein etwas komplexeres Programm und die Dinge werden nicht mehr so dargestellt wie wenn ich es vom C64Studio aus starte. Zum Beispiel habe ich Daten ab $8000, die teilweise überschrieben zu sein scheinen.


    EDIT: Gut wäre eine Option in den Einstellungen für VICE, die das RUN unterdrückt, so dass man gleich nach dem Laden auf einem anderen Disk-Image speichern kann.

    Hallöle,


    ich habe hier ein Sprite, das ich bewegen möchte. Ich klicke irgendwo hin (hab einen Pfeil als Cursor) und da soll dann das Sprite mit konstanter Geschwindigkeit hinbewegt werden. Also von A nach B. Mit "konstant" meine ich unabhängig von der Richtung. D.h., ob schräg oder gerade - die Geschwindigkeit sollte annähernd die gleiche sein.


    Mein erster Gedanke war, das mit einfacher 2D-Vektoranalysis zu lösen. Aber dafür brauche ich Quadrat und Wurzel um den Abstand von A nach B zu messen. Die Formel wäre dann

    Code
    1. A(n) = A + n * v * (B-A)/|B-A|,

    wobei |B-A| der Abstand ist. Nun kann ich in Assembler aber weder auf das Quadrat noch auf die Wurzel zurückgreifen.


    Nun ist die obige Methode ja sehr genau. Gibt es vielleicht Methoden, die weniger genau aber dafür einfacher sind, so dass ich auf Quadrat und Wurzel verzichten kann? Hat jemand von euch Erfahrung mit sowas?