← ST-Magazin 11 / 1988

Grafik im Galopp - Zum Selbermachen: Zeichentrickfilme in GFA-Basic

ST-Grafik

Der große Duden, Wörterbuch in sechs Bänden, bietet unter dem Stichwort »animieren«, neben dem etymologischen Hinweis auf das lateinische »animare« (beseelen), immerhin zwei ausführliche Worterklärungen. Unter anderem heißt es da, »animieren« sei der Versuch, »bei jemandem Lust zu etwas zu wecken«, zugleich aber auch eine Methode, »aus einer Folge einzelner, den Bewegungsablauf wiedergebender Bilder, einen Film zu drehen«. Unser Programm »Move It!« erfüllt beide Definitionen: Es zaubert selbstgedrehte Filme auf Ihren Monochrommonitor und weckt die Lust an der Programmierung in GFA-Basic.

Mit »Move IT!« erhalten Sie ein komfortables und leistungsstarkes Werkzeug, um Trickfilme und Sequenzen beliebiger Art zu entwerfen und in eigene Programme einzubinden.

Nachdem Sie »MOVE IT.BAS« gestartet haben, finden Sie an der Unterkante der Titelseite eine Tastenleiste. Die Funktionstasten sind noch nicht aktiviert. Sie müssen Ihre Maus erst einmal auf die Menü-Leiste schieben.

Im gesamten Programm stoßen Sie hin und wieder auf eine derart graugefärbte Tastenleiste. Die Bedeutung bleibt stets die gleiche. Umgekehrt ist es unmöglich, bei eingeschalteten Funktionstasten auf die Menü-Leiste zuzugreifen. Also zuerst < F1 > betätigen und damit das Hauptmenü wieder einschalten. Klicken Sie zuerst den Menüpunkt »Editor« im »Funktionen«-Menü an. Haben Sie versehentlich »Animation« angeklickt, passiert rein gar nichts, denn noch haben Sie ja keine animierbaren Objekte geladen oder gezeichnet.

Der Editor präsentiert sich mit einer Zeichenfläche, einer Bildablage rechts daneben und neun belegten Funktionstasten. Um eine Funktion aufzurufen, drücken Sie entweder auf die gewünschte Funktionstaste oder klicken das entsprechende Tastenfeld an.

Die Animationssequenz, die wir jetzt zeichnen wollen, gehört zur Kategorie der »partiellen Animationen«. Bei dieser zeichnet der Animator lediglich eine Grundfigur, die er dann immer nur stückweise verändert.

Um das Programm zu verstehen, ist es das einfachste. Sie setzen sich an Ihren ST und folgen unserem Praxisbeispiel. Im folgenden ist Ihr Zeichentalent gefordert: Setzen Sie den Mauszeiger auf die Zeichenfläche, halten Sie die linke Maustaste gedrückt und zeichnen Sie ein einfaches Strichmännchen. Sollte das Männchen nicht genau in der Mitte der Zeichenfläche stehen, drücken Sie < F3 >. Sie befinden sich nun im Clipoder Ausschneid-Modus.

Mit dem Rechteck, das erscheint, wenn Sie die linke Maustaste gedrückt halten, bestimmen Sie den zu verschiebenden Bildausschnitt. Ziehen Sie den Gummirahmen so weit auf, bis der gewünschte Bildbereich umrandet ist. Sobald Sie die Maustaste wieder loslassen, ist der gewünschte Kasten ausgeschnitten. Wollen Sie diesen Bildausschnitt neu positionieren, schieben Sie die Maus an die gewünschte Stelle und drücken die linke Maustaste. Haben Sie den Clip-Modus nur versehentlich eingeschaltet, bringt Sie ein kurzer Klick auf die rechte Maustaste wieder zurück in den normalen Editor-Modus.

Ist das Strichmännchen einigermaßen geglückt, drücken Sie <F10>. Dieser Tastendruck legt das Bild im Arbeitsspeicher (RAM) ab. Dadurch können Sie es später animieren. Der Zähler direkt über der Zeichenfläche meldet nun, daß sich Bild 1 im RAM, Bild 2 in Arbeit befindet. »Kapazität« im rechten oberen Eck gibt an, wie viele Bilder noch im RAM Platz finden. Sollte an dieser Stelle ein negativer Wert erscheinen, ist das kein Grund zur Panik. Ein negativer Wert bedeutet lediglich, daß »Move It!« den aus Sicherheitsgründen angelegten Speicherpuffer von 80 KByte teilweise belegt hat.

Radieren Sie jetzt die Arme Ihres Männchens aus. Zeichnen Sie danach die Arme wieder neu, doch diesmal ein kleines Stück weiter nach oben weisend.

Mit fünf Phasen im RAM (Platz ist für insgesamt 99) können Sie einen ersten Testlauf wagen. Drücken Sie < F2 >.

Ein Untermenü erscheint rechts unter dem Arbeitsfenster. Alle Funktionen sind über die Tasten des numerischen Eingabeblocks erreichbar. Wenn Sie nun mehrfach hintereinander auf < + > drücken, laufen alle fünf Phasen als Film vor Ihnen ab. Jedes Drücken von < + > läßt dabei die nächste Phase erscheinen.

In diesem mit < F2 > aufgerufenen Untermenü können Sie durch das Betätigen der < * >Taste das Bild der Ablage genau vor das gerade angezeigte Bild kopieren. Dies ist besonders nützlich, wenn Sie eine neue Phase in eine bereits existierende Sequenz einfügen möchten.

In diesem Untermenü löscht ein Tastendruck auf <. > die gerade angezeigte Phase. Mit < Enter > verlassen Sie das Untermenü und kehren in den normalen Editor-Modus zurück.

Drücken Sie jetzt < F8 >, um ins Animationsmenü zu gelangen. Hier legen Sie mit dem Parameter »P« fest, um wieviel Bildpunkte oder Pixel jedes Bild in der Animation weiter nach vorn springt. Der Parameter »D« bestimmt die Dauer, mit der ein Bild auf dem Bildschirm zu sehen ist.

Stellen Sie den Wert für die horizontalen Sprünge zwischen den Bildern (P) auf 4, den Wert für die Anzeigedauer (D) auf 2 ein. Sie können jeden Wert einzeln verstellen, indem Sie den Wert einfach anklicken. Anklicken mit der linken Maustaste erhöht den Wert. Mit der rechten Maustaste erreichen Sie das Gegenteil. Wollen Sie sämtliche Werte verändern, klicken Sie Feld 2,3 oder 4 an der Unterkante des Bildschirms an. Beim Einstellen ist zu beachten, daß die Parameter für die erste und letzte Phase direkt nebeneinander liegen: »Phase 0«, entspricht der letzten, »Phase 1« der ersten.

Klicken Sie jetzt noch das erste Feld an, um die Hintergrundfarbe auf weiß einzustellen. Starten Sie dann die Animation mit < Return >. Ihr Strichmännchen sollte nun, die Arme hebend und wieder senkend, von links nach rechts wandern. Durch Drücken von <*> ändern Sie jederzeit die Bewegungsrichtung. Möchten Sie die Bildsequenz nach oben oder unten verschieben, so genügt es, auf < + > oder < - > zu drücken. Ein Druck auf eine Buchstabentaste bricht die Animation ab.

Wollen Sie Ihre Bilder auf Diskette speichern, dann wählen Sie den Menüpunkt »Editor«. Da Sie immer nur das auf der Zeichenfläche gezeigte Bild speichern können, müssen Sie erst einmal Bild 1 durch < F2 > gefolgt von < + > auf die Zeichenfläche zurückholen. Verlassen Sie, sobald Phase 1 erscheint, durch < Enter > das Untermenü und drücken Sie < F5 >: Eine Fileselect-Box erscheint. Nennen Sie Ihre erste Bild-Datei »1.MOV«. Für die Phasen 2 bis 5 sollten Sie die Namen »2.MOV« bis »5.MOV« eingeben.

Der Grund für diese numerische Namensgebung: Durch die Funktion »Film« kann »Move It!« bis zu 24 Dateien direkt hintereinander laden, wenn die jeweiligen Anfangsbuchstaben der Dateinamen direkt aufeinander folgen. Beispielsweise können Sie die Dateien »A_MANN.MOV«, »B_MANN.MOV« bis »Z_MANN.MOV« auf einen Schlag laden, um mehr als 24 Bilder zu laden, müssen Sie lediglich bei der nach jedem Ladevorgang erscheinenden Alert-Box das »Ja«-Feld anklicken.

Gespeicherte Bilder lassen sich auch einzeln in den Editor einiesen. < F4 > lädt ein Bild von der Diskette und legt es auf die Ablage. Von dort holt es < F6 > auf die Zeichenfläche. Alternativ dazu können Sie es im < F2 >-Untermenü durch die Eingabe von < * > vor die gerade angezeigte Phase kopieren.

Geschlossene Körper mit Hell- beziehungsweise Dunkelgrau zu füllen, gelingt durch das Drücken von < 1 > beziehungsweise <2>. Startpunkt für das Füllen ist dabei die Position des Mauszeigers. Daneben gibt es noch eine Notbremse, die völlig verunglückte Kreationen durch das Leeren der Bildfläche mit <Del> verschwinden läßt.

Zweifellos stellt das Programm schon für sich gesehen einen hohen Reiz dar. Es bereitet einfach Freude, seine Sequenzen zu erweitern, zu kombinieren und festzustellen mit wie wenig Aufwand sich schon brauchbare Filme drehen lassen. Wenn Sie sich aber allein mit Regie und Betrachtung nicht begnügen wollen, dann sollten Sie Ihre Trickfilme in eigene Programme einbauen. In Listing 2 stellen wir Ihnen dazu einige Prozeduren zur Verfügung: »An«, »Ende«, »F4«, »Film«, »Init«, »Mover« und »Parser«.

Allerdings müssen Sie noch einige Änderungen vornehmen, bevor auch in Ihrem Programm die Bilder das Laufen lernen. In der Prozedur »Init« müssen Sie an beliebiger Stelle zwei Zeilen einfügen (wie in Listing 2 bereits geschehen):

Cap%=1 Mov$="A:\TEST\1.MOV"

Ob die Variable »Mov$« nun, wie oben, den Wert »1.MOV« oder irgendeinen anderen Wert annimmt, ist dabei gleichgültig. Jeder Laufwerks-, Ordnerund Dateiname ist gestattet. Nicht gleichgültig ist hingegen die Schreibweise: Der Dateiname muß, wie oben, groß geschrieben sein. Achten Sie zudem darauf, daß die Variable »Mov$« eine vorhandene Datei bezeichnet.

Jetzt sind noch einige Zeilen zu löschen. Zum einen die drei Zeilen der FOR-NEXT-Schleife in der Prozedur »Init«, dann der ALERT-Befehl in »Film« samt den nachfolgenden fünf Zeilen, bis einschließlich des ersten EN-DIF. In der gleichen Prozedur sind auch die Zeile »IF K%«»1« einschließlich der zwei folgenden Zeilen zu löschen.

Die übrigen zu löschenden Zeilen sind leicht gefunden. Alle Aufrufe von Prozeduren, deren Namen exakt drei Buchstaben lang sind, müssen gelöscht werden. Beispiel:
»@Bak(1,2,4)« oder »@Dis(Text$)«.

Sind alle Prozeduren-Aufrufe gelöscht, speichern Sie das so entstandene Programm mit SAVE.A. Dadurch können Sie die Routinen später leicht mit dem Befehl MERGE in eigene Programme einiesen. In Ihrem Hauptprogramm brauchen Sie dann nur die Prozeduren »Init«, »Film« und »An« nacheinander aufzurufen. Ihre Trick-Sequenz läuft dann wenig später über den Bildschirm.

Ein Blick in das Innenleben der drei zentralen Prozeduren soll Ihnen das Einbinden der Routinen weiter erleichtern.

  • Init: Diese Prozedur bestimmt durch die Variablen »U«, »I«, »O« und »P« die Größe und Lage des Bildes. Die Variable »Mov$« steht für das erste zu ladende Bild einer Filmsequenz.
  • Film: Lädt automatisch alle Bild-Dateien, deren Anfangsbuchstaben aufeinander folgen. Den Pfad, Dateinamen sowie dessen Anfangsbuchstaben stellt die Prozedur »Parser« fest. Die Werte für die Anzeigedauer und Bildsprünge werden hier auf 2 beziehungsweise 0 festgesetzt. Indem Sie den Variablen für horizontale Bildsprünge und Anzeigedauer, »Hs(Rm)« und »Gg(Rm)«, neue Werte zuweisen, können Sie die Animationsgeschwindigkeit Ihren Bedürfnissen anpassen.
  • An: Das Kernstück des ganzen Programms. Um eine flackerfreie Animation zu gewährleisten, arbeitet »Move It!« mit einer Bildschirmumschaltung. Während ein Bildschirm angezeigt wird, baut das Programm bereits einen zweiten im logischen Bildschirmbereich (und damit im verborgenen) auf.

Probieren Sie das einmal aus. Sichern Sie zunächst ein vollständig weißes Bild mit < F10 > im RAM. Füllen Sie dann die Zeichenfläche durch das Drücken von < 2 > mit Dunkelgrau, und speichern Sie auch das graue Bild im RAM.

Jetzt ein Testlauf: Drücken Sie < F2 >, dann mehrmals < + >. Sie müßten jetzt, bei genauerem Hinsehen, mehrere Streifen bemerken, die langsam nach oben zu wandern scheinen. Verlassen Sie mit < Enter > das Untermenü und drücken Sie <F8>, die Animationstaste. Starten Sie die Animation, ohne irgendwelche Parameter zu verstellen. Die nun erscheinende Bildabfolge zeigt keinerlei Streifenbildung mehr: der Effekt der Bildschirmumschaltung.

In »Move It!« finden sich zwei grundsätzliche Verfahren, unkomprimierte Bilder zu laden und zu speichern. In der Prozedur »F4« (Bild laden) wird zuerst die Datei »Mov$« geöffnet, dann die leere Variable »Ab$« bereitgestellt, die in ihrer Länge genau der zu ladenden Bild-Datei entsprechen muß.

Die mit BGET beginnende Zeile benötigt als Parameter den Datenkanal, die mit VARPTR ermittelte Anfangsadresse von »Ab$« und die Dateilänge, um das Bild in die Variable »Ab$« einzulesen.

»Move It!« geht in der Prozedur »F5« allerdings einen zweiten Weg, um Bilder zu speichern. Vor dem Speichern sichert das Programm durch den GET-Befehl einen Bildschirmbereich als »Pam$«. BSAVE schreibt das Bild, ohne daß ein Datenkanal geöffnet werden müßte, auf Diskette. »Mov$« steht dabei für den zuvor gewählten Dateinamen, die weiteren Parameter geben die Anfangsadresse und Länge von »Pam$« an.

Mit so mächtigen Werkzeugen gerüstet, steht der selbstverfilmten Tricksequenz — zum Beispiel als Vorspann für Ihre Programme — nun nichts mehr im Wege. (mr)

Steckbrief

Programm: Move It!

Sprache: GFA-Basic
Hardware: alle STs mit S/W-Monitor
Funktion: Animationsprogramm
Eingabezeit: lang

Literatur:

J. Muus, W. Besenthal: Atari-ST-Programmierpraxis GEA-Basic 2.0, Markt & Technik Verlag, Haar bei München, 1987, ISBN 3-89090-435-1, 52 Mark

' MOVE IT! - 01/08/88 ' U. Kreisel. GFA_BAS 2.02 ' (c) Markt&Technik, 8013 Haar ' ST - Magazin Clear @Init @Men_leiste Menu Leiste$() On Menu Gosub Menue Do On Menu Loop Procedure Menue S%=Menu(0) On S% Gosub Info On S%-10 Gosub B_ed,An,Dy,Film On S%-16 Gosub Aus Menu Off Return Procedure Info Alert 1,"MOVE IT!",1,"OK",K% Return Procedure Init Dim Gg(100),H$(100) Dim Z$(100),F$(14) M=99 Ctr=l //MARK U=18 I=90 O=305 P=263 Long=O~U Fa%=2 Lo%=4 G%=1 V%=314 @Sts St$=G$ @Sts T$=G$ For H=1 To 13 Read F$(H) Next H Get 95,220,210,240,Dlt$ Get U,I,O,P,Z$(0) @Bak(1,2,4) 0Log 0Txt @Frb Get 10,270.300.340,Dlt$ Return Procedure Sts G$=Mki$(8)+Mki$(8)+Mki$(1)+Mki$(0)+Mki$(1) For I%=1 To 16 Read Vorn G$=G$+Mki$(0)+Mki$(Vorn) Next 1% Return Procedure B_ed Sn=0 @Bak(1,2,4) @Txt @Cap Jump=0 Put 334,32,Logo$ Pbox U-1,I-1,O+1,P+1 Pbox U+V%-1,I-1,O+V%+1,P+1 Put U+V%,I,Z$(0) Graphmode 2 Deftext 1,0,0,13 For H=1 To 4 Text 332,270+H*16,286,F$(H) Next H Put U,I,Z$(Rm) @Report Repeat @Count Until Sn=3 Return Procedure Count Mouse X,Y,K If K=1 If X>U-1 And X<O+1 And Y>I-1 And Y<P+1 Plot X,Y Endif If Y>350 Jump=Abs(Int((20-X)/60)) Endif Endif Dt$=Inkey$ If Jump=0 And DtS<>"" For Kees=59 To 69 Inc Jump If Dt$=Chr$(0)+Chr$(Kees) Kees=69 Endif Next Kees Endif If Jump>0 And Jump<11 @Abk On Jump Gosub F1,F2,F3,F4,F5,F6,F7,An,Dy,F10 @Report @Abk Endif Jump=0 If Dt$>"0" or Dt$<=Chr$(128) @Det Endif Return Procedure Abk If Jump>0 And Jump<11 @Inv(20+(Jump-1)*60,350,20+(Jump)*60,382) Endif Return Procedure Det If Dt$=Chr$(127) Put U,I,Z$(0) Endif If X>U And X<O And Y>I And Y<P If Dt$="1" Deffill 1,2,2 Fill X,Y Endif If Dt$="2" Deffill 1,2,4 Fill X,Y Endif Endif Return Procedure F1 @Abk @Frb Sn=3 Return Procedure F2 Check$="" Graphmode 2 Deftext 1.0,0,13 For H=5 To 8 Text U,206+H*16,250,F$(H) Next H Do K$=Inkey$ Exit If K$=Chr$(13) Or Rm<=0 E%=Asc(K$) On E%-41 Gosub In,P1,Dy,Dy,K @Report @Cap Put U,I,Z$(G%) Print At(37,18); @Use(G%) Loop Put 18 268,Dlt$ Return Procedure In Inc Ctr Inc Rm For Sh=Ctr To G% Step -1 Z$(Sh)=Z$(Sh-1) Next Sh Get U+314,I,O+314,P,Ab$ @F6 Get U I,O,P,Z$(G%) Return Procedure P1 If G%=1 Rz=0 Endif Tf G%=Rm Rz=1 Endif If Rz=1 G%=1 //MARK Else Inc G% Endif Return I Procedure K Z$(G%)="" For Ix=G To Rm Z$(Ix)=Z$(Ix+1) Next Ix Dec Ctr Dec Rm Dec G% If G%<=0 G%=1 Endif Return Procedure F3 Pause U Graphmode 3 While Mousek=0 Wend Mouse X%,Y%,T% Do Mouse X1%,Y1%,T% Box X%,Y%,X1%,Y1% Box X%,Y%,X1%,Y1% Exit If T%=0 Loop Get X%,Y%,X1%,Y1%,Cp$ Le=Abs (X1%-X%) Ht=Abs(Y1%-Y%) Do Mouse X,Y,K Vsync Box X-Le,Y-Ht,X,Y Box X-Le,Y-Ht,X,Y If K=1 And X-Le>U-1 And X-Le<0+1-Le And (Y-Ht)>I-1 And (Y-Ht) <P+1-Ht Put X-Le,(Y-Ht),Cp$,3 Endif Exit If K=2 Loop Graphmode 1 Return Procedure F4 @Lad If Exist(Mov$) Open "I",#1,Mov$ Ab$=Space$(Lof(#1)) Bget #1,Varptr(Ab$),Lof(#1) Close #1 If V%=314 Put U+V%,I,Ab$ Endif Else Out 2,7 Endif Return Procedure F5 Local Pam$ @Lad If Mov$>"" And Mov$>"\" Get U,I,O,P,Pam$ Bsave Mov$,Varptr(Pam$),Len(Pam$) @Dis("BILD GESPEICHERT.") Pause 50 Endif Return Procedure Lad Dt$="" Repeat Until Mousek=0 Fileselect "\*.MOV","",Mov$ Return Procedure F6 Put U,I,Ab$ Return Procedure F7 Get U,I,O,P,Ab$ Put U+V%,I,Ab$ Return Procedure F10 If Rm<M If Cap%=<0 Alert 3 "RAM voll.|RAM löschen?|",2,"LÖSCHE|WEITER",D% If D%=1 @Pic Goto Ade Else Goto Ade Endif Endif Inc Rm Inc Ctr Get U,I,O,P,Z$(Rm) Hs(Rm)=2 Gg(Rm)=0 Ade: @Cap Pause 10 Endif Return Procedure An If Rm>0 @Bak(1,2,4) @Txx @Spe @Bak(1,Fa%,Lo%) For Yx=1 To Rm If Not Even(Hs(Yx)) And Fa%=2 Inc Hs(Yx) Endif Next Yx @Dis("[*] <- -> [+][-]: auf/ab") Sget S$ Pos=591-Long Pop=1 Repeat On Break Gosub Ende Mem%=Fre(Xt) Reserve 2000 Ad=Gemdos(&H48.L:32768) Bd=Xbios(&H2) A=Xbios(&H5,L:Ad,L:Bd,-1) Cls Repeat A=Xbios(&H5,L:Ad,L:Bd,-1) @Mover A=Xbios(&H5,L:Bd,L:Ad,-1) @Mover Bew$=Inkey$ If Bew$>Chr$(41) If Bew$="*" If R1=1 Rl-2 Else R1=1 Endif Endif If Bew$="+" Sub Hi,2 Endif If Bew$="-" Add Hi,2 Endif Endif Until Bew$>Chr$(64) @Ende Sn=3 Until Sn=3 Endif Return Procedure Mover Sput S$ If R1=1 Pos=Pos+Hs(Pop) Else Pos=Pos-Hs(Pop) Endif Put Pos,I+Hi,Z$(Pop) Pause Gg(Pop) If Pop=Rm Pop=0 Endif Inc Pop If Pos<=-Long Or Pos=>640 If R1=1 Pos=-Long+1 Else Pos=640 Endif Endif Return Procedure Film V%=0 @Dis("ERSTES BILD?") Was : @F4 If Right$(Mov$,4)=".MOV" If K%<>1 @Pic Endif Inc Rm Inc Ctr Z$(Rm)=Ab$ Ab$="" Hs(Rm)=2 Gg(Rm)=0 @Cap @Parser @Dis(Path$+Chr$(It)+File$) Pause 30 Do Exit If It=>90 Or It=57 Or Cap%<=0 Inc It Dfil$=Path$+Chr$(It)+File$ Exit If Not Exist(Dfil$) @Dis(Dfil$) Open "I",#1,Dfil$ Inc Rm Inc Ctr Z$(Rm)=Space$(Lof(#1)) Bget #1,Varptr(Z$(Rm)),Lof(#1) Hs(Rm)=2 Gg(Rm)=0 @Cap Close #1 Loop Alert 2,"Weitere Bilder laden?",2,"JA|NEIN",K% If K%=1 Goto Was Else @Dis("ANIMATION WÄHLEN") Endif Endif V%=314 Return Procedure Parser n%=5 If Instr(Mov$,"\")=0 Mov$="\"+Mov$ Endif While Left$(Right$(Mov$,N%))<>"\" Inc n% Wend Path$=Left$(Mov$,Len(Mov$)-N%+1) File$=Right$(Mov$,N%-2) It=Asc(Left$(Right$(Mov$,N%-1))) Return Procedure Pic For Q=1 To M Z$(Q)="" Next Q S$="" Rm=0 Ctr=1 @Cap Return Procedure Dis(Disp$) Print Chr$(27);"p"; Wt=Abs((Len(Disp$)+2)-35) Print At(3,4);Spc(2);Disp$;Spc(Wt); Print Chr$(27);"q"; Return Procedure Frb Graphmode 2 Deffill 1,2,1 Pbox 20,350,620,382 Graphmode 1 Return Procedure Spe @Zeig Do If Mousek<>0 If Mousey>350 Jump=Abs(Int((20-Mousex)/60)) @Abk On Jump Gosub Farbe Pas,Pixel,Re @Abk If Mousex>259 Goto Raus Endif Endif If Mousex>30 And Mousex<=626 Ys=Int(Mousey/16)+1 Offset=Int(Ys/6.2) Ex=Int(Mousex/24)+Offset*25 Key=Mousek @Where(Key) Endif Endif Exit If Inkey$=Chr$(13) Loop Raus: Jump=0 Return Procedure Zeig Za=1 L=4 Pct=0 For Vals=5 To Rm*3+10 Step 3 Print Chr$(27);"p" Print At(Vals,L-1); @Use(Pct) Print Chr$(27):"q" Print At(Vals,L+1); @Use(Hs(Za)) Print At(Vals.L); @Use(Gg(Za)) Inc Za If Za=26 Or Za=51 Or Za=76 Vals=2 L=L+5 Endif If Za=>100 Or Za>Rm Vals=309 Endif Print At(3,L);"D"; Print At(3.L+1);"P"; Inc Pct Next Vals Return Procedure Farbe Pause 10 @Abk If Fa%=0 Fa%=2 Lo%=4 @Ky(0,3,"GRAU ") Else Fa%=0 Lo%=0 @Ky(0,3,"WEISS") Endif @Abk Return Procedure Pas While Pas<Rm+1 And Gg(Pas)<99 Inc Gg(Pas) Inc Pas Wend @Zeig Pas=1 Return Procedure Pixel While Px<Rm+1 And Hs(Px)<99 Inc Hs(Px) Inc Px Wend @Zeig Px=1 Return Procedure Re For Re=1 To Rm Hs(Re)=Abs(Hs(Re)-l) Gg(Re)=Abs(Gg(Re)-1) Next Re @Zeig Return Procedure Where(Kee) If Ex<=Rm If Ys=4 Or Ys=9 Or Ys=14 Or Ys=l9 Idx=4 Vv=Gg(Ex) @Cal(Kee,Vv) @Zeig Endif If Ys=5 Or Ys=10 Or Ys=15 Or Ys=20 Idx=5 Vv=Hs(Ex) @Cal(Kee,Vv) @Zeig Endif Endif Return Procedure Cal(Kee.Vv) If Kee=1 Inc Vv Else Dec Vv Endif If Vv>98 Vv=M Endif If Vv<=0 Vv=0 Endif If Idx=4 Gg(Ex)=Vv Endif If Idx=5 Hs(Ex)=Vv Endif Return Procedure Tasten Graphmode 1 Deffill 1,0,0 X%=20 Y%=350 Lg%=60 Hh%=32 For Box=1 To 10 Pbox X%,Y%,X%+Lg%,Y%+Hh% Add X%,Lg% Next Box Return Procedure Ky(Ff%,Yb%,Tx$) Deftext 1,0,0,4 Text 24+Ff%*Lg%,353+Yb%*6,Tx$ Return Procedure Txt @Tasten @Ky(0,1,"HAUPT") @Ky(0,2,"MENÜ") @Ky(0,3,"EIN") @Ky(1,1,"BILD") @Ky(1,2,"AUF-") @Ky(1,3,"RUFEN") @Ky(2,1,"CLIP-") @Ky(2,2,"MODUS") @Ky(2,3,"EIN") @Ky(3,1,"BILD") @Ky(3,2,"VON DISK") @Ky(3,3,"LADEN") @Ky(4,1,"BILD") @Ky(4,2,"AUF DISK") @Ky(4,3,"SPEI-") @Ky(4,4,"CHERN") @Ky(5,1,"BILD") @Ky(5,2,"VON") @Ky(5,3,"ABLAGE") @Ky(5,4,"HOLEN") @Ky(6,1,"BILD") @Ky(6,2,"AUF") @Ky(6,3,"ABLAGE") @Ky(6,4."LEGEN") @Ky(7,1,"ANIMATION") @Ky(9,1,"BILD") @Ky(9,2,"IM") @Ky(9,3,"RAM") @Ky(9,4,"SICHERN") Return Procedure Txx @Tasten @Ky(0,1,"HINTER-") @Ky(0,2,"GRUND") @Ky(1,1,"ANZEIGE-") @Ky(1,2,"DAUER") @Ky(1,4,"+1") @Ky(2,1,"PIXEL") @Ky(2,4,"+1") @Ky(3,1,"DAUER") @Ky(3,2,"UND") @Ky(3,3,"PIXEL") @Ky(3,4,"-1") @Ky(4,1,"START DER") @Ky(4,2,"ANIMATION") @Ky(4,4,"(RETURN)") Return Procedure Bak(B,N,M) Graphmode 1 Deffill B,N,M Pbox -1,18,640,400 Return Procedure Use(Aw%) Print Using "##",Aw% Return Procedure Inv(X1%,Y1%,X2%,Y2%) Graphmode 3 Deffill 1,2,8 Pbox X1%+1,Y1%+1,X2%-1,Y2%-1 Graphmode 1 Return Procedure Report @Dis("Bild "+Str$(Rm)+" im RAM, in Arbeit: "+Str$(Ctr)) Return Procedure Cap Iou=Fre(Mmy%) Cap%=Int((Iou-80000)/6270) Print At(64.1);"Kapazität: " Print Using "###",Cap% Return Procedure Log C=106 Put V%,I,Dlt$ Sprite St$,400,99 Sprite T$,416.99 Draw 391,101 To V%,101 To V%,C To 391,C Deftext 1,17,0,13 Text 370,122 , "68oooer " Deffill 1,2,4 Fill 404,97 Fill V%,90 Graphmode 2 Deftext 1,0,0,13 Text 430,C,100,"MAGAZIN" Text V%,94,"11/88" Text V%,202,215." präsentiert" Text V%,P,215,"U. Kreisel/ Markt&Technik '88" Deftext 1,0,0,26 Text V%,240,220,"MOVE IT!" Get V%,80,530,130,Logo$ Return Procedure Dy Return Procedure Ende A=Xbios(&H5,L:Bd,L:Bd,-1) A=Gemdos(&H49,L:Ad) Reserve Mem Return Procedure Aus Edit Return Data 8191,8192,16384,32768,32768,32895,32896 Data 16480,12313,2053,63490,2,2,2,4,65535 Data 65535,1,1,2,2,32894,32896,32896 Data 256,256,512,512,512,512,1024,64512 Data [Linke Maustaste] ZEICHNEN Data [Del] .. ZEICHENFLÄCHE LEEREN Data [1][2] GRAU/DUNKELGRAU FÜLLEN Data [F3] ...........CLIPMODUS Data [+] ............Phase? Data [Enter].........Zurück Data [.] ............Phase löschen Data [*].............Ablagebild einfügen Procedure Men_leiste Dim Leiste$(20) Restore Mendat For I%=0 To 20 Read Leiste$(I%) Exit If Leiste$(I%)="***" Next I% Leiste$(I%)="" Leiste$(I%+1)="" Mendat: Data Info, MOVE IT! Data ----------------- Data -1,-2,-3,-4,-5,-6,"" Data Funktion, Editor, Animation Data --------------, Film."" Data Ende, Ende, "" Data *** Return

Listing 1. »Move It« — Das schnelle Animationsprogramm für Zeichentrickfilme »aus dem Handgelenk«

' Modul zur Einbindung ' von Animationssequenzen ' U. Kreisel 01/08/88 ' * Alle verwendeten Prozeduren stammen aus "Move It!" ' Stop durch Buchstabentaste ' ST-Magazin 1988/89 ' ' Hauptprogramm @Init @Film @An ' ' Ende Hauptprogramm ' Procedure Init Cap%=1 Mov$="A:\VOGEL\A_VOGEL.MOV" Dim Gg(100),Hs(100) Dim Z$(100),F$(14) M=99 Ctr=1 U=18 1=90 O=305 P=263 Long=O-U Fa%=2 Lo%=4 G%=1 V%=314 St$=G$ T$=G$ Get 95,220,210,240,Dlt$ Get U,I,O,P,Z$(0) Get 10,270,300,340,Dlt$ Return Procedure F4 If Exist(Mov$) Open "I",#1,Mov$ Ab$=Space$(Lof(#1)) Bget #1,Varptr(Ab$) Lof(#1) Close #1 If V%=314 Put U+V%,I,Ab$ Endif Else Out 2,7 Endif Return Procedure An If Rm>0 For Yx=1 To Rm If Fa%=2 And Not Even(Hs(Yx)) Inc Hs(Yx) Endif Next Yx Sget S$ Pos=591-Long Pop=1 Repeat On Break Gosub Ende Mem%=Fre(Xt) Reserve 2000 Ad=Gemdos(&H48,L:32768) Bd=Xbios(&H2) A=Xbios(&H5,L:Ad.L:Bd,-1) Cls Repeat A=Xbios(&H5,L:Ad,L:Bd,-1) @Mover A=Xbios(&H5,L:Bd,L:Ad,-1) @Mover Bew$=Inkey$ If Bew$>Chr$(41) If Bew$="*" If R1=1 R1=2 Else R1=1 Endif Endif If Bew$—"+" Sub Hi,2 Endif If Bew$="-" Add Hi.2 Endif Endif Until Bew$>Chr$(64) @Ende Sn=3 Until Sn=3 Endif Return Procedure Mover Sput S$ If R1=1 Pos=Pos+Hs(Pop) Else Pos=Pos-Hs(Pop) Endif Put Pos,I+Hi,Z$(Pop) Pause Gg(Pop) If Pop=Rm Pop=0 Endif Inc Pop If Pos<=-Long Or Pos=>640 If R1=1 Pos=-Long+1 Else Pos=640 Endif Endif Return Procedure Film V%=0 Was: @F4 If Right$(Mov$,4)=".MOV" Inc Rm Inc Ctr Z$(Rm)=Ab$ Ab$="" Hs(Rm)=2 Gg(Rm)=0 @Parser Pause 30 Do Exit If It=>90 Or It=57 Or Cap%<=0 Inc It Dfil$=Path$+Chr$(It)+File$ Exit If Not Exist(Dfil$) Open "I",#1,Dfil$ Inc Rm Inc Ctr Z$(Rm)=Space$(Lof(#1)) Bget #1,Varptr(Z$(Rm)),Lof(#1) Hs(Rm)=2 Gg(Rm)=0 Close #1 Loop Endif V%=314 Return Procedure Parser N%=5 If Instr(Mov$,"\")=0 Mov$="\"+Mov$ Endif While Left$(Right$(Mov$,N%))<>"\" Inc N% Wend Path$=Left$(Mov$,Len(Mov$)-N%+1) File$=Right$(Mov$,N%-2) It=Asc(Left$(Right$(Mov$,N%-1))) Return Procedure Ende A=Xbios(&H5,L:Bd,L:Bd,-1) A=Gemdos(&H49,L:Ad) Reserve Mem% Return

Listing 2. Mit diesen Routinen lernen auch in Ihren Progammen die Bilder das Laufen

Uwe Kreisel