على اي فون، ما هو أفضل وسيلة لنقل UIImageView مع الضوابط التي تظهر على الشاشة؟

StackOverflow https://stackoverflow.com/questions/1012606

سؤال

وأنا تطوير إصدار فون من هذه اللعبة. http://www.students.uni-mainz.de/rathb000/ Fillit / Game.html

وأنا باستخدام NSTimer لتغيير موقف السفينة من قبل 1 بكسل والفاصل الزمني للالموقت هو 0.002.

ولكن، لقد لاحظت أن السفينة لا يتحرك بشكل أسرع إذا كنت تقليل الوقت فورثور الفاصل. انفاكت، ليس هناك فرق بين 0.05 و 0.002. هل هناك قيود على الحد الأدنى من الوقت يجب ان تعطي كما NSTimeInterval؟

وكانت السفينة يتحرك حاليا بطيئة جدا للعبة لتكون مثيرة.

وكما أن حركة الطيور (الذي يتحقق أيضا NSTimer) يصبح بطيئا عندما تضغط على أي زر للتحرك السفينة.

وأي فكرة عن كيف يمكن حلها؟

هل كانت مفيدة؟

المحلول 6

ومجعد ذلك.

وكان لاستخدام الرسوم المتحركة الأساسية لتحريك السفينة وجعل الطيور تنتقل عن طريق NSTimer. يعمل بشكل جيد بهذه الطريقة ولكن فقط تصل إلى حد معين. الطيور بطيئة مرة أخرى نزولا عند سرعة السفينة يزيد أكثر من حد معين.

نصائح أخرى

وNSTimer ليست آلية في الوقت الحقيقي. انها تطلق كجزء من حلقة تشغيل وليست مثالية لخلق سلس، والرسوم المتحركة السوائل. ومع ذلك، هناك SDK التي هي جزء من دعا فون OS الرسوم المتحركة الأساسية - أنه يوفر مكتبة من الوظائف لأداء الرسوم المتحركة على نحو سلس من طبقات وجهات النظر. هنا هو عبارة عن سلسلة جيدة بشكل معقول من دروس الفيديو التي قد تجدها مفيدة. وهناك أيضا كتاب ممتاز دعا الأساسية الرسوم المتحركة لنظام التشغيل Mac OS X و iPhone أن قد تجدها مفيدة.

وهناك أيضا في وثائق الحركة الأساسية من أبل التي تصف كيفية استخدام فئة CABasicAnimation لتحريك خصائص أي طبقة أو الرأي. هنا مثال على طبقة الرسوم المتحركة واضح من مستندات:

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"];

ومن مستندات NSTimer:

<اقتباس فقرة>   

وجهاز توقيت ليست آلية في الوقت الحقيقي. انها تطلق فقط عند واحد من وسائط تشغيل حلقة التي تم إضافتها الموقت يشغل وقادرة على معرفة ما اذا كان قد مر وقت اطلاق النار الموقت ل. بسبب مختلف مصادر الدخل تدير تشغيل حلقة نموذجية، القرار الفعال الفاصل الزمني لتوقيت يقتصر على بناء على أمر من 50-100 ميلي ثانية. إذا حدث وقت إطلاق جهاز توقيت، بينما حلقة المدى هي في وضع غير مراقبة مؤقت أو أثناء شرح طويل، والموقت لا يتم إطلاق حتى في المرة القادمة حلقة المدى يتحقق الموقت. ولذلك، فإن الوقت الفعلي الذي الحرائق الموقت يحتمل أن تكون فترة طويلة من الوقت بعد الوقت المقرر إطلاق النار.

وربما يمكنك محاولة تحريك UIView باستخدام الرسوم المتحركة UIView بدلا من جهاز توقيت.

هل يمكن أن تنظر في زيادة حجم المسافة: نقل السفينة 3 أو 4 بكسل لكل 0.05 ثواني بدلا من 1 بكسل لكل 0.002 ثانية

.

في رأيي، يجب أن تكون باستخدام نفس خطوة زمنية عالميا في جميع الكيانات في اللعبة، وليس خطوة زمنية حصرا لسفينة اللاعب. إذا كانت السفينة تتحرك ببطء شديد مع خطوة زمنية الخاص بك، وزيادة كمية المسافة التي يتحرك في الإطار.

وحقا، يجب أن تفكر في الانتقال سفينة لاعب من حيث بكسل / الثانية. عندما وقع الحدث NSTimer، والحصول على الوقت الذي انقضى منذ آخر تحديث. استخدام هذا الوقت المنقضي للتحرك الكيانات اللعبة. على سبيل المثال، إذا خطوة زمنية التحديث هو 0.05 ثوان، وتريد نقل سفينة 100 بكسل اللاعب في الثانية، ثم يجب عليك تحريكه 100 * 0.05 = 5 بكسل في هذا التحديث. وهذه الطريقة سوف تمثل متفاوتة timesteps حجم والكيانات اللعبة سوف تظهر دائما إلى التحرك بسرعة متسقة، حتى لو آلية توقيت ليست أن متسقة.

وليس فقط NSTimer يست الأداة المناسبة لهذا النوع من الرسوم المتحركة التصميم الخاص بك هو الخطأ.

وجهاز توقيت مع inteval 0002 الحرائق 500 مرة في الثانية الواحدة. هذا هو وسيلة مجنون لتحريك هذه اللعبة.

وأقترح عليك أن تقرأ على تصميم لعبة 2D و معرفة طريقة أفضل للقيام كشف التصادم - مثل يوحي مجهول يجب أن يكون حادث تصادم المستطيل جولة السفينة بدلا من الاعتماد على بكسل الفعلية

ويجب عليك أيضا التحقق من كوكوس -2D آيفون

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top