برمجة الألعاب لالروبوت

برمجة الألعاب لالروبوت 28: السيطرة على الاصطدامات

42 فيديوهات

238 دقيقة

لتنفيذ هذه الاصطدامات، نحن Box2D ما يعرف اتصالات. في كل مرة كان هناك تصادم أو اثنين المباريات تصطدم بطريقة أو بأخرى أو محاولة لاحتلال نفس المنطقة من الفضاء، ويحدث، ويمكن أن يتم إخطار اتصال منه. لهذا العالم يجلب طريقة تسمى setContactListener، التي يمكننا ربط ContactListener عالمنا، الذي يرتبط المستمع للاستماع عندما تحدث تلك الاتصالات.

لذلك أنا ذاهب لمجرد جعل setContactListener (ContactListener الجديدة ()) لتحديد واحدة سريعة، على الرغم من أن هذا يمكن أن يتم بطريقة أفضل. كما ترون، ContactListener تنفذ العديد من الطرق. يمكننا استخدام beginContact للكشف عندما بدأنا الاصطدام، وendContact للكشف عن عندما يكون لدينا الانتهاء من الاصطدام. preSolve وpostSolve تشغيلها عند الاتصال الجسدي يتم معالجتها، وبالتالي يمكن

القيام المادية باستخدام معلمات خاصة، ولكن في حالتنا نحن لن تستخدم بعد. وسوف يستغرق سوى BeginContact وEndContact. في كل مرة لاعب اشتباك بطريقة أو بأخرى مع التربة، فإنه سوف ينتج اتصال بين اثنين من المباريات، والتي يمكن الوصول إليها عن طريق getFixtureB من الاتصال getFixtureA والأساليب. هذا هو المكان الذي تأتي المشاكل لأننا لا نستطيع أن نعرف في البداية حيث الهيئة،

إذا كان لاعبا أساسيا A أو B اعبا اساسيا، لذلك كل ما نقوم به هنا، وجميع القرارات التي نتخذها لكشف عندما يكون الجسم يضرب الأرض، يجب علينا النظر عما إذا كان الجسم == A، B == الأرض، كما هو الحال عندما تربة ==، B == الجسم، لذلك لدينا لكتابة الشيء نفسه مرتين. انها ليست نظيفة كما أنها يمكن أن تكون. على سبيل المثال، يمكنني الحصول المباراة الاتصال باستخدام contact.getFixtureA A () وباء اعبا اساسيا باستخدام contact.getFixtureB ().

والآن يمكنني الكشف عن حالة بلدي اعبا اساسيا يتوافق مع الجسم أم لا. وهذا هو المكان الذي تأتي المشاكل بسبب ... كيف أفعل؟ في البداية أنا أعرف فقط كان لاعبا اساسيا في حد ذاته. ما يتعين علينا القيام به هو تحديد، على سبيل المثال، إذا fixtureA هو نفس المتغير الذي minijoeFixture وfixtureB نفس sueloFixture، على الرغم من أنني سوف تظهر كيف يمكننا القيام بذلك بطرق أخرى عن طريق UserDatas. الآن، إذا كان لاعبا ل

هو لMinijoe، وتركيبات B هو التربة، يمكن أن يطلب جسمنا للقفز. قد تعتقد أنه من السهل، داعيا القفز. أنا اعتقد أيضا أنه لن يكون الأمر كذلك، ولكن لم يحدث ذلك. لا يمكنك ان تجعل بداية القفز داخل ContactListener، لأنه يقفز تتطلب أن المحرك لا يعمل، وخلال اتصال Box2D سيتم العمل على أشياء مثل هذه، فإنه لن ينجح. بدلا من ذلك، ما نقوم به هو أن تسأل عند نقطة واحدة Box2d

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

بدلا من كونها جو، ولابد أن أفعل نفس الشيء. وضع HaColisionado إلى true. ومرة واحدة ونحن من الاصطدامات مديرنا أنا يمكن أن تجعل بالفعل، إذا لعبنا أو قد اصطدمت، نحن القفز، وبعد ذلك أيضا أن يكون وضعت haColisionado إلى false لتجنب ذلك لسبب يمكن أن تقفز عدة مرات. وهكذا، الآن كل مرة يحدث تصادم، سوف تقفز مرة أخرى. كما أقول، لا يمكن أن يقفز داخل نفس اصطدام مدير،

لأنك عندما كنت تعمل. لذلك لا خيار سوى وضع العلم على القيام بذلك في وقت لاحق في الحال على سبيل المثال من haColisionado. ويتم ذلك غالبا مع الكيانات، كما أنها يمكن أن تكون كيانا خطيرا كما BodyEntity أو PlayerEntity، مع خصائص مثل estaSaltando، debeSaltar، enElAire، أن تكون أكثر مرونة للسيطرة. في حالتي مثل هذا أنها مريحة جدا للوصول إلى كافة المتغيرات لا يزال لا أقوم،

ولكن أن تطمئن أنه عندما Scene2D دمج هذه الشاشة، سننتقل إلى جعلها أكثر نظافة، ومن الواضح.

العثور على دورات جديدة، والاشتراك. لن يكون هناك غير المرغوبة، وعدت :)

عن المؤلف

foto de jotajotavm
José Javier Villena

السيرة الذاتية: محلل مبرمج في لغات مختلفة. منصات المعلم PREMIUM المعترف به عالميا باعتباره CodigoFacilito. مقالات رئيس التحرير Cristalab. ويرعى بلدي قناة يوتيوب من قبل الناشر ANAYA وLaTostadora. أود أن أشرح بالتفصيل وإعطاء أمثلة عديدة لتجنب الشك.