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


Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]