Animation & Musik

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Snowdragon

Betreff: Animation & Musik

BeitragDo, Jun 05, 2014 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,

ich habe da mal 2 Fragen, die mir momentan Kopfzebrechen bereiten.

1: Was ist der einfachste Weg, eine animierte Gif-Datei darzustellen?
Neben meinem Textfenster im Spiel soll sich nämlich eine Person befinden und das Bild dieser Person soll auf und ab wippen, was ich mit einer Gif-Datei umgesetzt habe.

2: Ich verwende für einzelne abschnitte verschiedene Musik und momentan bekomme ich es nicht auf die Reihe, das vorherige Lied abzuschalten.

In der Hilfe steht unter PlayMusic: Der Parameter "modus" steht in Blitzbasic (B2D) und B3D nicht zur Verfügung.

Hat da jemand eine Idee?

Spark Fountain

BeitragFr, Jun 06, 2014 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
zu 1) Gif-Dateien scheinen mit BlitzBasic nicht zu funktionieren (hab ich gerade probiert). Du kannst aber stattdessen die Einzelbilder einer Animation als "Filmstreifen" abspeichern, also als ein Bild, das aus mehreren Teilbildern hintereinander besteht. Dann lädst du den Streifen mit LoadAnimImage und kannst mit DrawImage angeben, welches Einzelbild (Frame) dargestellt werden soll (das ist der vierte Parameter, hinter der y-Koordinate). Um die Bilder kontinuierlich in einer Schleife abzuspielen, kannst du zum Beispiel schreiben
BlitzBasic: [AUSKLAPPEN]
DrawImage(gifAnimation, x, y, (MilliSecs() Mod 250) / 250)

wenn die Animation vier Einzelbilder hat. Sonst kannst du beide Parameter anpassen (probier einfach ein bisschen rum).

zu 2) Anstelle von PlayMusic (welches ich persönlich recht hässlich finde) solltest du deine Musikdatei lieber mit LoadSound laden. Dann legst du dir am besten eine Channel-Variable an und spielst darin jeweils das Lied ab, was du für einen bestimmten Abschnitt haben möchtest. Etwa so:
BlitzBasic: [AUSKLAPPEN]
Global channel
Global musik1 = LoadSound("musik1.wav")
Global musik2 = LoadSound("musik2.wav")
; ...

If Not ChannelPlaying(channel) Then
Select abschnitt
Case 1 : channel = PlaySound(musik1)
Case 2 : channel = PlaySound(musik2)
; ...
End Select
EndIf


Viel Erfolg weiterhin!
Gewinner der MiniBCC's #11, #13 und #28
 

Snowdragon

BeitragFr, Jun 06, 2014 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Besten Dank! Wink

Eingeproggt

BeitragFr, Jun 06, 2014 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
GIFs kann man in BB mit den Movie-Befehlen nutzen, siehe OpenMovie und co.
Auch wenn die Sache mit den Teilbildern und LoadAnimImage gebräuchlicher ist.

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

DAK

BeitragFr, Jun 06, 2014 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Movie-Befehle geben einem deutlich weniger Kontrolle, was das genaue Abspielverhalten angeht. Sie sind hald eigentlich nur für Filme gedacht.
So kannst du bei einem Movie nicht die Abspielgeschwindigkeit ändern, und auch vor- und zurückspulen geht nicht.
Außerdem müssen solche Movies immer komplett am Bildschirm sein, dürfen also nicht teilweise aus dem Bild rausschauen. Auch ignorieren sie die Befehle ViewPort und Origin.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragFr, Jun 06, 2014 15:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Liegt es an der Rechenleistung oder den Einstellungen, oder warum "ruckelt" es selbst bei kleinen Animationen mit 4 Frames.

DAK

BeitragFr, Jun 06, 2014 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Dafür müsste man deinen Code sehen. Meine Kristallkugel hat grad keinen Empfang Wink

Verwendest du GIF-Movies oder AnimImages? Bei Ersterem hast du immer eine fix eingestellte Animationsgeschwindigkeit, die im GIF vorgegeben ist. Die ist unabhängig davon, wie schnell dein Programm rennt.
Verwendest du AnimImages, dann machst du was grob falsch, wenn du keine 4 FPS zusammen kriegst.

Wenn du nur 4 Animations-Frames hast, dann kann deine Animation nicht sehr glatt sein.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragSa, Jun 07, 2014 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs mal mit 16 Frames ausprobiert.
Aber das ist nicht so wichtig, ich setze mich später damit genauer auseinander.

Code: [AUSKLAPPEN]
Graphics 1600,1000, 0, 2      ;Graphikmodus setzen
SetBuffer BackBuffer()   ;Doublebuffering vorbereiten
   
While Not KeyHit( escape_key )   
   gifAnimation = LoadAnimImage("Ball.jpg", 100, 200, 0, 16)
   DrawImage(gifAnimation, x, y, (MilliSecs() Mod 100) / 10) ; Hier habe ich mit den 100 und 10 herumgespielt
    Flip
Wend

End
  • Zuletzt bearbeitet von Snowdragon am Sa, Jun 07, 2014 16:42, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Jun 07, 2014 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Dir fehlt ein bisschen Verständnis für Modulo: "var Mod 100" gibt dir den Rest der Division "var/100" - also bekommst du einen Wertebereich von 0 bis 99. Das macht aber als Angabe für den Frame keinen Sinn, da der bei dir bei 0 bis 15 liegt.
Was ich eher machen würde, ist den Frame per hand hoch zu zählen:
BlitzBasic: [AUSKLAPPEN]
frame = (frame + 1) Mod 16

Sobald der Frame das maximum überschreitet, fängt er wieder bei null an. Um das ganze Zeitlich zu steuern, baut man sich einen Timer um den Ausdruck herum:
BlitzBasic: [AUSKLAPPEN]
If timer < MilliSecs() Then   ; Ist die aktuelle Zeit weiter vorangeschritten, als die Variable?
timer = MilliSecs() + 500 ; Setze die Variable eine halbe Sekunde in die Zukunft

; Diese Aktion wird also einmal alle 500ms ausgeführt:
frame = (frame + 1) Mod 16

EndIf


Dann vergiss noch Print (schreibt nur in den Frontbuffer) und arbeite nur mit Text.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

DAK

BeitragSa, Jun 07, 2014 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Print: In BlitzPlus kann man Print schon verwenden, da es dort auf die Konsole schreibt, und gar nicht ins Grafikfenster.
Gewinner der 6. und der 68. BlitzCodeCompo

Eingeproggt

BeitragSa, Jun 07, 2014 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn wir uns nochmal kurz auf diesen Code beziehen:

Code: [AUSKLAPPEN]
While Not KeyHit( escape_key )   
   gifAnimation = LoadAnimImage("Ball.jpg", 100, 200, 0, 16)
   DrawImage(gifAnimation, x, y, (MilliSecs() Mod 100) / 10) ; Hier habe ich mit den 100 und 10 herumgespielt
    Flip
Wend


Dann sticht einmal ins auge, dass LoadAnimImage innerhalb der Schleife ausgeführt wird. Das belastet den PC sehr stark, wenn er 60mal in der Sekunde ein Bild in den Speicher holen soll. Unbedingt vor der Hauptschleife laden.

Dieser Punkt und die Berechnung mit Mod wie von Xeres erklärt sollten fürs Erste alles sein was du brauchst um die Animation flüssig zu bekommen.

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group