4 Stimmen

iOS-Bild für Bild-Animation, per Skript

Es gibt ein paar SO-Fragen zur Frame-by-Frame-Animation (z. B. Frame-by-Frame-Animation und andere ähnliche Fragen), aber ich habe das Gefühl, dass meine anders ist, also fange ich an.

Dies ist teilweise eine Design-Frage von jemandem mit sehr wenig iOS-Erfahrung.

Ich bin mir nicht sicher, ob "Bild für Bild" die richtige Beschreibung dessen ist, was ich tun möchte, also lassen Sie mich das beschreiben. Im Grunde habe ich ein "Skript" eines Animationsfilms und möchte dieses Skript abspielen.
Dieses Skript ist eine json-Datei, die eine Reihe von Szenen beschreibt. In jeder Szene gibt es einige Elemente wie ein Hintergrundbild, eine Liste der Schauspieler mit ihren Positionen und einen Hintergrund-Soundclip. Außerdem gibt es für jeden Schauspieler und Hintergrund eine Bilddatei, die ihn darstellt. (es ist ein bisschen komplexer - jeder Schauspieler hat ein "Verhalten", wie er blinzelt, wie er spricht usw.). Meine Aufgabe ist es also, das vorgegebene Skript zu befolgen, das die Schauspieler und den Hintergrund referenziert, und bei jedem Frame die Schauspieler an der richtigen Stelle zu platzieren, den richtigen Hintergrund zu zeichnen und die Sounddatei abzuspielen.
Der Film kann angehalten, vor- oder zurückgescrollt werden, ähnlich wie bei der Videoplayer-Funktion von YouTube.
Die meisten Fragen, die ich gesehen habe und die sich auf die Frame-by-Frame-Animation beziehen, haben andere Anforderungen als ich (ich werde später noch einige Anforderungen auflisten). Sie schlagen normalerweise vor, Folgendes zu verwenden animationImages Eigenschaft einer UIImageView . Das ist gut für die Animation einer Schaltfläche oder eines Kontrollkästchens, aber sie alle gehen davon aus, dass es eine kurze und vordefinierte Reihe von Bildern gibt, die abgespielt werden müssen.
Wenn ich mit animationImages arbeiten würde, müsste ich alle Bilder im Voraus erstellen, und meine reine Vermutung ist, dass es nicht skalierbar ist (denken Sie an 30fps für eine Minute, Sie erhalten 60*30=1800 Bilder. Außerdem scheinen die Scrub- und Pause/Play-Fähigkeiten in diesem Fall eine Herausforderung zu sein).

Ich suche also nach dem richtigen Weg, dies zu tun. Mein Instinkt sagt mir, dass es wahrscheinlich drei oder vier Hauptwege gibt, um dies zu erreichen.

  1. Durch die Verwendung von Core Animations und die Definition von "Keypoints" und animierten Übergängen zwischen diesen Keypoints. Wenn zum Beispiel ein Akteur zum Zeitpunkt t1 an Punkt A und zum Zeitpunkt t2 an Punkt B sein muss, dann muss ich nur noch den dazwischen liegenden Punkt animieren. Ich habe in der Vergangenheit etwas Ähnliches in ActionScript gemacht, und es war nett, aber es war besonders schwierig, die Scrub-Aktion zu implementieren und alles synchron zu halten, daher bin ich kein großer Fan dieses Ansatzes. Stellen Sie sich vor, Sie müssen eine Pause in der Mitte einer Animation implementieren oder einen Scrub in der Mitte einer Animation. Das ist machbar, aber nicht angenehm.
  2. Setzen Sie einen Timer für z.B. 30 Mal pro Sekunde und konsultieren Sie bei jedem Tick das Modell (das Modell ist die Skript-Json-Datei zusammen mit der Beschreibung der Akteure und der Hintergründe) und zeichnen Sie, was zu diesem Zeitpunkt gezeichnet werden muss. Verwenden Sie die API von Quartz 2D und drawRect. Dies ist wahrscheinlich der einfachste Ansatz, aber ich habe nicht genug Erfahrung, um zu sagen, wie gut es auf verschiedenen Geräten funktionieren wird, wahrscheinlich CPU-mäßig, es hängt alles von der Menge der Berechnungen ab, die ich bei jedem Tick machen muss, und von der Menge an Aufwand, die ios braucht, um alles zu zeichnen. Ich habe keine Ahnung.
  3. Ähnlich wie bei 2, aber mit OpenGL zum Zeichnen. Ich bevorzuge 2 b/c die API ist einfacher, aber vielleicht Ressourcen weise OpenGL ist besser geeignet.
  4. Verwenden Sie einen Spielrahmen wie cocos2d die ich noch nie benutzt habe, die aber mehr oder weniger ähnliche Probleme zu lösen scheint. Sie scheinen eine nette API zu haben, so dass ich froh wäre, wenn ich alle meine Anforderungen von ihnen beantwortet bekommen könnte.

Zusätzlich zu den Anforderungen, die ich gerade beschrieben habe (Abspielen eines Films anhand seiner "Skript"-Datei und einer Beschreibung der Schauspieler, Hintergründe und Töne), gibt es eine weitere Reihe von Anforderungen -

  • Der Film muss im Vollbildmodus oder im Teilbildmodus abgespielt werden (wobei der Rest des Bildschirms für andere Bedienelemente verwendet wird)
  • Ich fange mit dem iPhone an, wobei natürlich ein iPad folgen sollte.
  • Ich würde gerne eine Miniaturansicht dieses Films für die Verwendung auf dem Telefon erstellen (in einer Galerie in meiner Anwendung anzeigen). Die Miniaturansicht kann nur das erste Bild des Films sein.
  • Ich möchte das Ergebnis als Film "exportieren" können, etwas, das leicht auf youtube oder facebook hochgeladen werden kann.

Die große Frage ist also, ob eine der vorgeschlagenen 1-4 Implementierungen, die ich im Kopf habe (oder andere, die Sie vorschlagen könnten), einen solchen Film irgendwie exportieren kann.
Wenn alle vier an der Aufgabe des Filmexports scheitern, habe ich eine Alternative im Sinn. Die Alternative ist, einen Server zu verwenden, auf dem ffmpeg läuft und der ein Bündel aller Filmbilder annimmt (ich müsste sie auf dem Telefon zeichnen und sie nach ihrer Reihenfolge auf den Server hochladen), und dann würde der Server alle Bilder mit ihrem Soundtrack zu einem einzigen Film kompilieren.
Natürlich, um die Dinge einfach zu halten, würde ich es vorziehen, diese Server-less zu tun, d.h. in der Lage sein, den Film aus dem iPhone zu exportieren, aber wenn das zu viel zu fragen, dann die letzte Anforderung wäre zumindest in der Lage sein, die Menge aller Bilder (Keyframes im Film) zu exportieren, so dass ich sie bündeln und auf einen Server hochladen kann.

Die Länge des Films soll ein oder zwei Minuten betragen. Ich hoffe, dass die Frage nicht zu lang war und dass sie klar ist...

Danke!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X