تنفيذ سلوك التجول في لعبة

أقوم ببعض الألعاب ، وأنا الآن من جانب وأنا أحاول تنفيذ سلوك التجول لدباباتي ، لكن لا يمكنني تنفيذه بنجاح.

The thing is that it calculates it's position and if it's like (430,130) and using rand_floatRange function it gives itself some value between 0 and screen height(500), lets say 320, it goes off the screen.

لا توجد أخطاء في عملية التصحيح الخاصة بي على الإطلاق. إنه يبني على ما يرام ، تتحرك الدبابات في الميدان ، لكنها تنزل عن الشاشة بعد مرور بعض الوقت ، لأنه لا يوجد حد يمنعها من الوصول إلى قيم عالية (مثال: موقع الخزان هو (450،100) والشاشة (600،600) وإذا حصل على هدف جديد للدبابة (الذي سيصل إلى (300،200) من ذلك المكان (يأخذ قيمة من 0 إلى 600) ، فسيكون (750،300) وسيخرج من الشاشة.

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

void Tank::Wander()
{
    float randXs,randZs;
    srand(time(NULL));
    for(int i=0;i< tanks[i]->givePosX() && randZs < tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() - 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
            }
            else if(randXs > tanks[i]->givePosX() && randZs < tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() +0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
            }
            else if(randXs > tanks[i]->givePosX() && randZs > tanks[i]->givePosZ() )
            {
                tanks[i]->posX= tanks[i]->givePosX() + 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() +0.1;
            }
            else 
            {
                tanks[i]->posX= tanks[i]->givePosX() - 0.1;
                tanks[i]->posZ= tanks[i]->givePosZ() + 0.1;
            }
        }
    }
}  

float Tank::rand_FloatRange(float a)
{
    float c;
    c = rand() % (int) a;
    return c;
}

إذا كان أي شيء آخر في حاجة ، إذا كان لدي ذلك سأقدمه هنا.

0
حسنًا ، دعني أعيد صياغة/تحرير. KeithNicholas
وأضاف المؤلف Takarakaka, مصدر
حسنًا ، باستخدام الحسابات الخاصة بي ، اكتشفت أنه بمجرد حصولها على الهدف X و Z ، فإنها تمر عبر حلقة وخروج محددة ، مع أخذ قيمة X و Z أخرى. ما يتعين علي القيام به هنا هو تضمين متغير آخر atScene والذي سوف يتتبع ما إذا كان الخزان في مكانه أم لا ، وإذا كان كذلك ، فإنه يمكن أن ينفجر من الحلقة. إن معرفة كيفية التنفيذ ، بمجرد أن أحصل على حل ، سوف نقوم بنشرها مرة أخرى هنا.
وأضاف المؤلف Takarakaka, مصدر

1 إجابة

C ++ الخاص بي ليست جيدة جداً ، ولكن أرى المشكلة في المنطق الخاص بك.

randXs = rand_FloatRange(screenHeight);
randZs = rand_FloatRange(screenHeight);

بالمناسبة ، أفترض RandXs الخاص بك هو في الواقع عشوائية إلى عرض الشاشة؟ لديك ScreenHeight هناك (ربما هم هم نفسه؟)

على أي حال ، بدلاً من القيام بذلك ، قم بعمل شيء كالتالي:

randXs = rand_FloatRange(screenWidth - tanks[i]->posX);
randZs = rand_FloatRange(screenHeight - tanks[i]->posZ);

ما يفعله هذا ، هو أنه يقلل من نطاقك العشوائي حيث يقترب الخزان من حافة الشاشة ، لإبقائه في الحدود.

يجب أن يضمن ذلك عدم حصولك على قيمة عشوائية خارج الشاشة! تقرير مرة أخرى إذا لم ينجح! حظا طيبا وفقك الله!


تصحيح:

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

أيضا ، يمكنك التعامل مع المحور 2 بشكل منفصل. سأفعل هذا لو كنت أنت على النحو التالي:

if(randXs < tanks[i]->givePosX())  
{
  tanks[i]->posX = tanks[i]->givePosX() - 0.1;
}
else if(randXs > tanks[i]->givePosX())
{
  tanks[i]->posX= tanks[i]->givePosX() +0.1;
}

if(randZs > tanks[i]->givePosZ() )
{
  tanks[i]->posZ= tanks[i]->givePosZ() +0.1;
}
else if (randZs < tanks[i]->givePosZ() )
{
  tanks[i]->posZ= tanks[i]->givePosZ() - 0.1;
}

لاحظ هنا أنه من المهم وجود بيان معاكس في أعقاب العبارة الأخرى ، وليس مجرد حظر آخر. هذا ما اعنيه:

افعل هذا:     إذا (...)     {     ...     }     آخر إذا (... عكس لأول مرة إذا)     {     ...     }

و لا:

if (...)
{
...
}
else //no if here. 
{
...
}

وإلا فإن الدبابة ستظل تتحرك إذا كانت القيمة العشوائية هي نفس القيمة الخاصة به. أفترض ما تريد ، هو أنه يجب أن تظل ثابتة (في الاتجاه المعين) ، إذا كانت القيمة العشوائية هي نفسها. على سبيل المثال ، إذا كان لدينا دبابة بقيمة س 5 ، ونحن عشوائيًا بقيمة س 5 ، يجب ألا يكون هناك حركة في x ، وسيضمن الرمز أعلاه ذلك.

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

0
وأضاف
دنزيل ، شكرا على ملاحظاتك! إنه اقتراح جيد ، ومع بعض المتغيرات اللطيفة والمتغيرات الجديدة لفحص حالة الكائن الذي سأقوم به ، أريد الآن أن أذهب إلى المدرسة ، ولكن بعد عودتي سأقوم بنشر الحل هنا. شكرا مرة اخرى على هذا التنفيذ الجميل.
وأضاف المؤلف Takarakaka, مصدر