...
Wie kann man Beträge löschen, wenn sie kompellt falsch waren ?
There are 413 replies in this Thread which has previously been viewed 79,596 times. The latest Post (
...
Wie kann man Beträge löschen, wenn sie kompellt falsch waren ?
Display MoreWie sage TheRealWanderer, wir brauchen nachher alles an Optimierung was geht.
Eine große Bremse beim Erzeugen der Level ist das Auswerten, welche Farbe bei Zeichen X benötigt wird. Leider sind solche IF THEN Geschichten von ein gewissen D. immer Gift für Basic, da diese viel zu viel Zeit kosten. Das Berechnen der Pseudo-Werte kostet ebenfalls sehr viel Zeit, weil hier jeder Überlauf nachgebildet werden muss.
Und wieder ist hier IF THEN der Übeltäter, der das ganze deutlich ausbremst. Dabei wäre gar kein IF THEN nötig, wenn man den Variablentyp Byte verwenden könnte, da dieser beim Überlauf kein ?ILLEGAL QUANTITY ERROR erzeugt. Leider gibt es keine Möglichkeit so einen Überlauf abzufragen und damit bleibt nur der Umweg.
Aber ein IF THEN kann man ersetzen, und zwar durch FOR A%=0 TO 799 : NEXT, das ist auch merklich schneller. Als letztes bleiben die hohen Zeilennummern, die bremsen ebenfalls etwas. Dann habe ich noch das Binäre schieben gefunden, leider ist das kaum schneller als IF THEN, weil man mit A&=A&<<7 verschieben muss.
Ein rollen von A&=A&>>2 wäre bestimmt schneller gewesen, das wird aber nicht angeboten.
Für den Schleim (Glibber) aus Boulder Dash II, wird ebenfalls die Pseudo-Routine benötigt. Deshalb habe ich auch im Programm Leveldaten die Routine angepasst, da der Schleim mit den zuletzt erzeugten Werten weiter rechnet. Ich verwende immer noch Integer und Byte, da der Typ Real zur Zeit mit vielen Konstanten der Haupt-Routine belegt ist.
Das Programm vom C64 läuft jetzt auf dem Mega65, dafür musste ich nur die Adresse vom Bildschirmspeicher auf 2048 setzen. Zusätzlich habe ich die schöne Kino-Grafik (online Textkorrektur) von Drachen geklaut, teilweise aber mit andere Farben für die Zeichen versehen.
Genug der Worte, es ist etwas schneller aber nicht viel hust hust.
Werde ich dann in zu unseren Programm BD I - Klon assimilieren. ![]()
Helfen vielleicht die neuen ROM Befehle den Bildschirminhalt an bestimmten Stellen abzufragen?Please login to see this attachment.
Oh das müsste man mal Testen.
Ein echt klasser Befehl. Spart ein haufen Peeks und Pokes. ![]()
Display MoreWie sage TheRealWanderer, wir brauchen nachher alles an Optimierung was geht.
Eine große Bremse beim Erzeugen der Level ist das Auswerten, welche Farbe bei Zeichen X benötigt wird. Leider sind solche IF THEN Geschichten von ein gewissen D. immer Gift für Basic, da diese viel zu viel Zeit kosten. Das Berechnen der Pseudo-Werte kostet ebenfalls sehr viel Zeit, weil hier jeder Überlauf nachgebildet werden muss.
Und wieder ist hier IF THEN der Übeltäter, der das ganze deutlich ausbremst. Dabei wäre gar kein IF THEN nötig, wenn man den Variablentyp Byte verwenden könnte, da dieser beim Überlauf kein ?ILLEGAL QUANTITY ERROR erzeugt. Leider gibt es keine Möglichkeit so einen Überlauf abzufragen und damit bleibt nur der Umweg.
Aber ein IF THEN kann man ersetzen, und zwar durch FOR A%=0 TO 799 : NEXT, das ist auch merklich schneller. Als letztes bleiben die hohen Zeilennummern, die bremsen ebenfalls etwas. Dann habe ich noch das Binäre schieben gefunden, leider ist das kaum schneller als IF THEN, weil man mit A&=A&<<7 verschieben muss.
Ein rollen von A&=A&>>2 wäre bestimmt schneller gewesen, das wird aber nicht angeboten.
Für den Schleim (Glibber) aus Boulder Dash II, wird ebenfalls die Pseudo-Routine benötigt. Deshalb habe ich auch im Programm Leveldaten die Routine angepasst, da der Schleim mit den zuletzt erzeugten Werten weiter rechnet. Ich verwende immer noch Integer und Byte, da der Typ Real zur Zeit mit vielen Konstanten der Haupt-Routine belegt ist.
Das Programm vom C64 läuft jetzt auf dem Mega65, dafür musste ich nur die Adresse vom Bildschirmspeicher auf 2048 setzen. Zusätzlich habe ich die schöne Kino-Grafik (online Textkorrektur) von Drachen geklaut, teilweise aber mit andere Farben für die Zeichen versehen.
Genug der Worte, es ist etwas schneller aber nicht viel hust hust.
Hi Acron
wollte gerade dein Programm untersuchen und testen. Beim übertragen in das C64Studio werden die Zeilennummer nicht richtig geschrieben siehe Bild
Please login to see this attachment.
Könntest du das nocheinmal als BAS Datei speichern für das C64Studio ?
Oh das ist schon richtig so, das Programm wurde mit Exobasic erstellt. Hier das richtige Programm zum Arbeiten.
Oh das ist schon richtig so, das Programm wurde mit Exobasic erstellt. Hier das richtige Programm zum Arbeiten.
Wow, das ist aber ein schneller Bildschirmaufbau.
Da werde ich wohl diese neue Routine in unser Programm einpflegen.
Muss nur auf die Variabel aufpassen.
Als letztes bleiben die hohen Zeilennummern, die bremsen ebenfalls etwas.
Die Zeilennummeren werde ganz am Schluß änderen. Jetzt möchte ich sie nur großräumig auslegen damit ich zwischendrinen was einpflanzen kann wenn es nötig ist. ![]()
Die neue Levelaufbauroutine ist eine sehr gute Leistung von dir.
Jetzt über das lange Wochenend habe ich Zeit haben um das in unser Programm einpflegen.
Acron warum benutzt du nicht Restor mit Zeilennummer.
Das setzt den interen Zeiger von Read Data direkt auf auf diese Datazeilen. Dann könnte die Zeile 240 eventuell so ausehen
Ja ich weis, später brauchen wir auch die ersten Datazeilen. ![]()
Was ich mir auch überlegt habe, das komplette Programm mit eine neuen Variabelsystem zu versehen. Es ähnelt dem Hex-System z.B von A-O. Bei O angekommen geht es dann mit AA, BA, CA usw. Aber bei so einen System muss man sich dann alles auf einen Zellet notieren, damit man weis welche Variabel schon belegt sind.
Was meint ihr Acron und TheRalWanderer sollen wir es so machen. Wenn ja nehme ich mir die Zeit und ändere das dann ab.
Ich bin ein Freund davon, wichtige Variablen so zu benennen, dass ihr Inhalt zumindest halbwegs ableitbar ist, wenn man im Code gedanklich drin ist.
Daher hatte ich sowas wie PD oder PS (Position Diamanten, Steine) usw.
Ich bin ein Freund davon, wichtige Variablen so zu benennen, dass ihr Inhalt zumindest halbwegs ableitbar ist, wenn man im Code gedanklich drin ist.
Daher hatte ich sowas wie PD oder PS (Position Diamanten, Steine) usw.
Ja da bin ich deiner Meinung. Nur wird es immer schwriger immer einen passen Variabelnamen zu finden der gerade passt. ![]()
Es wäre schön, wenn das so wie beim Assembler funktionieren würde , da werden die Labelnamen beim compilieren in Adressen umgewandelt.
Und somit brauche ich nichtdarauf zu achten wie lange der Labelmane ist.
OK dann belasse ich das so wie es ist und pflege nur die neue Aufbauroutine ein. ![]()
Die Zeilennummeren werde ganz am Schluß änderen. Jetzt möchte ich sie nur großräumig auslegen damit ich zwischendrinen was einpflanzen kann wenn es nötig ist.
Warum benutzt du den Label Mode nicht, da hat man das Problem erst gar nicht.
Acron warum benutz du nicht Restor mit Zeilennummer. Das setzt den interen Zeiger von Read Data direkt auf auf diese Datazeilen. Dann könnte die Zeile 240 eventuell so ausehen
Bei den Leveldaten war das nicht nötig, da alle Level einfach nur angezeigt werden. Im fertigen Spiel wird das Restore Zeilennummer sogar gebraucht, sobald der Spieler das Level wiederholen muss.
Was ich mir auch überlegt habe, das komplette Programm mit eine neuen Variabelsystem zu versehen
Mit den Namen der Variablen kämpfe ich auch und das Find/Replace arbeitet leider nicht zuverlässig. Blöderweise gibt es im Basic-Editor des C64Studio keine Deklarierung von Variablen-Namen / Labels usw., dann hätten wir das Problem erst gar nicht.
Ach wäre sowas schön und übersichtlich, ein Traum so in Basic zu programmieren.
!DEFVAR SPACE=L
!DEFVAR STEIN=S
!DEFVAR DIAMANT=D
!DEFKON UNTEN=40
!DEFKON LINKS=-1
!DEFLAB STEIN_LIEGT
!DEFLAB DIAMANT_LIEGT
HAUPT_SCHLEIFE
ON GOTO STEIN_LIEGT,DIAMANT_LIEGT
STEIN_LIEGT
IF PEEK(SCREEN+POS+UNTEN) = SPACE THEN POKE SCREEN+POS+UNTEN,STEIN : POKE SCREEN+POS,SPACE : GOTO HAUPT_SCHLEIFE
Display MoreMit den Namen der Variablen kämpfe ich auch und das Find/Replace arbeitet leider nicht zuverlässig. Blöderweise gibt es im Basic-Editor des C64Studio keine Deklarierung von Variablen-Namen / Labels usw., dann hätten wir das Problem erst gar nicht.
Ach wäre sowas schön und übersichtlich, ein Traum so in Basic zu programmieren.
!DEFVAR SPACE=L
!DEFVAR STEIN=S
!DEFVAR DIAMANT=D
!DEFKON UNTEN=40
!DEFKON LINKS=-1
!DEFLAB STEIN_LIEGT
!DEFLAB DIAMANT_LIEGT
HAUPT_SCHLEIFE
ON GOTO STEIN_LIEGT,DIAMANT_LIEGT
STEIN_LIEGT
IF PEEK(SCREEN+POS+UNTEN) = SPACE THEN POKE SCREEN+POS+UNTEN,STEIN : POKE SCREEN+POS,SPACE : GOTO HAUPT_SCHLEIFE
Das sollte man mal den Mega65 vorschlagen, vielleicht bauen die sowas ein. (Ach träumen kann so schön sein
)
Oder wir können Endurion fragen ob er sowas in seinen C64Studion einbauen kann.
Ach wäre sowas schön und übersichtlich, ein Traum so in Basic zu programmieren.
TSB macht das so. Das hier ist das Hauptprogramm meiner WiC64-Uhr "TickTack":
110 init
120 colour,f3%: div: zifferblatt: x$=""
130 repeat: stellen: get x$: digital: settime: adjust: credits
140 until x$="x"
150 finish
190 end
Arndt
Lange Variablennamen erkennen und automatisch durch kürzere ersetzen, und dabei auch noch eventuelle Duplikate vermeiden, interessante Idee ![]()
GoDot: Bei dem Snippet musst du mir aber erklären, was da was macht. Das ist mir auf den ersten und zweiten Blick nicht ersichtlich. Gefühlt sehe ich da auch nur x$ als Variable, das andere sind doch Funktions-Aufrufe, oder?
Lange Variablennamen erkennen und automatisch durch kürzere ersetzen, und dabei auch noch eventuelle Duplikate vermeiden, interessante Idee
Wenn das gehen würde, wäre das echt klasse.
Bei dem Snippet musst du mir aber erklären, was da was macht. Das ist mir auf den ersten und zweiten Blick nicht ersichtlich.
Das ist die QLock-Uhr mit dem Zeichensatz von Retrofan (die Tick-Tack-Uhr, von der ich gesprochen hatte, fängt aber so ähnlich an). Hier zur Veranschaulichung ein Screenshot:
Please login to see this attachment.
"Zifferblatt" malt dieses Zifferblatt. Danach folgt ein Repeat-Until-Loop, der auf Tastendruck (auf x$) jedes Mal Zwischenhalt macht bei: "Stellen" aktualisiert (ohne besonderen Tastendruck) einfach die Zeitanzeige laut TI$ in dem Format, das du hier siehst. "Digital" zeigt nach Taste "h" (für "Help") die Zeit unten links in der Ecke in Ziffern an (hier: "9:52") und blendet sie nach nochmal Drücken wieder aus. "Settime" schaut nach, ob du "s" gedrückt hast und wenn ja, holt QLock sich die Uhrzeit erneut vom WiC64 ab. Mit "a" für "Adjust" stellst du die Uhr von Hand (TI$-Format). "Credits" erhältst du mit der Taste "c" (da stehen dann die Namen der Urheber an der Stelle, wo jetzt die Minutenkugeln zu sehen sind). Und schließlich (nach Taste "x") gibt's ein "Finish", wo der Screen ein bisschen blinkt und sowas. ![]()
Gefühlt sehe ich da auch nur x$ als Variable, das andere sind doch Funktions-Aufrufe, oder?
Ja, wobei TSB (in Simons'-Basic-Tradition) keine echten (geschlossenen) Funktionsprozeduren und auch keine echte Werteübergabe über Klammern wie Pascal kennt. Variablen gelten nach wie vor überall. Hier der Anfang der Variablenliste zur Illustration (mit dem Retrofan -Zeichensatz):
Please login to see this attachment.
Arndt ![]()
Hallo Leute
hier mal wieder ein kleines Update unser BD-Klon in Basic.
Jetzt kann man Level 1 bis Level 5 durchspielen.
Ich habe auch Acron seine neue Levelaufbauroutine mit eingepflegt. Jetzt werden die Level in ca. 3 Sekunden aufgebaut statt in 5 Sekunden. ![]()
Also man gut mit spielen, den einzigen Wermutstropfen den ich endecken konnte , ist die Geschwindigkeit der Butterflys. Sind nur wenige vorhanden rasen sie dahin.
da bräuchte man eine dynamische Bremse. Und man erwischt sie dann kaum. Im Level 4 bleiben sie in ihre Kreisbewegung hängen. Warum weis ich nicht. ![]()
Sobald ich ein Stein hineinwerfe und er wird nicht getroffen, fängt er an richtig zu laufen.
Aber teste es mal.
Und wie immer, wenn euch was einfällt was man verbesseren kann, immer hier im Forum schreiben ![]()
Please login to see this attachment.
Please login to see this attachment.
Helfen vielleicht die neuen ROM Befehle den Bildschirminhalt an bestimmten Stellen abzufragen?
Vielleicht mag ja jemand sowas wie DRAWARRAYTOSCREEN(ARRAY2D,CHARMAPARRAY,XPOS,YPOS) implementieren:
POKEt den Inhalt von ARRAY2D - also typischerweise einer Karte - ab XPOS/YPOS auf den Bildschirm und nutzt dabei CHARMAPARRAY als Mapping (von "Zahl in ARRAY2D" zu Screencode und Farbe; 0 zum Übergehen der Position).
Das sollte in ASM recht einfach zu implementieren sein und ist flexibel (man kann damit sogar recht fixe Zeichen-"Sprites" implementieren).
TC& haut mich nicht vom Hocker: Da fängt man sich mittendrin in der Implementierung eine böse Multiplikation ein UND da der Befehl zum Zeichnen hundertfach aufgerufen werden muss, kann das gar nicht schnell sein/werden.
Helfen vielleicht die neuen ROM Befehle den Bildschirminhalt an bestimmten Stellen abzufragen?
Vielleicht mag ja jemand sowas wie DRAWARRAYTOSCREEN(ARRAY2D,CHARMAPARRAY,XPOS,YPOS) implementieren:
POKEt den Inhalt von ARRAY2D - also typischerweise einer Karte - ab XPOS/YPOS auf den Bildschirm und nutzt dabei CHARMAPARRAY als Mapping (von "Zahl in ARRAY2D" zu Screencode und Farbe; 0 zum Übergehen der Position).
Das sollte in ASM recht einfach zu implementieren sein und ist flexibel (man kann damit sogar recht fixe Zeichen-"Sprites" implementieren).
TC& haut mich nicht vom Hocker: Da fängt man sich mittendrin in der Implementierung eine böse Multiplikation ein UND da der Befehl zum Zeichnen hundertfach aufgerufen werden muss, kann das gar nicht schnell sein/werden.
Kann sein, dass ich dich hier jetzt nicht korrekt verstanden habe, aber ich denke, Please login to see this link. mit BASIC 65 geht zumindest in diese Richtung.
Habe Level 4 mit dem Schmetterling etwas durchgetestet. Damit ist mir Folgendes aufgefallen oder passiert. Beim ersten Start des Levels drehen die Schmetterlinge falsch herum. Nachdem man ein Leben verloren hat, variiert die Drehrichtung, mal drehen alle richtig, mal nur einige. Das Erschlagen eines Schmetterlings mit einem Stein ist sehr ungenau, obwohl der Stein am Fallen ist, dreht der Schmetterling einfach um. Wenn das Erschlagen gelingen, kann man die Diamanten nur von oben an sicher einsammeln, ansonsten kann es passieren das man dabei erschlagen wird. Ab und zu passiert sogar etwas ganz komisches, nachdem erschlagen eines Schmetterlings sind in der letzten Box ganz rechts plötzlich zwei Schmetterlinge vorhanden. Die Kollision durch die Schmetterlinge ist praktisch nicht vorhanden, solange der Spieler nicht im Weg steht. Damit die Kollision besser funktioniert, musst du vorher alle vier Richtungen überprüfen, ob sich dort der Spieler oder die Amöbe befindet.
Ab und zu passiert sogar etwas ganz komisches, nachdem erschlagen eines Schmetterlings sind in der letzten Box ganz rechts plötzlich zwei Schmetterlinge vorhanden.
Ja sowas hat mir TheRealWanderer auch geraten, wenn man Gegenstände zerstört, sie aus den Array zu löschen. Tja ich wusste nicht wie. Da ich nicht genau weis welche Array es genau trift.
Ich bekomme zwar die Bildschirmadresse herraus, aber nicht um welchen Array es sich handelt.
Ich habe da echt lange gerätselt. Ich bin dazu dann über gegangen nach einer Explosion einfach das Spielfeld nochmal abzuscannen. Ist aber ja nur eine Notlösung, da ja das Array ja dann immer noch vorhanden ist.
Oder gibt es einen Basic 65 Befehl den ich überlesen habe, der einen Array komplett leer, das wäre sehr hilfreich.
Klar könnte ich auch im Code mit einer For - Next schleife löse, aber das würde den Spielfluß nur stören. Gut das mag jetzt bei einer Explosion nicht ins Gewicht fallen, aber lasse es mal viele sein.
Aber dafür wird es sicherlich auch eine Lösung geben. ![]()
Jetzt bin ich gerade dabei, eine konstande Zeit anzeige zu machen.
Gibt es einen Basic-Befehl was ich den Rasterstrahl abfragen kann. Dann kann ich den als Taktgeber verwenden.
Ansonsten nehme ich eine Variabel, die ich innerhalb des Main-Loops hochzähle lasse. Und ab eine bestimmten Ergenins, dann die Cave-Time um eins vermindern.
Hat aber der Nachteil, das das niemals konstant ist. Denn jenachdem was im Spielfeld los ist, ist der Main-Loop schneller oder langsamer. (Aber gerechter zum Spieler
)
Ahhh ich weiß was du meinst und das ist ein echtes Problem. Ein Gegner wird von einem Stein erschlagen, im Bildschirmspeicher ist das Position X vom Stein und X+40 für den Gegner. Die Position vom Stein im Array ist bekannt, da dieser die Explosion ausgelöst hat, da könnte man einfach eine Position wählen, die außerhalb des Spielfelds liegt. Beim Gegner ist Position logischerweise unbekannt, dafür müsste man das Array durchsuchen welches Objekt POS X+40 belegt und diesen ebenfalls außerhalb des Spielfelds legen. Aber wenn die Explosion weitere Gegner erwischt, müssten diese ebenfalls gesucht und entfernt werden. Bei vielen Gegnern wie im Level M könnte das extrem langsam sein. Und es könnten eventuell noch weitere Nebenwirkungen beim Diamanten-Array auftreten, wenn die Schmetterlinge sich in Diamanten verwandeln und den Platz von vorhandenen Diamanten einnehmen. Dann sind im Array zwei oder mehr Einträge vorhanden, für ein und demselben Diamanten und beim Herunterfallen erscheinen diese dann.
Mir fällt leider keine bessere Lösung ein, als alle Array zu durchsuchen und die doppelten Einträge zu entfernen.
Ahhh ich weiß was du meinst und das ist ein echtes Problem. Ein Gegner wird von einem Stein erschlagen, im Bildschirmspeicher ist das Position X vom Stein und X+40 für den Gegner. Die Position vom Stein im Array ist bekannt, da dieser die Explosion ausgelöst hat, da könnte man einfach eine Position wählen, die außerhalb des Spielfelds liegt. Beim Gegner ist Position logischerweise unbekannt, dafür müsste man das Array durchsuchen welches Objekt POS X+40 belegt und diesen ebenfalls außerhalb des Spielfelds legen. Aber wenn die Explosion weitere Gegner erwischt, müssten diese ebenfalls gesucht und entfernt werden. Bei vielen Gegnern wie im Level M könnte das extrem langsam sein. Und es könnten eventuell noch weitere Nebenwirkungen beim Diamanten-Array auftreten, wenn die Schmetterlinge sich in Diamanten verwandeln und den Platz von vorhandenen Diamanten einnehmen. Dann sind im Array zwei oder mehr Einträge vorhanden, für ein und demselben Diamanten und beim Herunterfallen erscheinen diese dann.
Mir fällt leider keine bessere Lösung ein, als alle Array zu durchsuchen und die doppelten Einträge zu entfernen.
TheRealWanderer meint
"Wegen den Array löschen, würde ich es gar nicht so kompliziert machen. Im Prinzip muss, wenn ein Butterfly mit einem Stein kaputt gemacht wurde, lediglich der letzte Butterfly aus dem Array an dessen Stelle kopiert werden und der Arrayzähler (ZB?) um eins vermindert werden. Wenn kein Butterfly mehr vorhanden ist, muss aus dem Mainloop der Sprung in die Bewegungsroutine unterbunden werden. (Das gleich natürlich auch für den Firefly.)"
Was ich mal versuchen werde ist folgendes.
Ich lösche alle Arrays und lasse das komplette Feld nochmal einlesen. Mal schauen wieviel Zeit das in Anspruch nimmt.