المشكلو هو انه لما تدخل الكرة داخل المضرب -بطريقة ما- تتسارع بشكل كبير جدا حتى تخرج من المضرب…
اعلم انها مشكلة تحدث للكل…لكن يجب التعامل معها…هذا يعتبر خطأ يشوه من كفاءة وجمال المشروع…حاليا انا ابحث عن الحل…
ارجو منكم المساعدة ان استطعتم…
شكرا لكم
بحثت في النت…جربت في اليوتيوب..لا جدوى معظم الحلول إما لا تصلح او تتطلب منك تغيير كامل في منطق اللعبة ليتطابق مع ناشر الحل وهذا مجرد نسخ ولصق لا فائدة منه.
1 مشكلة الكرة داخل المضرب
عندما تدخل الكرة في منتصف المضرب أو من طرفه ، تبدأ ترتد بسرعة داخل المضرب.هذا يسمى “Collision Tunneling” أو “Multiple Bounce Bug”.
شرط التصادم (مثلاً if ball.distance(paddle) <= 50) يتحقق حتى بعد الارتطام. وبالتالي، في كل فرايم، تستمر الكرة في “عكس الاتجاه” لأنها ما زالت داخل نطاق التصادم.
خلف الكواليس…
عند كل تحديث في اللعبة (كل تكرار للحلقة)، يتم التحقق إن كانت الكرة تلامس المضرب. إذا حصل التصادم:
يتم عكس اتجاه الكرة فورًا. لكن الكرة لم تتحرك بعد بعيدًا عن منطقة المضرب، وبالتالي في الإطار التالي من اللعبة، يحصل تصادم مرة ثانية.
النتيجة: الكرة ترتد بسرعة داخل المضرب أو تتحرك بطريقة غير طبيعية.
الحل:
عمل قفل خاص يتحكم في التصادم can_bounce. عند اصطدام الكرة بالمضرب يتم غلق القفل ثم بعد ذلك قم بفتحه مجددا.
اعادة فتح القفل يجب ان تكون بشروط دقيقة جدا ولا تتاثر بسرعة اللوب…متى يمكننا فتح التصادم؟ عندما تبتعد الكرة كفاية عن المضرب الذي اصطدمت به بالفعل…هذا برمجيا يعني ان موقع الكرة يكون ما بين المضربين..او قبل موقع شرط التصادم.
كما هو موضح في الصورة.
2 مشكلة تصادم الكرة خلف المضرب
عند تفويت الكرة (أي عدم ضربها)، ترتد من الحافة وتعود عبر المضرب وهذا غريب لأنه يفترض أن الكرة تختفي و تُعاد إلى المنتصف بمجرد أن تتجاوز الحد الأقصى للحافة.
ما يحدث هو ان الكرة تكون قد تجاوزت المضرب (من جهة الحائط) ولكن ما تزال ضمن شرط المسافة ball.distance(paddle) <= 50.
موقع الكرة xcor() ما يزال ضمن الشرط x >= 430 مثلاً (أي على يمين الشاشة)، وبالتالي:
يتم التحقق من الشرط والكرة أصلاً خلف المضرب.
ينقلب اتجاه الكرة (ball.x_move *= -1) ويغلق can_bounce.
النتيجة: الكرة تعود من الخلف، وتعبر جسم المضرب في الاتجاه المعاكس.
يتم اعتبار هذا ارتطامًا بالمضرب، وهو غير صحيح!
باختصار، شرط التصادم لا يفرّق بين “أمام” و"خلف" المضرب. طالما الكرة قريبة منه، يتحقق التصادم حتى لو كانت خلفه أو بعيدة عنه فعليًا من ناحية المنطق البصري.
الحل:
اضف شرط منطقي دقيق الى شروط التصادم حيث يحدد موقع الكرة يجب ان يكون قبل المضرب وليس من خلفه…برمجيا يعني ان احداثيات الكرة تكون اكبر من او تساوي احداثيات المضرب -الايمن مثلا-
التحكم في المفاتيح
بدل العمل بدالة onkey() يفضل ان تعمل بدالة onkeypress() حيث عند الضغط باستمرار على المفتاح يتحرك الى ان ترفع يدك وهذا يساعد في سرعة الحركة.
كذلك انصح بتغيير شرط المسافة الى 55 بدل 50 وهذا لجعل الكرة ترتطم حتى بحافة المضرب.
كل هذه الحلول والتعديلات تطلبت بحثا وتجريبا وتفكيرا عميقا…ليس دائما الحلول تكون جاهزة في النت…وليست دائما تكون ملائمة لبرنامجك…تذكر جيدا…
الان النتيجة النهائية بعد عدة اختبارات..
التصادم يعمل بشكل مذهل.
الشروط الجديدة جعلت اللعبة واقعية اكثر. حيث يمكنك ضرب الكرة بطرف المضرب فترتد وهو ما يحصل في الواقع
تم التخلص من مشكلة التصادم خلف المضرب…الان اذا فاتتك الكرة …فلن تعود…
وتم التخلص ايضا من مشكلة الكرة داخل المضرب…اصطدام واحد وانتهى الامر.
الحمد لله انني استطعت التعامل مع هذه المسائل …ارجو ان يكون المنشور مفيدا.