سؤال

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

والكائنات هما UIImageViews.

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

المحلول

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

وأنا لم تفعل أي فون أو موضوعي C الترميز ولذا فإنني سوف مجرد كتابة عن شيء في الزائفة / C التعليمات البرمجية.

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

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

وبعد ذلك نحن نريد لحساب زاوية جديدة تقوم على المكان الذي ضرب مجداف. أنا ذاهب لنفترض أن تقوم بتخزين الاصطدام X في impactX وطول مضرب في paddleLength. وبهذه الطريقة يمكننا حساب زاوية الصادرة. دعونا أولا معرفة كيفية حساب مجموعة حتى يتسنى لنا الحصول على قيمة بين -1 و +1.

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

لنفترض أننا لا نريد أن تشتيت الكرة تماما إلى الجانب، أو 90 درجة، لأن ذلك سيكون من الصعب جدا أن يتعافى منها. منذ انا ذاهب الى استخدام impactRange كما velY الجديدة، وانا ذاهب لتوسيع نطاق ذلك وصولا الى القول -0.9 إلى 0.9.

impactRange = impactRange * 0.9;

والآن نحن بحاجة لحساب velX بحيث سرعة ثابتة.

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

والآن كنت إرجاع newVelX وnewVelY والتي يكون لها تأثير وسرعة ارتداد التابع.

وحظا سعيدا!

و(قد يكون جيدا الخلل في هنا، وأنا قد مقلوب X أو Y، ولكن آمل أن تحصل على الفكرة العامة).

تحرير : إضافة بعض الأفكار حول الحصول على impactX

لنفترض أن لديك ball.center.x وpaddle.center.x (لا أعرف ما تسمونه، ولكن دعونا نفترض أن ذلك paddle.center.x تعطينا وسط مجداف) ينبغي لنا تكون قادرة على حساب impactRange من ذلك.

ونحن بحاجة أيضا إلى نصف قطر الكرة (سوف أفترض ball.width كما قطر) وحجم مجداف (paddle.width؟).

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

وأصغر قيمة للballPaddleDiff سيكون عندما تكون الكرة هي مجرد لمس الجانب من مجداف. ومن شأن ذلك أن يكون ballPaddleDiff ثم paddle.width / 2 + ball.width / 2. لذا، فإن impactRange جديدة وبالتالي يكون

double impactRange = ballPaddleDiff / (double) totalRange / 2;

وربما يجب عليك مراجعة impactRange بحيث يكون في الواقع بين -1 و 1 بحيث الكرة لا تبادل لاطلاق النار قبالة الى النجوم أو شيء من هذا.

نصائح أخرى

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

وتطوير وظيفة الرياضية التي سيعود ناقلات الإخراج، أو سرعة ومتجه الوحدة، التي تمثل زاوية الانتاج وسرعة الكرة، غيفين زاوية المدخلات، والسرعة، ونقطة التأثير على مجداف، وسرعة مجداف .

ونحن نتوقع بالفعل أن زاوية الناتج = -1 * زاوية الإدخال. كما يتوقع أن تكون -1 * سرعة المدخلات والمخرجات السرعة. حتى إذا كنت تريد خلط عنه، وضبط تلك. هل يمكن زيادة زاوية الناتج يتناسب مع المسافة من مركز مجداف. يمكنك أيضا زيادة زاوية أو سرعة تتناسب مع سرعة مضرب عندما ضرب لها.

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

والتعليمة البرمجية التالية (C ++ لكن من السهل بما فيه الكفاية لتحويل لObjC)، يأخذ ناقلات 2D الواردة ويعكس ذلك بناء على سطح العادي (وجه الخفافيش بونغ الخاص بك).

هل يمكن إضافة بعض عشوائي "عامل المتعة" من قبل العشوائي إزاحة ان كنت إما تنطبق على "العددية" - لتغيير السرعة، أو على سطح العادي، لتغيير زاوية انعكاس

وأنا أستخدم هذا في مشروع فون الخاص بي، وأنه يعمل بشكل جيد:)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top