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.
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
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