سؤال

لقد حصلت على بعض الحركة المتشنجة من العفريت الخاص بي.

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

ومع ذلك ، لاحظت أن حركة Y تنتهي عادةً قبل حركة X (حتى عندما تكون المسافات للسفر متشابهة) ، لذلك يبدو أن العفريت يتحرك في شكل "L" بدلاً من خط قطري ناعم.

يتم تعيين السرعة الرأسية والأفقية (VX ، VY) على 300. أي أفكار ما هو الخطأ؟ كيف يمكنني الحصول على Sprite الخاص بي للتنقل في خط قطري ناعم؟

 - (void)update:(ccTime)dt
{
int x = self.position.x;
int y = self.position.y;

    //if ball is to the left of target point
if (x<targetx)
{
            //if movement of the ball won't take it to it's target position
    if (x+(vx *dt) < targetx)
    {
        x += vx * dt;
    }
    else {
        x = targetx;
    }

} else if (x>targetx) //same with x being too far to the right
{
    if (x-(vx *dt) > targetx)
    {
        x -= vx * dt;
    }
    else {
        x = targetx;
    }

}
if (y<targety)
{
    if (y+(vy*dt)<targety)
    {
        y += vy * dt;
    }
    else {
        y = targety;
    }

} else if (y>targety)
{
    if (y-(vy*dt)>targety)
    {
        y -= vy * dt;
    }
    else {
        y = targety;
    }

}
self.position = ccp(x,y);
}
هل كانت مفيدة؟

المحلول

تريد الانتقال إلى (TargetX ، الهدف) من أي (x ، y) والوصول إلى كلا الإحداثيين في نفس الوقت (لتجنب "dogleg"). لذلك ، لنفترض أن سرعة x هي vx وستصل إلى هناك في ثوانٍ. وهذا يعني vx = (TargetX - X)/t. يجب أن يكون t هو نفسه بالنسبة للإحداثيات y إذا كنت تريد حركة سلسة إلى نفس النقطة في نفس الوقت ، وهذا يعني t = (TargetX - x)/vx و vy يجب أن يكون (الهدف - y)*vx/(TargetX - س).

بمعنى آخر ، لا يمكنك ضبط VX و VY بشكل منفصل والحصول على النتيجة التي تريدها.

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