APPLICATIONSDIVERS ★ Profi-RSX Teil 5 ★

Profi-RSX 5 (CPC Amstrad International)Applications Divers
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Mit Symbolen und beweglichen Bildschirmobjekten sind die CPCs, im Gegensatz zu den übrigen Leistungsmerkmalen, nicht gerade üppig ausgestattet. Hier bieten sie dem Anwender in erster Linie nur die 256 Text-Zeichen. Um dem abzuhelfen, bringen wir in dieser Folge eine komplette ICON und Sprite-Verwaltung. Somit können Sie sowohl Ihre Anwenderprogramme mit Ikonen benutzerfreundlicher herrichten, als auch Ihre Spiele durch Sprites schneller und optisch aufwendiger gestalten.

Dabei ist die Bezeichnung, ob ICON oder Sprite, nebensächlich, da sich beide progranuntechnisch nicht unterscheiden. Da Ikonen meistens als feste Bildsymbole Verwendung finden und Sprites in erster Linie in Spielen zu Hause sind, wird je nach Anwenderfall in diesem Beitrag der richtige Ausdruck verwendet. Um hier keine Unklarheiten zu schaffen, nachfolgend noch einmal als Zusammenfassung, was hier wie bezeichnet wird:

ICON: Ein-/ausblendbare Bildsymbole, die jedoch vom Programm in der Regel nicht bewegt werden.

Sprite: Diese Bezeichnung wird verwendet, wenn diese Bildsymbole in der Regel durch ein Programm bewegt werden (meistens in Spielen oder z.B. als Cursor-Symbol)

Sie sehen, es gibt lediglich den Unterschied, ob sie fest sind oder bewegt werden. Profi RSX ist es aber egal, wie Sie ein Symbol bezeichnen. Es verwaltet einfach Symbole, alles andere ist uninteressant. Lediglich von Bedeutung ist, daß alle Symbole (Sprites und Ikonen) selbstverständlich keine Bildschirmdarstellung vernichten, d.h., daß der Hintergrund nach dem Ausblenden der Symbole wieder unverändert erscheint.

Grundsätzliches

Um mit dieser Folge arbeiten zu können, laden Sie einfach die Erweiterung und initialisieren Sie diese mit “CALL &8000“ (vor dem Laden natürlich “MEMORY &7fff“ eingeben). Falls Sie auch einige oder alle anderen Profi RSX-Teile verwenden möchten, so befolgen Sie bitte unbedingt die zum Schluß abgedruckte Ladeanweisung! Ikonen und Sprites bestehen in ihrem Aufbau aus einer Matrix, die, wie bei den Text-Zeichen, die Informationen für ihr Aussehen enthält. Natürlich benötigt Profi RSX Speicherplatz, um sich die Matrix zu merken. Da PR sich diesen nicht willkürlich reserviert, was Ihr BASIC-Programm äußerst unflexibel machen würde, bedarf es einer Mitteilung an PR, wo und wieviel Speicherplatz reserviert werden soll. Dabei kann der Speicherplatz überall in den ersten 64k ihres Rechners liegen (natürlich nicht im Bildschirm-RAM, innerhalb von Profi RSX oder anderen System-Bereichen). Aber ansonsten sind Sie völlig frei in Ihrer Wahl. Wenn Sie sich entschieden haben, wo Sie am ehesten Speicherplatz entbehren können, so müssen Sie PR dessen Lage mitteilen. Dieses geschieht mit Hilfe des Befehles Nr. 83 (»SP.MEMORY, Adresse oberste Speicherstelle, Adresse unterste Speicher stelle«). Danach wird dann dieser Bereich für alle ICON/Sprite-Definitionen verwendet, natürlich einschließlich der oberen und unteren Adresse. Bevor Sie den Befehl anwenden, müssen Sie, wie Ihnen inzwischen sicherlich einleuchtet, den BASIC-Speicher durch »MEMORY (unterste Speicherstelle)-1« schützen. Damit Sie jedoch wissen, wieviel Speicher Sie benötigen, sehen wir uns jetzt erst einmal an, wie Sprites & Ikonen erstellt und intern behandelt werden.

Erstellen von Ikonen und Sprites

Ein Icon (und auch ein Sprite) ist prinzipiell nicht anders zu erstellen als ein Zeichen. Lediglich gilt hier zu berücksichtigen, daß dieses auch farbig sein kann. Damit läßt sich eine äquivalente Programmierung zum Symbol-Befehl nicht erreichen. Wie jedoch dann programmieren? In der Computer-»Steinzeit«, sprich C 64, als erstmals Sprites auftauchten, geschah dieses extrem kompliziert und war (und ist) für den »durchschnittlichen« Freizeit-BASIC-Programmierer undurchsichtig (vorsichtig ausgedrückt). Dort gilt es, Sprites im Binär-Format zu entwickeln und mittels Poke-Befehlen zu laden.

Dann noch ein paar Register setzen und fertig. Falls Sie Farben wünschten, so mußten zusätzlich für jede einzelne Farbe Bitkombinationen berücksichtigt werden. Das ganze war eben ein wenig umständlich und letztendlich gab es auch nur eine »Einheitsgröße« der Sprites. Da Sie einen CPC haben, soll uns das hier nicht weiter interessieren. Wie aber ist bei Profi RSX dieses Problem gelöst worden? Zumindest nicht schlechter, wie ich meine.

Zuerst zur Größe, dem Format der Sprites. Dieses können Sie beliebig wählen. Aus diesem Grund muß irgendwo festgehalten werden, welches Format welches Sprite hat. Dieses geschieht mit dem zweiten Befehl dieser Folge, der folgende Syntax hat:

“SP.DEF, ICON/ Sprite-Nummer, X-, Y-Ausdehnung, Mode, Adresse Integer-V ariable«

Zuerst geben Sie Nummer des Sprites an. Danach folgen die X- und Y-Aus-maße. Diese sind in Pixel anzugeben. Die X-Ausdehnung sollte durch 8 (Mode 2), durch 4 (Mode 1) oder durch 2 (Mode 0) dividierbar sein. Als nächstes folgt der Mode, in dem das Symbol später angezeigt werden soll. Hier können Sie jeden der drei Bildschirmmodi angeben, die Ihnen Ihr CPC zur Verfügung stellt. Selbstverständlich kann Profi RSX Sprites und Ikonen in allen dreier Auflösungen korrekt verarbeiten. Noch ein weiterer Vorteil steckt in diesem Befehl: Nur durch ändern des Modes in dem Befehl »SP.DEF« können alle Matrixen, die wie nachfolgend beschrieben erstellt wurden, für alle drei Auflösungen verwendet werden; Sie müssen demnach das Aussehen eines Symboles nur einmal festlegen und können es dann in allen Auflösungen benutzen. Dabei sind die Unterschiede in der Anzahl der verwendbaren Farben zu beachten. Für eine Service-Mel-dung seitens Profi RSX wird der vierte und letzte Parameter benötigt. Hier müssen Sie die Adresse (»Klammeraffe«!) einer Integer-Variablen übergeben. Der Inhalt dieser Variablen sollte (muß aber nicht) zweckmäßigerweise eine »0« sein. Nach Abschluß des Befehles teilt Ihnen dieser hier mit, ob er erfolgreich durchgeführt wurde. Ist der Inhalt der Variablen=l, so war alles ok. Andernfalls (Inhalt=0 oder unverändert) gab es eine oder mehrere Unstimmigkeiten. In erster Linie kann dies ein Mangel an Speicherplatz gewesen sein. Wie aber berechnen Sie den benötigten Speicherplatz für ein Symbol? Dies läßt sich leicht mit folgender Formel bewerkstelligen:

benötigterSpeicherplatz=(Y-Ausdeh-nung*(X-Ausdehnung/Mode-faktor)) + 12

Dabei sind für die Ausdehnung die Werte in Pixel einzusetzen. Der Modefaktor beträgt bei Mode 2: 8, bei Mode 1: 4 und schließlich bei Mode 0: 2. Zusätzlich müssen immer 12 Bytes addiert werden, die PR intern zur Verwaltung benötigt. Dieses soll hier aber nicht weiter beachtet werden. Wie aus obiger Formel ersichtlich, benötigt ein Symbol gleicher Ausdehnung je nach Mode unterschiedlich viel Speicherplatz. Dieses läßt sich dadurch erklären, daß je nach Mode ein Pixel (auf Grund der Anzahl der möglichen Farben) 1, 2 oder 4 Bits Speicherkapazität beansprucht. Folglich erscheinen die Symbole in horizontaler Richtung in Abhängigkeit vom Mode in unterschiedlicher Größe. Die Pixel-Zahl pro Symbol ist dabei aber immer gleich. Die obige Formel gilt nur für im Speicher befindliche Symbole. Sollen diese auch angezeigt werden, so vergrößert sich der Speicherbedarf auf fast das doppelte. Die nötige Formel lautet:

benötigterSpeicherplatz = (Y-Ausdeh-nung*(X-Ausdehnung/Mode-faktor))*2 +12

Wie Sprites angezeigt und bewegt werden, folgt später. Schließlich müssen Sie diese erst einmal definieren. Dieses geschieht mit dem Befehl “SPRITE“. Seine Syntax lautet:

“SPRITE, Sprite-Nr., X-, Y-Position, > weitere Parameter < “

Dieser Befehl sieht auf dem ersten Blick zwar relativ einfach aus, bei genauer Betrachtung ergibt sich jedoch, daß dieser einer der komplexesten Befehle innerhalb von PR ist und Sie es ihm zu verdanken haben, daß Sie Sprites komfortabler als auf einem C64 programmieren können.Das Programmieren der Matrix ist mit ihm nicht schwieriger als das Erstellen einer Graphik mit den BASIC-Befehlen PLOT und DRAW und somit auch einfacher als das Definieren neuer Zeichen mit dem SYMBOL-Kommando, da Sie mit ihm innerhalb der Matrix an beliebiger Stelle Punkte setzen oder ganze Linien ziehen können.Nach Angabe der obligatorischen Sprite-Nr., die bei nahezu allen Sprite-Befehlen verlangt wird, folgt die Angabe einer X- und Y-Position. Diese bezieht sich auf die Sprite-Matrix. Stellen Sie sich Ihre Matrix (deren Größe Sie vorher mit dem Befehl »SP.DEF« festgelegt haben) so vor, als wäre Sie eine Aneinanderreihung von einzelnen Punkten in mehreren Zeilen. Dabei hat der Punkt links oben innerhalb der Matrix die Koordinate 0X/0Y. Der nächste Punkt hat die Koordinate 1X/0Y, der Punkt der genau unter diesem liegt, die Koordinate lX/lY.Sie können also durch Angabe dieser Koordinate festlegen, welchen Punkt Sie als erstes innerhalb der Matrix definieren wollen. Letzteres geschieht durch die folgenden Parameter, die in der Syntax-Beschreibung unter »weitere Parameter« fallen. Möchten Sie beispielsweise den vorher adressierten Punkt die Farbe 2 (entsprechend INK 2) zu weisen, so hängen Sie eine »2« an. Damit ist die Farbe des Punktes festgelegt. Durch Angabe einer Koordinate und der zugehörigen Farbe definieren Sie somit einen Punkt in der Sprite-Matrix. Es läßt sich jede Farbe angeben, eine »0« steht z.B. für »nicht gesetzt« und der Punkt hat das gleiche Aussehen wie der Bildschirm und hebt sich nicht von diesem ab. Die mögliche Zahl der verwendbaren Farben ist vom gewählten Mode abhängig (siehe »SP.DEF«). Es sind in Mode 0 die Farben 0 — 15, in M. 1 0 1 — 3 und in M.2 die beiden Nr. 0 und 1 möglich. Geben Sie eine höhere Farb-Nummer an, so wandelt PR diese automatisch in die entsprechende gültige Nummer um, aus Nr. 6 wird in Mode 1 folglich Farbe 2. Diese Automatik unterstützt das Verwenden von Symbol-Definitio-nen in allen 3 Auflösungen.Sie haben jetzt Ihren ersten Punkt festgelegt. Um alle nachfolgenden ebenfalls zu setzen, bedarf es jedoch nicht einer erneuten Positions-Angabe. Hierzu reicht es aus, weitere Zahlen werte anzuhängen, wobei jede Zahl die Farbe eines Punktes festlegt und zwar in der Reihenfolge von links nach rechts. Wird die rechte Grenze der Matrix erreicht, so wird automatisch in der folgenden Pixel-Zeile ganz links fortgefahren. Allerdings lassen sich nicht beliebig viele Parameter den Befehl mitgeben, da der BASIC-Interpreter nur max. 32 Parameter pro RSX-Befehl verarbeiten kann. Abzüglich der ersten drei Parameter bleiben pro Befehl max. 29 für die Matrix-Definition übrig. Nun wäre es sicherlich äußerst langweilig und zudem sehr verschwenderisch (Speicherplatz!), wenn Sie z.B. eine ganze Matrix-Zeile auf ein und dieselbe Farbe setzen wollten und hierzu für jeden einzelnen Pixel ständig die gleiche Zahl angeben müßten. Glücklicherweise ist dieses nicht notwendig, denn der »SPRITE«-Befehl bietet hierzu eine andere Lösung an. Mit Hilfe von 2 Zahlen können Sie bis zu 255 Punkte auf die gleiche Farbe setzen. Dazu geben Sie im Befehl eine negative Zahl an (von —1 bis —255) und sofort anschließend die Nummer der Farbe, welche für die mehreren Pixel gelten soll. Die ins positive gewandelte Zahl ergibt die Menge der Parameter, welche alle gleichfarbig werden. Wenn Sie z.B. folgende Parameterisierung verwenden:

“SPRITE,0,0,0,1,2,-5,3,2“

dann bedeutet das

ICON/Sprite-Nummer: 0 Position des ersten Pixels: 0X,0Y (links oben)

Farbe dieses Pixels: 1 Farbe des nächsten Pixels: 2

danach folgen 5 Pixel mit der Farbe 3 und ein Pixel mit der Farbe 2 (Position 8X,0Y).

So läßt sich mit mehreren Befehlen schnell und äußerst einfach ein Icon oder Sprite definieren, ohne ein Computer-Profi zu sein und mit PEEK, POKE oder CALL zu hantieren.Auch vorhandene Bildschirmgraphik läßt sich mit dem Befehl »SP.GET2« als Sprite-Matrix einiesen. Die Größe des Bildschirmausschnittes, welcher in eine Sprite-Matrix umgewandelt wird, ist äquivalent zum Format des Symbo-les.Um ein Sprite auf dem Bildschirm darstellen zu können, bedarf es eines weiteren Schrittes. Es muß erst »eingeschaltet« werden. Bei diesem Vorgang wird zusätzlich Speicherplatz reserviert, da ja die Bildschirmgraphik gespeichert werden muß, wenn ein Symbol angezeigt wird. Das Einschalten geschieht mit dem Befehl »SP.ON«. »Ausschalten« können Sie ein Sprite, um z.B. Speicherplatz zu sparen, mit dem Befehl »SP.OFF«. Wenn ein Sprite eingeschaltet ist, kann es auf dem Bildschirm dargestellt werden, z.B. mit »SP.PUT«. Näheres erfahren Sie ein wenig später. Da dies bisher sehr viel Theorie war, habe ich mir, zur besseren Verständlichkeit und damit Sie ein wenig Praxis bekommen, das Titellogo dieses Heftes vorgenommen und es, ein wenig modifiziert, in ein Matrix-Raster übertragen. Das Ergebnis finden Sie in Abbildung 1. Ergänzend zeigt Abbildung 2 die Bedeutung der Punkte. Versuchen Sie jetzt, diese Matrix in »SPRITE«-Befehle zu Übetragen und vergleichen Sie Ihr Ergebnis mit dem Programm 1, welches dieses Symbol erzeugt und anzeigt. Bevor Sie das Programm starten, müssen Sie erst mit Hilfe von »SP.MEMORY« einen Speicherbereich für das ICON resevieren. Dieser muß mindestens &???? Bytes umfassen. Den Umfang sollten Sie selber errechnen. Das Programm erklärt sich eigentlich von selbst, so daß jetzt Punkt 3 an der Reihe ist.

Darstellen und Bewegen der Symbole

Bis hier haben wir in erster Linie das behandelt, was sowohl für Ikonen und Sprites gleichermaßen gilt. Jetzt wenden wir uns mehr den Sprites zu. Wie diese erzeugt werden, wissen Sie. Wie erfolgt jedoch programmtechnisch ihre Steuerung und Bewegung auf dem Bildschirm?

Der Grundbefehl dazu lautet »SP.PUT, Sprite-N r., X-Position, Y-Position (Darstellungs-Mode) »Hiermit plazieren Sie das Symbol auf dem Bildschirm. Die anzugebene Position kann sich in folgenden Grenzen bewegen:

Mode 2: 640 (X) * 200 (Y) Punkte Auflösung (mögliche Koordinaten: 0-639X, 0-199Y)

Mode 1: 320X*200Y (0-319X)

Mode 0: 160X*200Y (0-159X)

Dabei ist zu beachten: Jede X-Koordi-nate muß in Mode 2 durch 8, in Mode 1 durch 4 und in Mode 0 durch 2 dividierbar sein, ansonsten wird das Symbol nicht angezeigt. Zusätzlich ist noch die X-Koordinate 0 erlaubt. Werden größere als die vorgenannten X-Koor-dinaten verwendet, so wird das Sprite zwar angezeigt, es befindet sich aber zeilen versetzt auf dem Monitor. Die Y-Koordinaten werden im 200er System angegeben. Eine Sprite Y-Koordinate ist also immer halb so groß wie die entsprechende Graphik-Y-Koordinate, wo max. 400 Punkte verwendet werden. Sie haben jetzt ein Sprite angezeigt. Entfernen geht noch einfacher. Dazu reicht der Befehl »SP.GET, Sprite-Nr. (ohne Koordinaten)«. Dann wird das Sprite entfernt und der alte Bildschirminhalt wird wieder eingeblendet. Bevor wir jetzt zum eigentlich spannenden kommen, dem Bewegen der Sprites, untersuchen wir den wahlweise anzugebenden Darstellungs-Mode. Hier gibt es 5 Möglichkeiten:

0 - Force (Standard)
1 - XOR
2 - AND
3 - OR
4 - NOT

Dieser Mode gibt an, wie das Sprite mit der »alten« Bildschirmgraphik verknüpft wird. Bei Option »0«, die auch Standard ist, erfolgt keine Verknüpfung, die »alte« Graphik wird überschrieben. Die Varianten 1 bis 3 entsprechen den bekannten Möglichkeiten aus dem Graphik-Bereich des CPC, wobei Option 3 besonders interessant ist, da dann das Sprite »transparent« über den Hintergrund gelegt wird. Option 4 bewirkt ein invertieren der Pixel des Sprites. Der Darstellungsmode kann bei jedem Befehl zur Darstellung oder Bewegung von Sprites angegeben werden. Er bleibt für alle Ausgaben bestehen, bis ein anderer programmiert wird.

Das Bewegen geschieht mit dem Befehl »SP.MOVE« und seinen beiden Variationen. Der erste Grundbefehl bewegt das Sprite an die neu angegebene Position weiter, während »SP.MOVER« das Sprite um eine Differenz, ähnlich wie dies bei dem BASIC-Befehl MOVER der Fall ist, versetzt. Der mächtigste Befehl ist »SP.MOVER2«. Dieser entfernt nicht nur das Sprite an der alten Position und bewegt seine Position um den gewünschten Abstand weiter, er bildet an der neuen Position an dessen Stelle zusätzlich ein anderes Sprite ab. Damit wird das Erzeugen von sich »bewegenden« Figuren unterstützt.

Um eine flimmerfreie Darstellung der Sprites zu ermöglichen,wird die Einblendung dieser mit dem Bildrücklauf synchronisiert. Falls Sie mehrere Sprites gleichzeitig bewegen wollen, so müssen Sie diese Funktion deaktivieren und die Synchronisation durch das BASIC-Programm durchführen lassen, z.B. mit den Event-Befehlen oder mit dem PR-Befehl “FRAME“ bzw. durch »CALL &BD19«, da letzteres schneller ist.Wenn nun Sprites über den Bildschirm schweben, so kommt es sicherlich vor, daß sie mit anderer Graphik in Berührung kommen. Dann wäre es wünschenswert, daß diese je nach Fall

»vor« oder »hinter« der Graphik herschweben können. Auch das ist mit Profi RSX möglich. Sie können mit dem Befehl »SP.PRIO« (-rität) für jedes einzelne Sprite separat festlegen, ob dieses beim Zusammentreffen mit vorhandener Graphik diese überblenden soll oder ob die Graphik Vorrang hat. Allerdings gibt es jedoch Fälle, wo ein Sprite weder »vor« noch »hinter« der Graphik herschweben soll, sondern wo Sie bei einer Kollision schnell reagieren müssen. Dazu hat Profi RSX eine komplette Kollisionskontrolle integriert. Diese meldet sofort, wenn ein »Crash«auf dem Bildschirm stattgefunden hat. Die Meldung kann derart geschehen, daß bei Auftreten der Situation automatisch in ein Unterprogramm oder in eine andere Programmzeile verzweigt wird. In den Unterprogrammen oder der angegebenen Zeile muß Ihre (BASIC-) Kollisionsbehandlung stehen. Nach Abschluß dieser kann mit einem speziellen Befehl (»SP.RETURN«) an der gleichen Stelle wie vor der Kollision fortgefahren werden.

Um die Funktion zu aktivieren, muß Profi RSX die Programmzeile des Unterprogrammes (mit »SP. GOSUB«) oder eine normale Programmzeile (mit »SP.GOTO«) mitgeteilt werden. Bei Auftreffen eines Sprites auf ein Hindernis wird dann sofort in die Zeile verzweigt, sofern die Automatik mit »SP.KOL« aktiviert worden ist. Als Hindernis wird alles das verstanden, was nicht in INK 0 gezeichnet ist.

Mit der letzten Routine nimmt Ihnen Profi RSX fast alle Programmierarbeit für z.B. ein Hindernisspiel ab. Die Anwendung und ihre Auswirkungen in der Praxis demonstriert das im Anhang abgedruckte Spiel Nr.l (Programm-Nr. 2). Bei diesem Spiel geht es darum, einen »Ball« durch ein vorgegebenes Labyrinth zu steuern. Sie müssen von der linken oberen in die rechte obere Ecke finden. Dabei sollten Sie nach Möglichkeit die »Mauern« nicht berühren. Neben diesem Labyrinth können Sie beliebig viele andere per Zufall erzeugen lassen. Dort können Sie die Mauern durch Betätigung der Feuer-Taste überspringen. Allerdings hat das jedesmal 50 Straf-Punkte zur Folge. Dieses Spiel soll Ihnen in erster Linie die Kollisions-Kontrolle demonstrieren. Sie sollten das Spiel deshalb ausnahmsweise nicht vorrangig spielen, sondern eher das Listing »studieren«. Hiermit sind alle wesentlichen Funktionen dieses Teiles beschrieben worden. Zu allerletzt müssen wir noch kurz das Thema Geschwindigkeit behandeln. Natürlich sollten Sprites & Ikonen so klein wie möglich sein. Außerdem können Sie nicht 10 Sprites gleichzeitig bewegen, da es sich beim CPC schließlich um einen Z80-Rech-ner mit effektiv 3,3 Mhz Taktfrequenz handelt. Auch die Kollisions-Kontrolle sowie die Prioritäts-Verwaltung kosten Zeit, Aber bei vernünftiger Programmierung lassen sich gute Ergebnisse erzielen. Dies gilt besonders für die absolut flimmerfreie und fließende Bewegung der Sprites.

Falls Sie mehrere Teile von Profi RSX gleichzeitig in Ihren Programmen verwenden, so sollten Sie sich das ebenfalls in diesem Heft abgedruckte Programm »RSX-Compiler« ansehen, da dieses eine Geschwindigkeitssteigerung bringt. Das Beispiel-Programm soll die Programmierung der Sprites demonstrieren. Sie sind allein schon aus Platzgründen sehr kurz und einfach, so daß sie natürlich nicht besonders anspruchsvoll sind. Letzteres sollten sie auch nicht sein, da hier der Lemwert im Vordergrund steht. Die Programmierung von »Super-Spielen« überlasse ich Ihnen!

Damit Sie letzteres (wenn Sie möchten) in Angriff nehmen können, sollten Sie zürst den BASIC-Lader abtippen, diesen an Ihren Rechner eventuell anpassen und danach als erstes die Befehlsliste dieser Folge genau durchlesen. Wenn Sie sich dann noch die Programme angesehen haben, können Sie mit dem Programmieren beginnen. Viel Spaß!

Anm.: Für diejenigen, die keine »Lust« haben, Ikonen & Sprites per Hand (bzw. eher »Kopf«) zu erstellen, folgt nächsten Monat unter anderem ein komfortabeler Icon- und Sprite-Editor. Zu beachten ist, daß Sie, bevor Sie den Data-Loader starten, den Speicherbereich absichem und zwar durchME-MORY &7fff. Anschließend sichern Sie den M-Code (& den BASIC-Loa-der) dann sofort auf Kassette/Diskette (vor der Initalisierung!). Den M-Code sollten Sie auf jeden Fall unter dem folgenden Namen speichern:

SAVE “SP-464“ ,b, &8000,2214

Besitzer eines 664 bzw. 6128 ändern die Zeichenfolge >464< wie üblich wieder in > 664 < bzw. > 6128 < .

Um jetzt mit Profi RSX arbeiten zu können, befolgen Sie beim Laden bitte folgende Reihenfolge:

MEMORY &7fff
LOAD “G1-464.BIN“
LOAD “G2-464.BIN“
LOAD “S-464.BIN“
CALL &9FA0
CALL &96B0
CALL &8F90
LOAD “T-464.BIN“
CALL &87E0
LOAD “SP-464.BIN“
CALL &8000

ACHTUNG: Der M-Code dieser Folge überlappt sich mit dem des letzten Teiles. Dieses ist nicht weiter schlimm, da dem nur einige Initialisierungs-Routinen des vierten Teiles zum Opfer fallen, die nur bei der Initialisierung gebraucht werden. Aus diesem Grund muß der vierte Teil immer vor der Folge 5 geladen und initialisiert werden; Befolgen Sie deshalb unbedingt die oben vorgestellte Lade-Reihenfolge. Der Teil 4 darf unter keinen Umständen durch »CALL &87e0« ein zweites Mal aufgerufen werden; Am besten ist es, wenn Sie die Ladefolge wie oben abgedruckt in Ihr Programm einbinden und sicherstellen, daß dieses nur einmal angesprungen wird!

Bei Anwendung der obigen Regel kann eigentlich nichts mehr schief gehen.

ICON & »SPRITE « Befehle (Teil 1)

Dieser sehr umfangreiche Teil bietet sehr viele Befehle zur Erzeugung und Verwaltung von »Sprites/ICON's« (d.h. von ein- und ausblendbaren, verschiebbaren Bildschirmteilen). Da diese »Sprites« software-mäßig gesteuert werden, sind sie keine Sprites in der ursprünglichen Definition. Sie werden dennoch ab jetzt als »Sprites« bezeichnet.

Grundsätzlich gilt

  • Alle Sprite/ICON-Befehle beginnen mit dem Teil >SP.< (besonders wichtig ist der Punkt!).
  • Falls Variablen verlangt werden, so müssen dies immer Integer-Variablen sein.
  • Bei Variablen muß immer deren Adresse (durch den »Klammeraffen«) übergeben werden, sonst sind die Folgen nicht vorhersehbar, falls etwas in die Variablen geschrieben wird!
  • Wie hier allgemein gültig, sind die Parameter, die in dieser Auflistung in Klammem gesetzt sind, optional und können entfallen.
  • Es können maximal (theoretisch) 65536 Sprites/ICON's verwaltet werden, so daß die Nummer eines Sprites/ICON's von 0 bis 65535 gehen kann.

WICHTIG: Die Sprite/ICON-Num-mern dürfen nur in aufsteigender Reihenfolge vergeben werden. Das bedeutet, daß die Nummer 5 nur vergeben werden darf, wenn schon Sprites/ICON's mit den Nummern 0 bis 4 bestehen.

  • Die Ausmaße eines Sprites können jederzeit verändert werden!
  • Die Ausmaße werden immer in Pixel angegeben.
  • ACHTUNG: Alle Koordinaten werden in »tatsächlich vorhandenen« Pixel angegeben! Die max. Auflösung je nach Mode beträgt also:
    640*200 in Mode 2
    320*200 in Mode 1
    160*200 in Mode 0

Die max. Y-Koordinate beträgt immer 199. Graphik-(Y)Koordinaten müssen deshalb immer durch zwei geteilt werden. In X-Richtung gilt das gleiche bei den Modes 1 und 0. Um ein ICON/ Sprite immer an der gleichen Position (z.B. 400X/100Y in Mode 2) zu haben, muß es in Mode 1 die Koordinaten 200X/100Y und in Mode 0 die Koordinaten 100X/100Y besitzen. Von einer Auflösung zur nächsten findet immer eine Halbierung (oder Verdopplung) statt. Nur die Y-Koordinaten bleiben gleich!

  • Es sollte niemals eine Sprite-Num-mer in einem Befehl verwendet werden, wenn dieses nicht existiert (Ausnahme: bei SP.DEF)
  • Ab jetzt werden teilweise die Wörter »SPRITE/ICON« durch ein »S« abgekürzt.
  • Alle Befehle gelten sowohl für Sprites als auch ICON's. Diese unterscheiden sich in Ihrer Funktion und Anwendung nicht. Die unterschiedlichen Namen sind nur auf die Anwendungsbereiche abgestimmt.

83.SP.MEMORY, oberste Speicherstelle, unterste Speicherstelle, weist der Sprite-Verwaltung von PROFIRSX einen Speicherbereich für die Ablage der Sprites zu.

Diese Festlegung muß immer vor dem Definieren der Sprites geschehen. Vor Anwendung dieses Befehles muß der entsprechende Speicherbereich durch den BASIC-Befehl »MEMORY unterste Speicherstelle-1« geschützt werden. Der Bereich wird vollkommen gelöscht, kann also zum Löschen aller Sprites verwendet werden. Wegen der vorgenannten Auswirkung sollte der Befehl nur einmal angewendet werden.

84. SP.DEF, S-Nr., X-, Y-Ausmaße, Mode, Adresse Integer-Variable- Definiert ein Sprite mit der Nummer, welche als erster Parameter angegeben wurde.

Der entsprechende Speicherplatz wird reserviert. Die Größe wird in Pixel für die X- und Y-Richtung angegeben. Die tatsächliche Byte-Größe wird automatisch berechnet, wozu das Programm den vierten Parameter benötigt. Dieser gibt den Mode an, in dem das Sprite später verwendet werden soll. Dieser Mode ist jedoch völlig unabhängig vom momentanen Bildschirm-Mode. Der letzte Parameter dient dazu, daß das Programm dem Benutzer mitteilt, ob die Aktion erfolgreich war. Nach Abschluß bedeuten die Werte, die in dieser Variablen enthalten sind:

0 / kein Erfolg (Gründe können z.B. sein: Kein Speicherplatz vorhanden, Nummer größer als letzte Nummer +1, usw.)!
1/ Erfolgreich

85. SPRITE, S-Nr., X-, Y-Koordinate, weitere Parameter

— Nach Angabe der Nummer können beliebig viele Parameter folgen (bis zu 31, bedingt durch den BASIC-Interpreter). Zuerst werden die Koordinaten des ersten Punktes innerhalb der Spri-te-Matrix angegeben. Diese können beliebig sein, sollten jedoch innerhalb der Ausdehnung des Sprites liegen (siehe SP.DEF).Sie dienen dazu, damit PROFI-RSX weiß, welcher Pixel als erstes definiert werden soll. Nur so ist es überhaupt möglich, mehr als 29 Pixel zu definieren.

ACHTUNG: Die X-Koordinate muß bei MODE 2 des Sprites durch 8, bei MODE 1 durch 4 und bei MODE 0 durch 2 zu dividieren sein, sonst kehrt die S-Verwaltung zu BASIC zurück. Zusätzlich ist der Wert 0 erlaubt. Die Y-Koordinaten können beliebig sein. Die Zählung der Koordinaten fängt innerhalb der Matrix links oben an. Dabei hat die oberste Zeile die Nr. 0, die
zweite die Nr.l usw. Gleiches gilt für die Pixel einer Zeile. Der am weitesten links liegende Pixel hat die kleinste Nummer (0;), der am weitesten rechts liegende die höchste Nummer.

Nach dieser Angabe folgen die Parameter zum Setzen der einzelnen Pixel innerhalb der Sprite-Matrix. Jeder der nun folgenden Parameter steht für einen Punkt, der Wert (0—255) dieses Parameters bestimmt die Farbe des Punktes.

AUSSNAHME: Ist ein Parameter negativ, dann werden soviele Pixels, wie durch den ins Positve gewandelten Parameter (Wert 1 —255) angegeben, auf den Wert des darauffolgenden Param-ters gesetzt. Das ist auf den ersten Blick vielleicht etwas verwirrend, deshalb ist hier ein Beispiel zur Erklärung angehängt.

BEISPIEL:
SPRITE,1,0,4,1,2,3,4,-6,3,2

Der Befehl bewirkt im einzelnen: Sprite/Icon-Nummer: IDie X-Position des ersten Pixels ist in der 5.Zeile an Position 0.Pixel 0/5.Zeile: Ink 1

“1/“: Ink 2
“2/“: Ink 3
“3/“: Ink 4

Pixel 4-10/5.Zeile: Ink 3 (bedingt durch das Minus-Zeichen)Pi-xel 11/5.Zeile: Ink 2

- Wenn das Ende einer Pixel-Zeile erreicht ist, dann wird automatisch in der nächsten Zeile weitergemacht. Ist das Ende der gesammten Sprite-Matrix erreicht, so wird die Routine abgebrochen.

Eine ausführliche Erklärung finden Sie im Begleitartikel dieser Folge.

In der nächsten Folge wird zur weiteren Vereinfachung ein Sprite-Editor abgedruckt (s. SP.EDIT).

86. SP.ON, S-Nummer, Adresse Inte-ger-Variable. Jedes Sprite muß (aus Speicherplatzgründen) eingeschaltet werden, bevor es auf dem Bildschirm dargestellt werden kann. Andernfalls ist keine Darstellung möglich.

Inhalt der Variable:

0 > kein Erfolg (aus Speicherplatzmangel)
1 > Erfolg

87. SP.OFF, S-NR., Adresse Integer Variable- Schaltet ein Sprite aus und verhindert damit die Bildschirmdarstellung.

Auf dem Bildschirm befindliche Sprites können hiernach nicht mehr vom Bildschirm gelesen werden. Der Befehl ist z.B. dann sinnvoll, wenn Speicherplatz gespart werden muß oder um ein Sprite zu sperren. Variable: wie üblich

88. SP.DELETE, S-Nr., Adresse Integer Variable, löscht ein Sprite im Speicher.

Es ist nicht sinnvoll, viele Sprites zu löschen, um dafür andere anzulegen (Ausnahme: das Sprite mit der z.Z. höchsten Nummer).

Es kann jedes Sprite gelöscht werden, es muß nicht das mit der höchsten Nummer sein.

89. SP.PRIO, S-Nr., Priorität

  • weißt dem Sprite seine Priorität zu.
  • Unter Priorität versteht man hier, ob es beim Zusammentreffen mit einem anderen Objekt auf dem Bildschirm »vor» oder »hinter« diesem herschwe-ben oder abgebildet werden soll.
  • Eine Priorität von 1 bewirkt, daß das Sprite »hinter« dem Objekt herschwebt, das Objekt auf dem Bildschirm in diesem Fall also Vorrang hat. Eine 0 bewirkt das Gegenteil, das Sprite wird also »vor« dem Objekt dargestellt.

Zusammengefaßt:

Priorität 1 = > Vordergrund (alles was nicht in INK 0 gezeichnet ist) hat Vorrang!

Priorität 0 = > Sprite

  • Wenn die Überdeckung nur einen Teil des Sprites betrifft, so wird der nicht betroffene Teil natürlich normal dargestellt.

90. SP.KOL, EIN/AUS

  • Dieser Befehl ist wichtig in Verbindung mit den beiden nachfolgenden Befehlen.

Hierdurch kann die Kollisionskontrolle (siehe Pos. 92-94) ein- (1) oder aus- (0) geschaltet werden.

Parameter = 1: schaltet SP.GOTO = SP.GOSUB ein Parameter = 0: schaltet SP.GOTO = SP.GOSUB aus

91. SP.GOTO, Zeilennummer (0-65535)

— Dieser Befehl stellt eine der Stärken von PROFI-RSX dar. Mit ihm ist es möglich, daß das laufende BASIC-Pro-gramm bei einer Kollision eines Sprites unterbrochen wird und daß der BASIC-Interpreter an die angegebene Programmzeile springt.

Falls also die Kollisionskontrolle mit dem Befehl-Nr. 90 eingeschaltet worden ist, springt das Programm bei einer vorliegenden Kollision eines Sprites in die definierte Zeile. Die Zeilennummer sollte PROFI-RSX zu Beginn eines Programms mitgeteilt werden, kann aber ständig geändert werden. Der Befehl schaltet die Kollisionskontrolle aus. Sie muß hinterher erst wieder mit >SP.KOL< eingeschaltet werden. Ein event. vorhandenes GOSUB (siehe nächste Pos.) wird gelöscht.

ACHTUNG: Eine Rückkehr zu der vorher bearbeiteten Zeile findet nicht statt. Dies kann nur durch entsprechende Programmierung in BASIC erreicht werden (falls gewünscht). Wenn immer zurückgesprungen werden soll, so ist der Befehl Nr.92 anzuwenden.

Falls die Zeilennummer ungültig (nicht vorhanden) ist, wird im Programm normal fortgefahren.

ACHTUNG: Bei der automatischen Zeilenumnumerierung in BASIC (RENUM) werden die Zeilennummem bei den Befehlen Nr. 91 & 92 nicht mit geändert!

92. SP.GOSUB, Zeilennummer

Dieser Befehl funktioniert fast genauso wie Pos. 91, mit dem Unterschied, daß ein Unterprogramm aufgerufen wird. Eine Rückkehr aus dem Unterprogramm ist nur mit Befehl Nr. 93 möglich.

93. SP.RETURN (keine Parameter)

Trifft der BASIC-Interpreter auf diesen Befehl, so wird das Unterprogramm beendet und der Programmablauf an genau der Position fortgesetzt, wo sich der Interpreter befand, als die Kollision eintrat.

94. SP.FLAG, Adresse einer Variablen

Hiermit können Sie erfahren, ob zwischenzeitlich eine Kollision vorgekommen ist.

Inhalt der Variable=0: keine Kollision Inhalt der Variable = 1: Kollision. ACHTUNG: Sowohl der Befehl > SP.GOTO < wie auch > SP.GOSUB < setzen dieses Flag auf »0«, wenn eine Zeile angesprungen wird.
Auch nach dieser Abfrage wird es wieder auf »0« gesetzt. So ist es möglich, festzustellen, ob nach einer Abfrage eine erneute Kollision stattgefunden hat.

95. SP.LET, 1. S-Nr., 2. S-Nr., Adresse Integer Variable-

Funktion: Weist dem ersten angegebenen ICON = Sprite die Werte (Matrix, Mode, Ein/Aus, usw.) des zweiten zu. Der Befehl sollte nur angewendet werden, wenn keines der beiden ICON's/ Sprites auf dem Bildschirm ist. Variable: wie üblich

96. SP.PUT, S-Nr., X-Position (0-max. 159/319/639), Y-Position (0-199) (, Darstellungs-Mode)

Stellt ein Sprite/ICON auf dem Bildschirm an der X-, Y-Position dar. Dabei wird der event. angegebene Darstellungsmodus berücksichtigt. Dieser kann sein:

0 - FORCE (Standard)
1 - XOR
2 - AND
3 - OR
4 - NOT

ACHTUNG: Die X-Koordinate muß in MODE 2 (80 Z./Z.) durch 8, in MODE 1 durch 4 und in MODE 0 durch 2 teilbar sein, da Sprites und ICON's momentan nur auf Byte-Grenzen beginnen können.

Beachten Sie die max. X-Auflösung (160/320/640 Punkte) und Y-Auflösung (200 Reihen)!

Ist eine Koordinate zu groß, -so wird das ICON=Sprite dennoch abgebildet, seine Lage ist jedoch über den Bildschirmrand hinaus bewegt worden, so daß es ab dem gegenüberliegenden Rand dargeteilt wird.

Die Darstellung wird mit dem Bildaufbau synchronisiert. Dieses läßt sich mit

> SP.FRAME < abschalten.

Die Zählung der X-, Y-Koordinaten erfolgt sonst wie bei den Graphik-Befehlen, mit dem Unterschied, daß der Nullpunkt (0X=0Y) links unten im Bildschirm liegt.

97. SP.GET, S-Nr.2

Entfernt ein Sprite/ICON vom Bildschirm. Eine Positionsangabe ist nicht nötig.

98. SP.MOVE, S-Nr., X-, Y-Position (, D.-Mode)

Bewegt ein Sprite von der derzeitigen Position zu der gewünschten. Ein neuer Darstellungsmode kann angegeben werden (siehe > SP.PUTC).

99. SP.MOVER, S-Nr., X-, Y.Abstand (, D.-Mode)

Bewegt ein Sprite um den angegebenen Abstand weiter. Die Positionierung erfolgt also relativ zur vorherigen Position.

100. SP.MOVER2, Nummer des zu entfernenden Sprite, Nummer des darzustellenden S., X-, Y-Offset (, D.-Mode)

Entfernt das angegebene Sprite vom Bildschirm und bildet das andere Sprite um den gewünschten Offset versetzt ab.

Dieser Befehl unterstützt das Erzeugen von fließenden Bewegungen.

101. SP.FRAME, EIN (1)/AUS (0)

Bildschirmdarstellungen von Sprites werden automatisch mit dem Bildaufbau synchronisiert. Es wird also bei jedem Bildrücklauf maximal ein Sprite dargestellt, was eine sehr gute Qualität ergibt. Bei mehreren Sprites, die gleichzeitig dargestellt werden sollen, muß dieses jedoch abgeschaltet sein.

Dieses deshalb, weil hier mehrere Sprites bei jedem Bildaufbau eingeblendet werden müssen, um ein flimmerfreies Bild zu erzeugen. In diesem Fall muß die Synchronisation vom BA-SlC-Programm erfolgen. Das können Sie entweder durch > FRAME < (siehe Graphik-Befehle) oder durch Interruptsteuerung erzielen.

z.B.:

10 |SP.FRAME,0:A% =0
20 EVERY 1,1 GOSUB 30:WHILE A%
30 |SP.MOVER,0,8,1: |SP. MOVER, 1,4,2:RETURN

Hier bleibt das Programm immer in der Endlosschleife, es wird jedoch jede 50stel Sekunde ein Unterprogramm (/Zeile 30) aufgerufen, wo 2 Sprites bewegt werden. Falls jetzt noch die Kollisionskontrolle eingeschaltet ist, so kann das Programm beim Eintreten der Situation in eine andere Zeile springen und dort z.B. eine Unterroutine ausführen. Das vorgestellte Beispiel
könnte schon die Systemschleife z.B. eines Hindemisspieles sein.

Ein eventuelles leichte Flackern kann daher kommen, daß die BASIC-Inter-ruptsteuerung nicht mit dem Bildaufbau synchron verläuft.

102. SP.POS, S-NR., Adresse 1 .Variable, Adresse 2.Variable

Übergibt die X-Position (0—639) des Sprites an die erste Variable, die Y-Position (0 — 199) an die zweite Variable.

103. SP.GET2, S-Nr., X-, Y-Position

Liest einen Bildschirmausschnitt als neue Sprite-Matrix ein.

Die Größe des Ausschnitts entspricht der Matrix.

Der Befehl darf nur angewendet werden, sofern das Sprite eingeschaltet ist!

(K. Kremer/ME) , CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1987
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ AUTHOR: Klaus Kremer
 

Page précédente : Profi-RSX 4: Text Pack
★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Profi-RSX  5-Sprite-Befehle    (CPC  Amstrad  International)    GERMANDATE: 2022-08-05
DL: 147
TYPE: ZIP
SiZE: 12Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Ligne de Commandes (RSX)
» Applications » Strings als Basic-Kommandos
» Applications » RSX Mixmode (Happy Computer)
» Applications » RSX Magic Paint
» Applications » Variable Dump (Computing With the Amstrad)
» Applications » Extended Basic : 36 Neue RSX-befehle (Schneider Aktiv)
Je participe au site:
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 533 millisecondes et consultée 537 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.