الشبكة العربية لمطوري الألعاب

مبتدئ  kikawi mourad مشاركة 1

السلام عليكم و رحمة الله و بركاته
اخواني عندي مشكلة في كيفية التحكم في تسلسل الصور متل الفريم  .فمتلا عند الضغط على الكايبورد يمين اريد ان تظهر الصورة على شكل فريم يعني صورة متحركة .
متلا هادا الكود

case sdlk_right :
positionP.x+=10
persoactuel=image1


متلا ادا ضغطت مرتين على اليمين اريد ان تظهر الصورة الاولى تم التانية تم التالتة  ...... الى السابعة .

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

خبير  Mohammad Khashashneh مشاركة 2

السلام عليكم و رحمة الله و بركاته


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

بأعتبار أن المتغير persoactuel هو مؤشر من نوع SDL_SURFACE, و أن هنالك مجموعة من الصور (image1, image2, image3...image7) فعليك حفظها في مصفوفة و استخدام متغير فهرس لتحديد الفريم التالي:



int i = 0;
SDL_SURFACE* images[7];
...
// خزن الفريمات من 1 الى 7 في المصفوفة images
...
case sdlk_right:
   positionP.x += 10;
   persoactuel = images[i++];
   if(i == 7)
      i = 0;
   break;
case sdlk_left:
   ...


  
   محمد خشاشنة

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع

مبتدئ  kikawi mourad مشاركة 3

اشتغلت الله يبارك فيك يا اخي المشكل الوحيد اللي باقي عندي هو متلا اريد اللاعب ان يطلق رصاصة  الله يبارك فيك  هل هادا داخل في سكرولين

خبير  Mohammad Khashashneh مشاركة 4

نعم, فعليك تغيير موقع الرصاصة حسب الإتجاه المطلوب داخل حلقة التكرار (loop)
كالتالي:


int shooting = 0;
SDL_RECT projectilePos;



...
case SDLK_SPACE:
    shooting = 1;
    projectilePos.x = player.x;
    projectilePos.y = player.y;
...

//في حال عدم تجاوز موقع الرصاصة موقع الهدف أو خروجها عن حدود الشاشة
projectilePos.x+= speed_and_direction;


مرة أخرى, الرجاء توضيح المشكلة أكثر أو إدراج الكود للتمكن من فهم المشكلة
بشكل صحيح.

محمد خشاشنة

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع

مبتدئ  kikawi mourad مشاركة 5

hالسلام عليكم . الله يجازيك يا اخي هادا هو الكود
#include
#include
#include



int main(int argc, char *argv[])
{
    SDL_Surface *screen = NULL, *image[4] = {NULL} , *actuel = NULL;
    SDL_Rect pos;
    SDL_Event event;
    int i=0;
    int run = 1;

    SDL_Init(SDL_INIT_VIDEO);


    screen = SDL_SetVideoMode(400, 400, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("mourad projet", NULL);

    image[0] = SDL_LoadBMP("1.bmp");
    image[1] = SDL_LoadBMP("2.bmp");
    image[2] = SDL_LoadBMP("3.bmp");
    image[3] = SDL_LoadBMP("4.bmp");

    pos.x = 1;
    pos.y = 1;



    SDL_EnableKeyRepeat(100,100);

    while(run)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                run = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_RIGHT:
                        pos.x+=10;
                        actuel = image[i++];

                        if(i == 3)
                            i=0;
                            break;


                    break;

                }
                break;

        }
        SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,50,50,50));
        SDL_BlitSurface(actuel,NULL,screen,&pos);
        SDL_Flip(screen);
    }

    SDL_FreeSurface(actuel);
    SDL_Quit();
    return EXIT_SUCCESS;
}

خبير  Mohammad Khashashneh مشاركة 6

و عليكم السلام
الرجاء تجربة الكود التالي.
لم أم أجربه شخصيا, لكني حاولت أن يكون صحيحا.

#include 
#include 



int main(int argc, char *argv[])
{
    SDL_Surface *screen = NULL, *image[4] = {NULL} , *actuel = NULL;
    SDL_Rect pos;
    SDL_Event event;
    int i=0;
    int run = 1;

    SDL_Surface* projectile = NULL;
    int shooting = 0;
    SDL_RECT projectilePos;

    SDL_Init(SDL_INIT_VIDEO);


    screen = SDL_SetVideoMode(400, 400, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("mourad projet", NULL);

    image[0] = SDL_LoadBMP("1.bmp");
    image[1] = SDL_LoadBMP("2.bmp");
    image[2] = SDL_LoadBMP("3.bmp");
    image[3] = SDL_LoadBMP("4.bmp");
    projectile = SDL_LoadBMP("projectile.bmp");

    pos.x = 1;
    pos.y = 1;



    SDL_EnableKeyRepeat(100,100);

    while(run)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                run = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_RIGHT:
                        pos.x+=10;
                        actuel = image[i++];

                        if(i == 3)
                            i=0;
                            break;


                    break;
                    case SDLK_SPACE:
                        if(shooting)
                            break;
                        shooting = 1;
                        projectilePos.x = pos.x;
                        projectilePos.y = pos.y;

                }
                break;

        }

        // في حال عدم تجاوز موقع الرصاصة عن حدود الشاشة
        if(projectilePos.x < 400) {
            projectilePos.x+=15;
        }
        else {
            shooting = 0;
        }
        SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,50,50,50));
        SDL_BlitSurface(actuel,NULL,screen,&pos);
        if(shooting)
            SDL_BlitSurface(projectile, NULL, screen, projectilePos);
        SDL_Flip(screen);
    }

    SDL_FreeSurface(actuel);
    SDL_Quit();
    return EXIT_SUCCESS;
}

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع