Frage

Ich arbeite an einem Spiel, in dem ich den Player Blick auf einer Ebene lassen muß (beispielsweise eine Wand) durch eine Linse (beispielsweise ein Vergrößerungsglas). Das Spiel ist auf dem iPhone laufen zu lassen, so dass meine Entscheidungen sind Core Animation oder OpenGL ES.

Meine erste Idee (das habe ich noch nicht ausprobiert) ist dies mit Core Animation zu tun.

  1. Erstellen Sie die Wand und Gegenstände darauf CALayers verwenden.
  2. Verwenden Sie CALayer die renderInContext: Verfahren ein Bild von der Wand als Hintergrundebene zu erstellen.
  3. Schneiden Sie das Bild auf die Linsenform, skalieren, dann es über den Hintergrund ziehen.
  4. Zeichnen Sie die Linsenrahmen und „glänzendes Glas“ Schicht oben auf das alles.

Weitere Informationen:

  • Ich bin viel besser vertraut mit Core Animation als OpenGL, vielleicht gibt es eine viel bessere Möglichkeit, dies mit OpenGL zu tun. (Bitte sagen Sie mir!)
  • Wenn ich CALayers verwende, die nicht auf eine Ansicht gebunden sind, muss ich mir alle Animationen verwalten? Oder gibt es eine einfache Möglichkeit, sie manuell ausführen?
  • 3D-Perspektive ist nicht wichtig; Ich bin nur eine flache Wand vergrößert.
  • Ich bin besorgt darüber, dass vor allem der dabei für flüssige Animation zu langsam sein wird.

Bevor ich eine Menge Code zu schreiben diese verpflichten, meine Frage ist Sehen Sie irgendwelche Fallen im Plan oben oder können Sie einen einfacheren Weg empfehlen, dies zu tun?

War es hilfreich?

Lösung

Das ist, wie ich es tun würde, es klingt wie ein guter Plan.

Ob Sie OGL oder CA das Grundprinzip ist das gleiche, so würde ich mit Stick, was Sie sich wohler mit.

  1. Identifizieren Sie die Region, die Sie wünschen, um zu vergrößern
  2. Render diese Region zu einer separaten Oberfläche
  3. Render jede Grenze / Overlay auf der Oberfläche
  4. Machen Sie Ihre Oberfläche, auf der Hauptszene vergrößert, entsprechend Clipping.

In Bezug auf Leistung müssen Sie es versuchen und sehen (nur sicherstellen, dass Sie auf aktuelle Hardware zu testen, weil der Simulator weit schneller als die Hardware ist). Wenn es langsam an, dann können Sie sehen Schritte bei tun 2/3 weniger häufig, beispiels alle 2-3 Frames. Dies wird eine gewisse Vergrößerung Verzögerung geben, aber es kann durchaus akzeptabel sein.

Ich vermute, dass die Leistung zwischen OGL / CA etwa gleichwertig sein. CA ontop der OGL Bibliotheken gebaut wird, aber Ihre Kosten werden das eigentliche Rendering zu tun, nicht die Zeit, in den Schichten ausgegeben.

Andere Tipps

Ich habe eine Lupe auf dem iPhone mit einem UIView implementiert. CA war viel zu langsam.

Sie können einen CGImage in eine UIView ziehen unter Verwendung ihrer drawRect Methode. Hier werden die Schritte in meinem drawRect:

  1. erhält den aktuellen Kontext
  2. einen Pfad erstellen zum Aufstecken der Ansicht (Kreis)
  3. skalieren, um die aktuelle Transformationsmatrix (CTM)
  4. bewegen Sie die aktuelle Transformationsmatrix
  5. ziehen die CGImage

Sie haben die CGImage prerendered, dann ist es in den Grafikspeicher. Wenn Sie etwas dynamischer wollen, ist es von Grund auf neu ziehen, anstatt eine CGImage greifen zu können.

Sehr schnell, sieht gut aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top