2009-06-18 8 views
0

Ich entwickle eine iPhone Version dieses Spiels. http://www.students.uni-mainz.de/rathb000/Fillit/Game.htmlWas ist der beste Weg, um ein UIImageView auf dem iPhone mit den Steuerelementen auf dem Bildschirm zu verschieben?

Ich verwende einen NSTimer, um die Position des Schiffes um 1 Pixel zu ändern, und das Zeitintervall für den Timer ist 0,002.

Allerdings habe ich bemerkt, dass sich das Schiff nicht schneller bewegt, wenn ich das Zeitintervall weiter reduziere. Tatsächlich gibt es keinen Unterschied zwischen 0,05 und 0,002. Gibt es eine Beschränkung für die Mindestzeit, die Sie als NSTimeInterval angeben müssen?

Das Schiff bewegt sich derzeit zu langsam, um das Spiel spannend zu machen.

Auch die Bewegung der Vögel (die auch von NSTimer erreicht wird) wird langsam, wenn ich irgendeinen Knopf drücke, um das Schiff zu bewegen.

Irgendeine Idee darüber, wie das gelöst werden kann?

Antwort

-1

check this out herausgefunden.

Hatte Core Animation zu verwenden, um das Schiff zu bewegen und ließ die Vögel mit NSTimer bewegen. Funktioniert auf diese Weise, aber nur bis zu einer bestimmten Grenze. Vögel werden wieder langsamer, wenn die Geschwindigkeit des Schiffes mehr als eine bestimmte Grenze überschreitet.

0

Von NSTimer docs:

Ein Timer kein Echtzeit-Mechanismus ist; Es wird nur ausgelöst, wenn einer der Run-Loop-Modi, denen der Timer hinzugefügt wurde, ausgeführt wird und in der Lage ist, zu überprüfen, ob die Zeit des Timers abgelaufen ist. Aufgrund der verschiedenen Eingangsquellen, die eine typische Laufschleife verwaltet, ist die effektive Auflösung des Zeitintervalls für einen Zeitgeber auf die Größenordnung von 50-100 Millisekunden begrenzt. Wenn die Auslösezeit eines Zeitgebers auftritt, während sich die Ausführungsschleife in einem Modus befindet, in dem der Zeitgeber nicht überwacht wird, oder während eines langen Aufrufs, wird der Zeitgeber erst ausgelöst, wenn die Laufschleife das nächste Mal den Zeitgeber überprüft. Daher kann die tatsächliche Zeit, zu der der Zeitgeber möglicherweise ausgelöst wird, eine erhebliche Zeitspanne nach der geplanten Auslösezeit sein.

Vielleicht können Sie versuchen, die UIView mit UIView Animationen statt eines Timers zu bewegen.

0

Sie könnten die Entfernung vergrößern: Bewegen Sie das Schiff alle 0,05 Sekunden um 3 oder 4 Pixel statt um 1 Pixel alle 0,002 Sekunden.

+0

Dies würde die Logik für die Kollisionserkennung falsch gehen lassen. Ich werde alle Punkte, an denen das Schiff vorbeifliegt, markieren müssen. Vielleicht kann ich ein Array nehmen und die Zwischenpunkte markieren, bin mir aber nicht sicher, ob das eine gute Idee ist. –

0

Meiner Meinung nach sollten Sie den gleichen Zeitschritt global für alle Entitäten in Ihrem Spiel verwenden, keinen Zeitschritt ausschließlich für das Schiff des Spielers. Wenn sich das Schiff mit dem Zeitschritt zu langsam bewegt, erhöhen Sie die Distanz, um die es sich pro Frame bewegt.

Eigentlich sollten Sie daran denken, das Schiff Ihres Spielers in Pixel/Sekunde zu bewegen. Wenn das NSTimer-Ereignis ausgelöst wird, erhalten Sie die verstrichene Zeit seit der letzten Aktualisierung. Nutze diese verstrichene Zeit, um deine Spieleinheiten zu bewegen. Wenn Ihr Aktualisierungszeitschritt beispielsweise 0,05 Sekunden beträgt und Sie möchten, dass das Schiff des Spielers 100 Pixel pro Sekunde bewegt, sollten Sie in diesem Update 100 * 0,05 = 5 Pixel verschieben. Diese Methode berücksichtigt unterschiedliche Zeitschritte und Ihre Spieleinheiten werden sich immer mit einer gleichmäßigen Geschwindigkeit bewegen, selbst wenn Ihr Timer-Mechanismus nicht so konsistent ist.

+0

Ja, das hört sich gut an, aber ich muss das Schiff immer nur 1 Pixel ziehen lassen. Es wird für die Logik des Spiels benötigt. Andernfalls erkennt der Vogel die Linie möglicherweise nicht und würde einen gefüllten Bereich passieren oder das Schiff nicht töten, wenn der Pfad unvollständig ist. Also möchte ich wissen, ob es solche "Übersetzungs" -Funktionen in Quarz gibt, die die Bewegung beschleunigen würden. –

+0

Ich gehe davon aus, dass die Kollisionserkennung das Rechteck um das Spielerschiff verwendet. Du könntest dieses Rechteck vergrößern, um das Spielerschiff und seine Geschwindigkeit zu umfassen. Wenn Ihr Spielerschiff zum Beispiel 10 Pixel auf der Y-Achse bewegt, könnten Sie ein Rechteck verwenden, das die Grenzen des Spielerschiffs enthält, aber auch 10 Pixel nach dem Schiff auf der Y-Achse verlängern, um die Distanz einzubeziehen Schiff reiste im letzten Rahmen. –

+0

Nein, es gibt keine Kollision für das Schiff und die Vögel. Nur die Linie vom Schiff und den Vögeln. Also müssen alle Punkte auf der Linie 3 markiert sein, damit wir wissen, wann der Vogel die Grenze überquert hat. Wenn es 4 markiert ist, muss der Vogel ablenken. Also muss ich jedem Punkt auf dem Schiffspfad einen bestimmten Wert geben und so kann das Schiff nicht mehr als 1 Pixel auf einmal bewegt werden. –

3

NSTimer ist kein Echtzeitmechanismus; Es wird als Teil der Laufschleife ausgelöst und eignet sich nicht ideal zum Erstellen flüssiger Animationen. Es gibt jedoch ein SDK, das Teil des iPhone-Betriebssystems namens Core Animation ist. Es bietet eine Bibliothek mit Funktionen zur reibungslosen Animation von Ebenen und Ansichten. Here is a reasonably good series of video tutorials, die Sie nützlich finden können. Es gibt auch ein ausgezeichnetes Buch namens Core Animation for Mac OS X and iPhone, das Sie nützlich finden können.

Es gibt auch die core animation documentation from Apple, die beschreibt, wie die CABasicAnimation-Klasse verwendet wird, um Eigenschaften eines beliebigen Layers oder einer Ansicht zu animieren.Hier ist ein Beispiel einer expliziten Schicht Animation aus der Dokumentation:

CABasicAnimation *theAnimation; 

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"]; 
theAnimation.duration=3.0; 
theAnimation.repeatCount=1; 
theAnimation.autoreverses=NO; 
theAnimation.fromValue=CATransform3DTranslate(0,0,0); 
theAnimation.toValue=CATransform3DTranslate(20,20,0); 

[theLayer addAnimation:theAnimation forKey:@"animateTransform"]; 
+0

Vielen Dank für den Link. Darauf. –

+0

Kein Problem, Sie können auch meine Antwort als akzeptierte Antwort mit dem Häkchen akzeptieren, wenn Sie es für nützlich halten. – LBushkin

+0

Dies ist noch nicht beantwortet. Ich bin immer noch fest .. :( –

0

ist nicht nur NSTimer nicht das richtige Werkzeug für diese Art von Animation Ihr Design ist falsch.

Ein Timer mit einem Intervall von 0002 löst 500 Mal pro Sekunde aus. Das ist eine verrückte Art, dieses Spiel zu animieren.

Ich schlage vor, Sie lesen 2D-Spiel-Design und finden Sie eine bessere Möglichkeit zur Kollisionserkennung - wie anonym schlägt vor, Sie sollten ein Kollisionsrechteck rund um das Schiff, anstatt sich auf die tatsächlichen Pixel.

Sie sollten auch Cocos-2D for iPhone

+0

Yaa, ich weiß, ich bin falsch bei diesem. Aber wie ich im Kommentar oben sagte, brauche ich keine Kollisionserkennung zwischen dem Schiff und dem Vogel. Yaa, ich versuchte cocos2d für etwa eine Woche aber fand, dass mein Spiel einfach genug ist, um in Quarz gemacht zu werden.Ich konnte es nicht so schnell lernen, wie Benutzer oft über cocos2d behaupten. Danke, wie auch immer. –

+0

Sie haben also Ihre Lösung und Sie wollen nicht den Rat von Stack Overflow. Warum überhaupt die Frage stellen? –

+0

Wo habe ich erwähnt, dass ich die Lösung habe und keinen Rat brauche? Vielleicht sollten Sie meine obigen Kommentare lesen, bevor Sie sich eine Meinung bilden. Glauben Sie mir, es wird Ihnen sehr dabei helfen, einen Austausch zu vermeiden. –

Verwandte Themen