سؤال

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

class Projectile : public Character
{
private:
    float xVel;
    float yVel;
    float x;
    float y;

public:
    void init();
    void keys();
    void move();
    void show();

}bullet;

void Projectile::init()
{
    x=315;
    y=305;
    xVel=0;
    yVel=0;
}

void Projectile::keys()
{
    bool shoot = true;
    Uint8 *keystates = SDL_GetKeyState( NULL );
    if(keystates[SDLK_SPACE])
    {             
        yVel-=14;             
    }
}

void Projectile::move()
{
    x=x+xVel;
    y=y+yVel;
    xVel=0;
    yVel=0;
    if(y<0)
    {
        x=charx;
        y=chary;              
    }
}

void Projectile::show()
{
    apply_surface(x-5,y-2,jizz,screen);
    cout << y << endl;
}
هل كانت مفيدة؟

المحلول

هذا سهل.

لا تفعل هذا (في المقذوف :: move ()):

xVel=0;
yVel=0;

وسوف تستمر الرصاصة في الحركة.

مشكلة أخرى هنا:

if(keystates[SDLK_SPACE])
{             
    yVel-=14;             
}

في الأساس ، يجب ألا تفعل -=. إما استبداله بـ yVel = -14 (ستتحرك جميع الرصاص دائمًا مع سرعة الثوابت) أو اكتشاف لحظة "مفتاح الأسفل" (لم يتم الضغط على مفتاح IE في الإطار السابق ، ويتم الضغط عليه في حالية) ، وعندها فقط تفعل ذلك -= 14. قد يكون هذا النوع من الأشياء (اكتشاف حدث Keyup/KeyDown) أكثر بساطة إذا قمت بمعالجة الأحداث الرئيسية التي تتلقاها (في حلقةك الرئيسية) بدلاً من الاتصال SDL_GetKeyState.

نصائح أخرى

xVel=0;
yVel=0;

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

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