Hallo zusammen,
ich habe gestern eine kleine Animation programmiert, die ich hier zur Verfügung stelle.
Code
link graphics, # Einbinden der graphics-Library
turtle # Einbinden der turtle-Library
global Breite, # Bildschirmbreite
Hoehe, # Bildschirmhoehe
canvas_list # Liste der Zeichenoberflaechen
procedure rotate(deltaw)
initial
{ WOpen( "canvas=hidden", # Verborgenes Fenster
"pos=0,0", # Ursprung Links-Oben im Bildschrim
"size=" || Breite || "," || Hoehe, # MAximale Groesse
"label=Animiertes Rad") # Fenstertitel
}
TReset() # Turtle-Reset
every i := 0 to 15 * Breite / 500 do # Zeichnet Reifen in Graustufen
{ f := 65536 * i * 500 / 16 / Breite
Fg(f || "," || f || "," || f)
TFCircle(Breite / 2 - i)
}
Fg("black")
TFCircle(Breite / 2 - i) # schwarzer Kreis
Fg("white")
TFCircle(Breite / 2 - i - 2) # weißer Kreis
every w := 0 to 360 by 45 do
{ WAttrib("linewidth=" || 8 * Breite / 500) # Beeite der Speichen
Fg("blue")
TGoto(Breite / 2,Hoehe / 2, w + deltaw) # Mittelpunkt des Rades
TDraw(Breite / 4 - i * 5 /6) # zeichnet Speiche
WAttrib("linewidth=" || 2 * Breite / 500) # Breite reflektierende Mitte der Speiche
Fg("yellow")
TGoto(Breite / 2, Hoehe / 2,w + deltaw) # Mittelpunkt des Rades
TDraw(Breite / 4 - i + 2) # reflektierende Mitte der Speiche
}
THome() # Turtle: Ausgangsposition
Fg("yellow")
TFCircle(Breite / 10) # gelber Kreis um Radachse
Fg("black")
TFCircle(Breite / 20) # schwarzer Kreis als Radmitte
delay(20)
end
procedure animate()
every i := 1 to 45 do
{ CopyArea(canvas_list[i], &window) # kopiert Inhalt der verborgenen Zeichenoberflächen auf das sichtbare Fenster
delay(10)
}
end
procedure main()
canvas_list := list(45) # Liste der Zeichenoberflaechen
if WOpen("canvas=maximal") then # ermittelt die maximale Bildschirmgroesse
{ Breite := WAttrib("displaywidth")
Hoehe := WAttrib("displayheight")
WClose()
}
else stop(56) # Abbruch, falls das Fenster nicht geoeffnet werden kann
every i := 0 to 44 do # Erzeugung des Rades in 45 Einzelbildern im Abstand von 1 °
{ rotate(i)
canvas_list[1 + i] := WOpen("size=" || Breite || "," || Hoehe,"pos=1,1","canvas=hidden")
CopyArea(&window, canvas_list[1 + i]) # Kopieren der verborgenen Zeichenoberflaeche in die Liste der Zeichenoberflaechen
}
WAttrib("canvas=maximal") # Macht Fenster sichtbar
WAttrib("pos=1,1") # Bringt Fenster in linke obere Ecke
repeat
{ animate() # Animation ablaufen bis
if WQuit(&window) then break # eine Beendigungsereignis eintritt
}
every WClose(!canvas_list[1 to 45]) # Jedes Fenster der verborgenen Zeichenoberflaechen loeschen
end
Alles anzeigen
Viel Spaß damit!
Andreas