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

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

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
Aus: ST-Magazin 11 / 1988, Seite 137

Links

Copyright-Bestimmungen: siehe Über diese Seite