Hello, Guest the thread was viewed13k times and contains 272 replies

last post from Nobato at the

Mega Karate - Wer macht mit ?

  • Mal ein bisschen aus dem Nähkästchen zur Programmierung. Vielleicht kann der eine oder andere etwas mitnehmen, oder sogar sagen was

    man noch besser machen kann. Bei letzterem immer her damit.


    RAM Aufteilung:

    ============

    Die Speicheraufteilung sieht derzeit folgendermaßen aus:

    Bank0: Das Basicprogramm / 8 Spriteblöcke und die 3 Farbpaletten für Bitmap und Sprites

    Bank1: Variablen zum Spiel

    Bank5: Hintergrundgrafik in 320x200 bei max. 256 Farben.

    Bank4: Derzeit ungenutzt. Versuche ich frei zu halten. Damit man später auf 640x200 oder 640x400 gehen kann um die Amigafraktion zu ärgern.:D

    ATTIC RAM: Hier befinden, sämtliche Sprites. Das sind derzeit 776 Blöcke (!) für die Animationen. Zum Vergleich: Die Bitmap hat 245 Blöcke.


    Die Sprites liegen im RAM bei $08000000 für den linken Spieler und bei $0801e000 für den rechten.

    Letzterer ist nur gespiegelt. Wenn man den in Echtzeit spiegeln würde, würde das zu viel Zeit kosten.


    Variablen:

    ========

    Für die Steuerung und Animation der Spieler benötige ich derzeit 3 Variablen:

    F1 (D1,B1,M1): Enthält die Speicheradresse der Animation die wieder gegeben werden soll.

    D1: Ist entweder 0 oder 1. Bei 0 ist der Spieler nach rechts gerichtet. Bei 1 ist er nach links gerichtet.

    B1: Ist der Zustand des Feuerknopfs. Wenn B1 0 ist, ist er nicht gedrückt bei B1 ist er es.

    M1: Enthält die Anzahl der Frames der Animation die wieder gegeben werden soll.

    Z.B. benötigt das laufen links/rechts 8 Frames (0-7)

    X1(D1,B1,M1): Ist die X-Koordinate. Enthält beispielsweise den Wert +1 wenn der Spieler nach rechts will und -1 wenn er nach links will.

    Y1(D1,B1,M1): Ist nur dann relevant, wenn er springt, oder sonst wie in die Höhe schießt.

    X2(D1,B1,M1): Siehe X1

    Y2(D1,B1,M1): Siehe Y2

    J1: Joystickport 2 für Spieler 1

    J2: Joystickport 1 für Spieler 2

    Die Ports habe ich so fest gelegt, weil man das aus C64 Zeiten gewohnt ist, das die meisten Spiele Port 2 wollen.


    Joysticksteuerung:

    ==============


    Wenn ich mal aus dem C64 Wiki zitiere, sieht eine Joysticksteuerung beim C64 so aus:

    Code
    1. 50 J=PEEK(56320)
    2. 51 IF J=126 THEN Y=Y-S
    3. 52 IF J=118 THEN X=X+S: Y=Y-S
    4. 53 IF J=119 THEN X=X+S
    5. 54 IF J=117 THEN X=X+S: Y=Y+S
    6. 55 IF J=125 THEN Y=Y+S
    7. 56 IF J=121 THEN X=X-S: Y=Y+S
    8. 57 IF J=123 THEN X=X-S
    9. 58 IF J=122 THEN X=X-S: Y=Y-S

    Das sind alleine 8 IF/THENś nur für die Richtungsabfrage. Eine neunte käme hinzu für den Feuerknopf.

    Meine Joystickabfrage, für beide Ports und 16 Richtungen inkl Feuerknopf sieht bei mir so aus:

    Code
    1. 1090 J1=JOY(2):J2=JOY(1):B1=INT(J1/128):B2=INT(J2/128):J1=J1ANDNOT128:J2=J2ANDNOT128

    Der erste Teil sollte klar sein mit JOY(x) frage ich die Ports ab. Nun stellt sich die Frage, ist der Feuerknopf gedrückt ?

    Wenn er das ist, wird zu dem Wert für die Richtung 128 addiert. Daher teile ich einfach durch 128 und runde auf.

    Ist er gedrückt, so erhalte ich den Wert 1 oder eben 0 wenn er es nicht ist. Damit ich kein ?BAD SUBSCRIPT ERROR erhalte

    muss die 128 aus der Variable J1 und J2 wieder raus. Das mache ich dadurch das ich sage J1=J1 ANDNOT 128.

    Ist die 128 in der Variable nicht enthalten, ändert sich entsprechend auch nichts. So ist nicht eine IF Abfrage notwendig.


    Jetzt habe ich alle Werte die ich brauche. X/Y für die neuen Koordinaten. F1 für die Animation die wiedergegeben werden soll.

    Ich brauche jetzt pro Spieler nur noch 2 IF/THENS für die Animation und dafür das man nicht aus dem Bild laufen kann.

    In dem Kurzvideo konnte man sehen wie schnell das ist. Die Kollisionsabfrage ist darin noch nicht enthalten, wird das ganze

    dann aber auf erträgliches Niveau bringen.


    Ende Teil 1

    ========

    Ich habe jetzt erst einmal alle Spritemoves integriert, die ich habe. Es fehlen da noch ein paar. Mr. Miyagi fehlt auch noch.

    Ich bin jetzt an der Kollisionsabfrage dran. Wenn die funktioniert, hätten wir schon mal einen funktionierenden 2 Spieler Modus.

  • Dann bau ich halt meinen ZX81 wieder auf, dem reichen 1 KB RAM aus!

    Der hat doch bestimmt ne RAM Erweiterung auf der Diskette.:D

    Oder läuft das Schach als Dia Show die ständig von Kassette nachlädt ?


    Wenn möglich, nur Variablenbezeichner mit einem Buchstaben verwenden. Die handhabt BASIC 65 als sog. "schnelle Variablen", die einen festen Platz im Speicher haben und somit tatsächlich auch spürbar schneller sind als Variablen mit zweistelligen Bezeichnernamen.

    Das wusste ich nicht. Das werde ich mal übernehmen.

    Ein BASIC-Spiel, für das die Hardware des Boards nicht ausreicht!

    Strike ! Das erste Spiel seiner Art.:thumbsup:

  • Diesen schöner Code kann ich sehr gut für mein J & R (Jumpman Klon) gut gebrauchen.

    Habe jetzt endlich wieder mehr Luft. Werde mich am Wochenende mich damit wieder beschäftigen.

    Werde wohl wieder einen halben Tag brauchen um mich da wieder zurecht zu finden.


    Für die neuen Hintergründe müssen wir noch eine weile Geduld aufbringen. Mein kontingent für diesen Monat wurde aufgebraucht bei Midjourney.

    Das ist mir bis jetzt noch nie passiert. ^^

  • Für die neuen Hintergründe müssen wir noch eine weile Geduld aufbringen. Mein kontingent für diesen Monat wurde aufgebraucht bei Midjourney.

    Das ist mir bis jetzt noch nie passiert.

    Das macht nix. Wir haben ja reichlich gute Bilder. Die sollen auch alle auf die Disk.

    Wenn du willst, kannst du gerne noch mehr machen. Dann wird es eine zweite Disk.

    Auf der ersten werden vermutlich nicht mehr als 5 oder 6 Bilder gehen.


    Diesen schöner Code kann ich sehr gut für mein J & R (Jumpman Klon) gut gebrauchen.

    Das ist doch gut wenn du das gebrauchen kannst.

    Eine Bitte nur. Wenn ihr Fragen habt wie das funktioniert, fragt nen anderen.

    Ich weiß doch selbst nicht wie das funktioniert.;(

    ich weiß nur das es funktioniert.8o

    Ne im ernst, Fragen, Anregungen, Kritik, Beleidungen, Morddrohungen usw. sind gerne gesehen.

    Dafür machen wir das doch hier.^^

  • Das sind alleine 8 IF/THENś nur für die Richtungsabfrage. Eine neunte käme hinzu für den Feuerknopf.

    Hi. Als Alternative würde ich folgendes vorschlagen:

    Die Portafrage mit J=JOY(1) gibt Werte von 1 bis 8 bzw. 128 für den Feuerknopf.

    D.h. ich hol mir die Werte exklusive dem Feuerknopf mit J AND 15 (dadurch fällt das 128 weg)

    Dann bereiten wir 2 Arrays vor, zum Beispiel

    DIM CX(8) mit den Werten 0,1,1,1,0,-1,-1,-1

    In der Loop wird dann der Index (J AND 15) aus dem Array gelesen.

    D.h. ist der Joystick rechts oben, rechts, rechts unten ergibt das mit Index 1,2 oder 3 ein Delta-X von Plus 1

    Ist der Joystick links unten, links, links oben ergibt das mit Index 5,6 oder 7 ein Delta-X von Minus 1

    In der Loop muss jetzt das DeltaX nur durch eine Arrayabfrage stattfinden:

    dx=CX(J AND 15)

    Das dx verändert dann in der Bewegungs-Loop die x-Koordinate der Spielerposition.

    Dadurch ersparst du dir alle IF-Abfragen und erhöhst die Geschwindigkeit auf ca. das 2,5-fache

  • Steh gerade etwas auf dem Schlauch.

    Das was du beschreibst, ist doch das was ich hier gemacht habe:

    Code
    1. 1090 J1=JOY(2):J2=JOY(1):B1=INT(J1/128):B2=INT(J2/128):J1=J1ANDNOT128:J2=J2ANDNOT128

    Das X/Y Array für die Sprite Koordinaten habe ich ja mit drin. Habe ich hier bloß nicht geposted.

    Die C64 IF Abfragen waren nur als Beispiel, wie man es besser nicht macht.

  • Mein kontingent für diesen Monat wurde aufgebraucht bei Midjourney.

    Wie, Midjourney? Ich dachte, du pixelst die Bilder alle von Hand? :whistling:

    Wenn ich ich soviele Bilder in so kurzer Zeit selbst gepixelt, dann wäre ich wohl ein Pixelmagier.

    Und so einen Hut siehe ich mir nicht auf.

    Mein Kunst lage diesmal bei die Worten, aller Zauberzunge aus meinen Lieblingsbuch Tintenherz. :rolleyes: