Neue WIP-Version!
Und das in der LS-Edition. LS: Läuft Super.
You are about to leave Forum64 to get redirected to the following address:
Please note, that the target website is not operated by us. We are not responsible for it's content nor does our privacy policy apply there.
Neue WIP-Version!
Und das in der LS-Edition. LS: Läuft Super.
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.
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:
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:
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.
ATTIC RAM: Hier befinden, sämtliche Sprites.
Das Nexys-Board hat kein Attic-RAM!
Ein BASIC-Spiel, für das die Hardware des Boards nicht ausreicht!
Dann bau ich halt meinen ZX81 wieder auf, dem reichen 1 KB RAM aus!
(Quelle)
Variablen:
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.
Dann bau ich halt meinen ZX81 wieder auf, dem reichen 1 KB RAM aus!
Der hat doch bestimmt ne RAM Erweiterung auf der Diskette.
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.
Display MoreMeine Joystickabfrage, für beide Ports und 16 Richtungen inkl Feuerknopf sieht bei mir so aus:
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.
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.
Ne im ernst, Fragen, Anregungen, Kritik, Beleidungen, Morddrohungen usw. sind gerne gesehen.
Dafür machen wir das doch hier.
Mein kontingent für diesen Monat wurde aufgebraucht bei Midjourney.
Wie, Midjourney? Ich dachte, du pixelst die Bilder alle von Hand?
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:
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.
Die C64 IF Abfragen waren nur als Beispiel, wie man es besser nicht macht.
Ok, das hab ich echt falsch verstanden ...
Mein kontingent für diesen Monat wurde aufgebraucht bei Midjourney.
Wie, Midjourney? Ich dachte, du pixelst die Bilder alle von Hand?
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.
Ok, das hab ich echt falsch verstanden ...
Halb so wild. Ich hab das den vollständigen Teil nicht geposted, weil ich daran gerade herumdokter.
Dann wäre es offensichtlicher gewesen.
Wie, Midjourney? Ich dachte, du pixelst die Bilder alle von Hand?
Hat er ja. Ich habe ihn gezwungen die Bilder auszudrucken und Pixel für Pixel neu zu malen.
Soll ja alles von Hand geklöppelt sein.
Mal zum Vergleich, so sieht "The Way of the Exploding Fist" auf dem Spectrum Next aus:
https://wearespectrumprogrammers.com/product/wotef/
Mal zum Vergleich, so sieht "The Way of the Exploding Fist" auf dem Spectrum Next aus:
https://wearespectrumprogrammers.com/product/wotef/
Bei der Schrift hätten se sich aber ein wenig mehr anstrengen können. Ich kann's nicht lesen
Display MoreMal zum Vergleich, so sieht "The Way of the Exploding Fist" auf dem Spectrum Next aus:
https://wearespectrumprogrammers.com/product/wotef/
Bei der Schrift hätten se sich aber ein wenig mehr anstrengen können. Ich kann's nicht lesen
Sieht echt Klasse aus. Aber was ist ein Spectrum Next?
Sieht echt Klasse aus. Aber was ist ein Spectrum Next?
Das ist quasi das für den Sinclair Spectrum, was der MEGA65 für den C64 ist: Ein "Nachfolger" mit vielen neuen Möglichkeiten.
Sieht echt Klasse aus. Aber was ist ein Spectrum Next?
Das ist quasi das für den Sinclair Spectrum, was der MEGA65 für den C64 ist: Ein "Nachfolger" mit vielen neuen Möglichkeiten.
Danke für die schnelle Antwort 👍👍😃😃