ال Sprites في SDL .

الناقل : elmasry | الكاتب الأصلى : الشمري | المصدر : www.arabteam2000-forum.com

السلام عليكم.


سأفترض أنك قرأت هذا الموضوع وفهمته .
http://www.arabteam2...howtopic=100514


الفكرة من sprite .. هي بأن نحمل صورة كبيرة نوعا ما .. ثم نلتقط اجزاء من تلك الصورة ونعرضها ,

مثلا ..

لديك هذه الصورة ..
Posted Image

اذا اردت اظهار كل الصورة .. فان هذا الامر معروف .

لكن لو أردت أن تظهر جزء من الصورة ..

مثلا تريد في الثانية الاولى تريد اظهار الرقم واحد .
الثانية الثانية تريد اظهار الرقم اثنين .. وهكذا .
حتى تصل لنهاية الصورة ( الرقم اربعة ) .

الفكرة بشكل عام كالتالي :

نستخدم امر رسم الصورة .. ولكن لا نرسم الصورة كاملة .. بل جزء منها ,

مثلا هذه الصورة .
Posted Image

عرضها 256 بكسل وطولها 64 بكسل .
مقسمة بالشكل التالي :

في الاحداثي السيني :
من البكسل رقم صفر .. الى البكسل رقم 64 هذا يمثل الفريم الاول .
من البكسل رقم 64 الى 128 الفريم الثاني .
من البكسل 128 الى 192 الفريم الثالث .
من البكسل 192 الى 256 الفريم الرابع .

فنحن نكتب شيئا شبيه بالتالي .

Draw_Image ( 64 ,128, "image.bmp" );

بالتالي سنرسم الرقم اثنين ,,


لكن هناك أمر مهم :

كل مكتبة لها اسلوب معين وطريقة معينة ..

نحن الان سنطبق على SDL .. لانه هو ما يهمنا في هذه الايام ..

SDL لها طريقة معينة في رسم الصور ..

اولا تقوم بانشاء تركيب من نوع

SDL_Rect screen_rect;


طبعا كما تعلم هذا التركيب يحتوي على اربع متغيرات ..
الاحداثي السيني والصادي
وطول وعرض الشكل .

نحن الان نريد ان نرسم الفريم رقم اثنين من الصورة
        image_rect.x=64;///////  لاحظ 
        image_rect.y=0;
        image_rect.w=64 ;/////// لاحظ
        image_rect.h=64 ;


اولا حددنا بداية المنطقة التي نريد رسمها من الصورة .
وهي هنا من الاحداثي السيني 64 للصورة

ونتحرك 64 بكسل الى اليمين .,, اي حتى نصل للبكسل رقم
64 + 128 = 192



التطبيق الثاني :

الان نريد أن نطور مثالنا قليلا ..

اذا ضغط المستخدم على السهم الايمن من لوحة المفاتيح نظهر الفريم التالي ,,
واذا ظغط السهم الايسر نظهر الفريم السابق ..

Posted Image


لاحظ :
static int x1=0; 
bool is_up=true;
.
.
.
        while(isRunning == true)
         {
                SDL_Event event;
 
                SDL_PollEvent(&event);

                if (event.type == SDL_QUIT)
                        isRunning = false;
               

                 if(event.type == SDL_KEYDOWN)
                {
                        switch(event.key.keysym.sym  )
                        {
                        case SDLK_RIGHT:
                                {
                                        if(is_up==true)
                                        {
                                        // نتأكد من اننا وصلنا لنهاية الصورة
                                        if(x1>=192 ){x1=0; }
                                         else {
                                 
                                                x1+=64;

                                                }

                                         is_up=false;

                                        }

                                }//right

                        case SDLK_LEFT:
                                {

                                }


                        }

                               
                }//key down  

                if(event.type == SDL_KEYUP)
                {
                        is_up = true;
                }




                else
                {


        //نحدد المنطقة التي نريد عرضها من الصورة .. ونحن حددنا كل الصورة
        image_rect.x=x1;
        image_rect.y=0;
        image_rect.w=64 ; // x1+ 46
        image_rect.h=64 ;

        //أين نريد وضع الصورة ... نختار الموقع الذي نريد بالنسبة للشاشة
        screen_rect.x=0;
        screen_rect.y=0;

        SDL_BlitSurface(image, &image_rect, screen, &screen_rect);

        //نعرض الصورة

                SDL_Flip(screen);

                }

        }//while



اذا ضغط المستخدم على المفتاح الايمن نزيد المتغير x1 .. اربع وستين بكسل . 64 .


ففي الضغطة الاولى

( 64 , 128 )

الثانية
(128, 192 )

والضغطة الثالثة

( 192 , 256)

والان وصلنا لنهاية الصورة ..

نعود من جديد الى بداية الصورة لاننا وضعنا هذا الشرط

if(x1>=192 ){x1=0; }
 
ملف مرفق(ملفات)