سؤال

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

لقد صنعت دبابة تطلق صواريخ، وعندما ضربت الصواريخ الجدران، أريدها أن ترتد، لكنني أريدهم أن يرتد إلى الزاوية اليمنى.

الآن ليس لدي أي عقبات، والصواريخ ترتد فقط عندما يحصلون خارج viewportRectangle صنعت.

هل الحل أبحث عنه متقدم للغاية؟

هل هناك طريقة بسيطة خلايا للقيام بذلك؟

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

المحلول

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

  • إذا كان صاروخ يضرب الحدود العليا أو السفلية عكس علامة yVelocity.
  • إذا كان الصواريخ يضرب الحدود اليسرى أو اليمنى عكس علامة xVelocity.

هذا سيبقي الحركة في المحور المعاكس نفسه.

اقتراض الصورة من إجابة كريس, ، دعنا نقول الصاروخ يبدأ في وضع I.

Angle of Reflection

مع ال xVelocity و yVelocity كلاهما إيجابي (في رسومات ثنائية الأبعاد يمين وأسفل عادة ما تكون إيجابية عادة) سوف يسافر الصاروخ في الاتجاه المشار إليه. دعونا فقط تعيين قيم

xVelocity = 3
yVelocity = 4

عندما يضرب الصاروخ الجدار في الموقف جيم, ، إنه xVelocity لا ينبغي أن تتغير، ولكن لها yVelocity يجب عكسها إلى -4 بحيث يسافر في الاتجاه المتزايد، ولكن يبقى الذهاب إلى اليمين.

فائدة هذه الطريقة هي أنك تحتاج فقط إلى تتبع الصواريخ xPosition, yPosition, xVelocity, ، و yVelocity. وبعد باستخدام هذه المكونات الأربعة فقط ومعدل تحديث اللعبة الخاص بك، ستصبح الصاروخ دائما إعادة رسمه في الموضع الصحيح. بمجرد الدخول إلى عقبات أكثر تعقيدا ليست في زوايا مستقيمة أو تتحرك، سيكون الأمر أسهل كثيرا في العمل مع x و y من الزوايا.

نصائح أخرى

قد تعتقد أنه نظرا لأن جدرانك تتماشى مع محاور الإحداثيات التي من المنطقي كتابة رمز حالة خاصة (للحصول على جدار عمودي، ينفي الإحداثيات السينية للسرعة؛ لجدار أفقي، ينفي تنسيق y ). ومع ذلك، بمجرد أن تحصل على اللعبة تعمل بشكل جيد مع الجدران الرأسية والأفقية، ربما يكون الشيء التالي الذي ستفكر فيه هو "ماذا عن الجدران في الزوايا التعسفية؟" لذلك يستحق التفكير في القضية العامة من البداية.

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

Missile with vector v about to obliquely hit a wall with surface normal n.

انشق، مزق الخامس في مكونات U. عمودي على الحائط و د بالتوازي إليها.

Right-angled triangle with hypotenuse for v, short side u parallel to wall and long side w parallel to wall.

أين:

U. = (الخامس · ن / ن · ن) ن
د = الخامسU.

هنا، الخامس · ن هل المنتج نقطة من المتجهات الخامس و ن. وبعد انظر الرابط للحصول على شرح لكيفية حسابه. المنتج نقطة ن · ن يقيم إلى مربع طول المتجه الطبيعي؛ إذا كنت دائما تبقي حياتي الخاصة بك في شكل ناقلات الوحدة ومن بعد ن · ن = 1 ويمكنك حذف الانقسام.

بعد كذاب، يتأثر مكون الحركة بالتوازي إلى الجدار بالاحتكاك F, ، ومكون عمودي على الجدار يتأثر بالمرونة، والتي يمكن أن تعطى في شكل أ معامل الرد رديئة.

وبالتالي فإن السرعة بعد الاصطدام الخامس' = F درديئة U.. وبعد في a مرونة تماما، اصطدام احتكاكي، الخامس' = دU.; ؛ وهذا هو، ينعكس الحركة حول الطبيعي عند نقطة الاصطدام، كما هو الحال في الرسم البياني الوارد في إجابة مشروع القانون.

هذا النهج يعمل فقط نفس الشيء في ثلاثة أبعاد أيضا.

(من الواضح أن هذه فكرة مبسطة للغاية من كذاب؛ لا يأخذ أي حساب الزخم الزاوي أو التشوه. ولكن بالنسبة لكثير من أنواع ألعاب الفيديو، فإن هذا النوع من التبسيط مناسب تماما.)

بالنسبة للجزيئات المثالية (والضوء)، فإن زاوية الانعكاس تساوي زاوية الإصابة، كما يتضح من هذا المخطط (من العموم. wikimedia.org).

Angle of Reflection

قم بإجراء عملية بحث عن "زاوية الانعكاس" (بدون علامات اقتباس) في Google.

إنها أكثر تعقيدا بعض الشيء عندما تأخذ في الاعتبار مراعاة ومواد الكائن والعقبات؛)

لقد تلقيت هذه المشكلة، الطريقة الوحيدة التي وجدتها هي فصل محاور الاصطدام!

جربها:

x += velocity * Math.cos(angle * Math.PI /180);
y += velocity * Math.sin(angle * Math.PI /180);

if (x < 0 || x > canvas.width) {
     angle = 180 - angle;   
}
else if (y < 0 ||y > canvas.height) {
     angle = 360 - angle; 
}

آمل أن يكون هذا يساعدك!

كقدمية لسؤال الفيزياء المحدد الذي تسأل، أود أن أوصي كتاب "بداية الرياضيات والفيزياء لمبرمجي الألعاب" من قبل ويندي ستاحر. لقد وجدت أنها مفيدة للغاية لمشاريع برمجة لعبتي / الفيزياء.

الرمز الذي يرافق الكتاب هو C ++ ولكن إذا كنت تعرف C #، فسيكون من السهل جدا إجراء التحويل.

عندى فكرة جيدة!

غير معقدة على الإطلاق - رمز PSEDO:

angleObjectHitWall = a;
bounceAngle = 180-a;

بالطبع هذا حساب بسيط للغاية، وهو غير ذي صلة تماما بمجرد البدء في مراعاة العوامل مثل المواد والجاذبية والجدران التي ليست مستقيمة وغيرها ...

180-A لا يعمل في جميع الحالات، إلا إذا كنت تعمل فقط ترتد على سطح أعلى عندما يتزايد x.

اتجاه واحد إلى الرأس هو منتديات شنا أو التقاط رمز عينة XNA. إنه C # وهو لبناء الألعاب. أنا لا أقسم أنك تريد بناء ألعابك في XNA، لكنها أداة رائعة، وهي مجانية.

هذا هو حقا سؤال الفيزياء، لذلك إذا لم تكن في علم الفيزيائي (وبما أنك تطرح على هذا السؤال، فأنا سأأخذها أنك لست) سيتطلب ذلك الكثير من القراءة والعصف الذهني للحصول عليه بشكل صحيح.

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

إذا كنت تريد فقط أن نجعلها "تبدو معقولة"، فلن أقوم بالقلق بشأن ذلك كثيرا واستخدامها فاتورة السحلية الإجابة، ولكن إذا كنت ترغب في تحقيق ذلك، فستكون لديك مغامرة تماما. لا تدع هذا يخيفك! حظ سعيد!

if(!Collide(Missle, Mainchar)){
(Velocity.x)*-1;
(Velocity.y)*-1;
}

إنه يعمل وبسيط، حظا سعيدا.

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