Hello, Guest the thread was called298 times and contains 4 replays

last post from aitsch at the

das "Rahmen-Problem"

  • Ich schreibe gerade ein Programm für einen unerweiterten VC-20 - also für 3,5K RAM.

    Weil ich den Bildschirm auf 25 x 30 Zeichen erweitert und schon ca. 60 – 70 eigene Character neu definiert habe, ist jetzt schon klar das es eng wird im RAM.


    Um möglichst viele Level einbauen zu können, habe ich dank Spiegel- und Kopierlogik den Speicherverbrauch für eine ganzseitige Map auf 25 Byte gedrückt. Das funktioniert auch mit einer sehr sparsamen LoadMap-Routine ganz gut.

    Nachdem die grundsätzliche Map gezeichnet wurde, sollen weitere Elemente (hier die Blöcke) mittels möglichst wenig Codezeilen eingebaut werden.

    Und genau hier komme ich gerade nicht weiter.

    Grundsätzlich ist das kein Problem aber es darf praktisch keinen Speicher benötigen.


    Also pro Map wird immer nur eine Flagge gezeichnet. Dafür gibt es genau 5 mögliche Positionen.

    In den vier Ecken oder mittig (siehe beigefügtes Bild). Das ist natürlich kein Problem.


    Aber anschließend soll die Flagge mit Blöcken umrahmt werden.

    - In den Ecken bilden die Blöcke immer nur eine „L-Form“.

    - In der Mitte wird die Flagge komplett umrandet, also eine rechteckige Form.

    - Zwischen Flagge und Block ist immer ein freies Feld.


    Ich habe mal zur Veranschaulichung ein Bild mit allen 5 möglichen Kombinationen beigefügt.

    Im Spiel wird es immer nur eine Flagge an einer der 5 Positionen geben.

    Die X- & Y-Koordinaten der Flagge habe ich zusätzlich mit dran geschrieben.


    Die Blöcke sollen über eine Logik nach den genannten Regeln erzeugt werden und so wenig Speicher wie möglich verbrauchen.

    Ich habe schon 3 x angefangen und den Code wieder gelöscht. Irgendwie finde ich keine Logik, die wenig Speicher benötigt und dann auch noch funktioniert. Es muss aber gehen!


    Zu bieten habe ich eine Funktion, die aus den X- und Y-Koordinaten (übergeben mit ldx & ldy) die BS-Adresse ermittelt, aber eine absolute Adressierung wäre mir auch recht.

    Der Screen RAM startet bei $1c00 und endet bei $1eed.


    Habt ihre eine Idee, wie ich die Sache angehen kann oder ist das vielleicht ein bekanntes Problem?


    Hoffentlich konnte ich mein Problem verständlich beschreiben.


    Ich danke Euch für jede Anregung


    aitsch

  • Im Grunde genommen, sind die L-Blöcke und der mittlere Block allesamt identisch, nur daß die L-Blöcke dadurch entstehen, daß Teile des gesamten Blocks außerhalb des sichtbaren Bereichs liegen. Wenn Dein Programm über eine Routine verfügt, ein Zeichen an einer bestimmten Position (X,Y) auszugeben, würde ich diese Routine so erweitern, daß sie vorab testet, ob X und Y im sichtbaren Bereich liegen:

    Mit solch einer Ausgaberoutine benötigt man nur eine Routine für alle Blöcke, der man eine beliebige Anfangskoordinate übergibt.

  • Hi M.J.,


    das ist genau der Ansatz, den ich 3 x verworfen hatte.


    Dein Hinweis einfach die Koordinatenprüfung in die Zeichenroutine zu verlagern hat den Knoten platzen lassen.

    Das ich da nicht selbst drauf gekommen bin:facepalm:. Dabei ist es so offensichtlich.

    Ich hatte immer versucht die Koordinatenprüfung in der Schleife für das Rechteck mit einzubauen, weil alles andere keine Prüfung braucht.

    Dadurch wuchs und wuchs meine Schleife und auch die Komplexität bis ich alles wieder verworfen hatten.

    Wahrscheinlich war ich gestern Abend schon zu verpeilt um selbst drauf zu kommern.

    Manchmal ist es echt besser den Rechner erstmal auszuschalten und am nächsten Tag das Problem nochmal frisch und von vorne anzugehen (diese Erkenntnis hatte ich schon so oft aber nie was draus gelernt).


    Es flutscht jetzt wie geschmiert und braucht nur zusätzliche 26 Bytes.


    Ziel erreicht



    :thnks:

  • Ich hab da noch einen abwegigeren Gedanken.

    Bedingung für einen Block:

    1) sichbarer Berich,

    2) 1 Abstand =2, der andere Abstand <=2 von der Position der Flagge.


    Äußere Y-Schleife, innere X-Schleife, darin Adresse jeweils um 1 hoch/runterzählen.

    Im inneren der Schleife dann entscheiden, was an dieser Bildschirm-Position gezeichnet werden soll.

    Falls diese Schleife noch für andere Zwecke nützlich sein könnte (Bildschirm löschen? Vielleicht gar andere Elemente kopieren?) KÖNNTE sich das vielleicht lohnen.

  • @Hogoo

    Ich bin nicht sicher ob ich alles richtig verstanden habe aber momentan bin ich auch recht glücklich mit meiner funktionierenden Funktion.


    Aber danke für deine Idee.

    Sollte es zum Schluss nochmal speichertechnisch eng werden muss ich schauen ob ich das ein oder andere nochmal durchoptimieren muss.


    VG