Contacts
صفحه اصلی پورتال | صفحه اصلی تالار | ثبت نام | اعضاء | گروه ها | جستجو | پرسش و پاسخ | فروشگاه الکترونیکی | خرید پستی بازی های کامپیوتری





صفحه اول انجمنها -> اصول اولیه در طراحی بازیهای کامپیوتری -> ++C به علاوه SDL میشه یه بازی خوب
 

ارسال يك موضوع جديد   پاسخ به يك موضوع ديدن موضوع قبلي :: ديدن موضوع بعدي
برو به صفحه قبلي  1, 2, 3, 4, 5, 6, 7  بعدي

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


جمعه 26 مرداد 1386 - 19:40
پاسخ بصورت نقل قول
بازم به تو رفیق

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
_Akhtar
پیر بازی سازی
پیر بازی سازی


تاريخ عضويت: جمعه 10 فروردين 1386
تعداد ارسالها: 1212


جمعه 26 مرداد 1386 - 20:42
پاسخ بصورت نقل قول
eta نوشته:
راستی ممنون از لینک.
قابل توجه آقا سعید که علاقه مند به استفاده از SDL با زبون #C بود.


بله ، استفاده بردیم ، خیلی ممنون .
فقط زحمت شما یکمقدرای زیاد شد ، که کدهای سه شارپی رو هم بزارید .
البته گفته بودید که یکیه ، درسته ؟ آخه من هنوز مبتدیم .

_________________
تو هم مثل من تازه واردی؟
از اینجـــا شروع کن! <<<


www.Saeed-Shahriyari.ir
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


جمعه 2 شهريور 1386 - 16:21
پاسخ بصورت نقل قول
خوب حالا که SDL رو خوب شناختین!! نوبت به آغاز کار با ++C شده. من تصمیم دارم تا نحوه ساخت یه منوی کوچیک برای یه بازی رو براتون بگم. آخرشم اگه وقت پیدا کردم. کد قابل اجرا هم براتون تهیه می کنم.

بریم سراغ کار:

خوب انشاء الله که مقاله حلقه اصلی بازی رو که توی همین تالار هست خوندید. یا دیگه خودتون وارد هستید.

ما یه کلاس اصلی به اسم GameEngine داریم که توش حلقه اصلی بازیمون رو نوشتیم. ببینید :

این هدرشه :

كد:

#include "GameLoop.h"
#include <vector>

using namespace std;

#ifndef GAMEENGINE_H
#define GAMEENGINE_H

class GameEngine
{
private:
   vector<GameLoop*> loops;
public:
   SDL_Surface* display;
   GameEngine(vector<GameLoop*> loops);
   ~GameEngine(void);
   void start();
};

#endif


اینم CPP اش :
كد:

#include "GameEngine.h"

GameEngine::GameEngine(vector<GameLoop*> loops):loops(loops)
{
   display = SDL_SetVideoMode(800, 600, 32, SDL_DOUBLEBUF|SDL_HWSURFACE);
}

GameEngine::~GameEngine(void)
{
   SDL_Quit();
}

void GameEngine::start()
{
   for(int i=0 ; i<loops.size() ; i++)
   {
      while(loops[i]->getGameCommand() != EXIT)
      {
         if(loops[i]->getGameCommand() == END_LOOP)
            break;
         loops[i]->handleEvents();
         loops[i]->updateGame();
         loops[i]->paint(display);
      }
   }
}
}


خوب همینطور که می بینید.کلاس GameEngine یه کلاس ساده است که تشکیل شده از :

فیلدها :
loops : یه مشت حلقه توی خودش نگه میداره. توی بازیمون می تونیم چند تا حلقه مستقل از هم داشته باشیم. مثل منو، خود بازی و تیتراژ و ...

display : صفحه ایه که ما surface های دیگه رو برای نمایش تصتویر روی اون میکشیم.

روالها :

یه سازنده و مخرب داره که توی سازنده اش SDL راه اندازی و display مقدار دهی میشه. و توی مخربش SDL از کار می افته. (یعنی منابع و زیر سیستمها رو رها سازی میکنه.)

start : میگه که موتور بازیمون باید شروع به کار کنه. اینجا همونجاییه که شما حلقه اصلی بازیتون رو می بینید.

کلاس بعدیمون کلاس GameLoop هستش. ببینید :

هدر :

كد:
#include "sdl.h"

#ifndef GAMELOOP_H
#define GAMELOOP_H

enum GameCommand {CONTINUE=-4, PAUSE=-3, END_LOOP=-2, EXIT=-1};

class GameLoop
{
protected:
   int command;
public:
   GameLoop(void);
   ~GameLoop(void);
   virtual void handleEvents() = 0;
   virtual void updateGame() = 0;
   virtual void paint(SDL_Surface* screen) = 0;
   int getGameCommand();
};

#endif


و CPP :
كد:

#include "GameLoop.h"

GameLoop::GameLoop(void)
{
}

GameLoop::~GameLoop(void)
{
}

int GameLoop::getGameCommand()
{
   return command;
}


همونطور که مشخصه این کلاس یه کلاس مجرده(از صفرهایی که جلوی تعریف توابع در هدر هست). یعنی ما نمیتونیم از این کلاس ارث ببریم.
می گید ارث بردن چیه؟؟ خوب ارث بری یه رابطه ایه بین دو تا کلاس که در اثز اون کلاس قرزند(کلاسی که ارث می بره) برخی از خواص و فیلدهای پدرش(کلاسی که ازش ارث برده میشه) رو بدون نیاز به تعریف مجدد دارا میشه.
حالا می پرسید کلاس چیه؟؟
اینو دیگه شرمنده خودتون برید یاد بگیرید. چون بعدش باز می پرسید ++C چیه!!!
از طرف دیگه این کلاس یه سری توابع virtual داره.
توابع مجازی در مساله polymorphism (چند ریختی) به کار میرن. می پرسید چند ریختی چیه؟؟
خوب چند ریختی یک امکان سطح بالا در زبانهای برنامه نویسیه که شما با استفاده از اون قادر خواهید بود تا با یک آبجکت فارق از این که نوع اون چیه به طوری کلی ارتباط برقرار کنید.
برای مثال یه مشت سرباز رو در نظر بگیرید که هر کدوم یه کاره ای هستند. یکی خمپاره اندازه یکی آر پی جی زنه و ... اینها همگی یک دستور با اسم معین براشون وجود داره که البته تعریف داخلی این دستور برای هر کدوم متفاوته. اون دستور اینه "برید سر پستها تون!!" وقتی فرمانده اینو میگه هر کسی خودش می فهمه باید چی کار بکنه بدون اینکه فرمانده مجبور باشه بدونه کی چی کاره است تا دستور مناسب رو بهش بده.
امیدوارم که گرفته باشید. ما اینجا سه تا روال مجازی داریم، که توی هر کلاسی که از این کلاس ارث ببره تعریف میشن :

1ـhandleEvents : حلقه ها رویدادها رو دریافت و مدیریت میکنند.
2ـ updateGame : حلقه ها خودشون رو به روز می کنند.
3ـ paint : حلقه ها صفحه نمایش رو می کشند.

یه فیلد به اسم command داریم که توی GameEngine ازش استفاده کردیم. به درد دونستن اینکه یه حلق متوقفه(pause)، در حال اجراستیا تمومه و یا این که بازی تمومه می خوره.

یه تابع هم به اسم getGameCommand داریم که command رو بر میگردونه.

کلاس منوی ما یک GameLoop خواهد بود. که توی پست بعدی باهاش آشنا خواهید شد.

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


جمعه 2 شهريور 1386 - 16:22
پاسخ بصورت نقل قول
اگه سوالی درباره مفاهیم ++C یا خود کد دارید بقرمایید.

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
مصطفي سپهريان
پیر بازی سازی
پیر بازی سازی


تاريخ عضويت: جمعه 24 آذر 1385
تعداد ارسالها: 1147
محل سكونت: تو يه فلش مموري دو گيگ


جمعه 2 شهريور 1386 - 21:04
پاسخ بصورت نقل قول
چند وقتي نبودم وقت نداشتم بخونم...
اين پست رو هم زدم كه بدوني هنوز مقالاتت پر طرفداره... C++ BuilderX رو هم انداختم بيرون ... همون VS براي ما خوبه Sad

_________________
«پشتکار»«پشتکار»«پشتکار»
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
lord_akinak
متخصص ساخت بازی
متخصص ساخت بازی


تاريخ عضويت: شنبه 15 ارديبهشت 1386
تعداد ارسالها: 349
محل سكونت: Hell


جمعه 2 شهريور 1386 - 21:45
پاسخ بصورت نقل قول
نقل قول:

C++ BuilderX رو هم انداختم بيرون

من همه تهرانو دنبال اين IDE گشتم، ولی پیدا نکردم ، اونوقت شما می ندازیش بیرون !
کار کردن با Borland جالب تر از Microsoft هست ، ولی عادت کردن به محیطش کمی زمان می بره ....
در هر حال هر کی یه جور سلیقه داره دیگه ... موفق باشی ...

_________________
And hell was so cold
All the vases are so broken
And the roses tear our hands all open
Mother mary miscarry
But we pray just like insects
The world is so ugly now
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
مصطفي سپهريان
پیر بازی سازی
پیر بازی سازی


تاريخ عضويت: جمعه 24 آذر 1385
تعداد ارسالها: 1147
محل سكونت: تو يه فلش مموري دو گيگ


جمعه 2 شهريور 1386 - 22:30
پاسخ بصورت نقل قول
lord_akinak نوشته:
نقل قول:

C++ BuilderX رو هم انداختم بيرون

من همه تهرانو دنبال اين IDE گشتم، ولی پیدا نکردم ، اونوقت شما می ندازیش بیرون !
کار کردن با Borland جالب تر از Microsoft هست ، ولی عادت کردن به محیطش کمی زمان می بره ....
در هر حال هر کی یه جور سلیقه داره دیگه ... موفق باشی ...
مشكل من هم اين بود كه كسي نداشتش Very Happy البته مي دونم كه IDE خيلي خوبيه ولي به قول خودتون عادت كردن به محيطش كمي سخت و زمان بره...
راستي بالاخره پيدا كرديد؟ اگر نه كه يه پيام خصوصي بده تا بفرسم Idea

_________________
«پشتکار»«پشتکار»«پشتکار»
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


شنبه 3 شهريور 1386 - 17:51
پاسخ بصورت نقل قول
ممنون مصطفی
اما از کی تا حالا به یه طرفدار میگن پر(por)

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


جمعه 23 شهريور 1386 - 16:36
پاسخ بصورت نقل قول
اينم قسمت آخر اين آموزشه:
سورس کد به همراه نسخه قابل اجرا

مي تونيد از اين لينک داونلودش کنيد.

اينم يه تصوير از اجراي پروژه.



محدوده آبي مربوط به پس زمينه منوه محدوده قرمز مربوط به پي زمينه زير منوه و دکمه با نوشته سفيد دکمه فعاله. شما مي تونيد با حرکت بر روي دکمه ها دکمه مورد نظرتون رو فعال کنيد. با زدن دکمه شروع بازي رو آغاز کنيد و با فشردن دکمه پايان از بازي خارج بشيد.
دکمه enter هم باعث اجراي فرمان دکمه انتخاب شده ميشه. همه اش همين.

بسم الله!!

تابع start کلاس GameEngine يه فرق کوچولو کرده.
كد:

void GameEngine::start()
{
   for(int i=0 ; i<loops.size() ; i++)
   {
      while(loops[i]->getGameCommand() != EXIT)
      {
         if(loops[i]->getGameCommand() == END_LOOP)
            break;
         loops[i]->handleEvents();
         loops[i]->updateGame();
         loops[i]->paint(display);
      }
      if(loops[i]->getGameCommand() == EXIT)
         exit(0);
   }
}


بقيه کلاسها عبارتند از:
1ـ Menu
2ـ SubMenu
3ـ MenuElement
4ـ Level1
5ـ Button

کلاس Menu :
کلاس Menu يه GameLoopه که به شما امکان داشتن يه منو رو ميده. قسمت مديريت رويدادهاي منو توي اين ملاس نوشته شده.
منوي ما دوتا دکمه داره شروع و پايان. کد مديريت رويدادهاشون رو مي تونيد توي اين کلاس ببينيد.

اين هدرشه :
كد:

#include "GameLoop.h"
#include "SubMenu.h"
#include <vector>

using namespace std;

#ifndef MENU_H
#define MENU_H

class Menu : public GameLoop
{
private:
   int activeSubMenu;
   SDL_Surface* backGround;
   vector<SubMenu*> subMenus;
public:
   Menu(vector<SubMenu*> subMenus, SDL_Surface* backGround);
   ~Menu(void);
   void handleEvents();
   void updateGame();
   void paint(SDL_Surface* screen);
};

#endif


و اين cpp :
كد:
#include "Menu.h"

Menu::Menu(vector<SubMenu*> subMenus, SDL_Surface* backGround) : subMenus(subMenus), backGround(backGround)
{
   activeSubMenu = 0;
}

Menu::~Menu(void)
{
   SDL_FreeSurface(backGround);
}

void Menu::handleEvents()
{
   SDL_Event event;
   int selection;
   while(SDL_PollEvent(&event))
   {
      switch(event.type)
      {
      case SDL_MOUSEMOTION:
         subMenus[activeSubMenu]->handleMouseMotion(event.motion.x, event.motion.y,
            (backGround->w-subMenus[activeSubMenu]->Width())/2,
            (backGround->h-subMenus[activeSubMenu]->Height())/2);
         break;
      case SDL_MOUSEBUTTONDOWN:
         selection = subMenus[activeSubMenu]->handleClick(event.button.x, event.button.y,
            (backGround->w-subMenus[activeSubMenu]->Width())/2,
            (backGround->h-subMenus[activeSubMenu]->Height())/2, event.button.button);
         if(selection == 0)
            command = END_LOOP;
         else if(selection == 1)
            command = EXIT;
         break;
      case SDL_KEYDOWN:
         if(event.key.keysym.sym == SDLK_RETURN)
         {
            selection = subMenus[activeSubMenu]->handleKeyEnter();
            if(selection == 0)
               command = END_LOOP;
            else if(selection == 1)
               command = EXIT;
         }
         break;
      case SDL_QUIT:
         command = EXIT;
         break;
      }
   }
}

void Menu::updateGame()
{
}

void Menu::paint(SDL_Surface* screen)
{
   SDL_BlitSurface(backGround, NULL, screen, NULL);
   SubMenu* submenu = subMenus[activeSubMenu];
   for(int i=0; i<subMenus.size() ; i++)
      subMenus[i]->paint(screen, (backGround->w-submenu->Width())/2,
         (backGround->h-submenu->Height())/2);
   SDL_Flip(screen);
}


تابع paint پس زمينه منو رو مي کشه و بعد به زير منو ميگه تا خودش رو بکشه. لازم به ذکره که افزودن هر گونه جلوه تصويري به سادگي قابل انجامه. مثلا توي همين تابع مي تونيد براي زير منو سايه بزنيد.

کلاس SubMenu :
کلاس SubMenu يه مشت element داره که وظيقه عمومي اش مديريت هموناست. کلاس منو مون براي مديريت رويدادها از روالهاي زير منو استفاده مي کنه. اگه بخوايم ميتونيم از توابع مديريت رويدادهاي element ها هم براي موارد جزئي تر استفاده کنيم.

هدر :
كد:

#include "MenuElement.h"
#include <vector>

using namespace std;

#ifndef SUBMENU_H
#define SUBMENU_H

enum Click {LEFT, RIGHT};

class SubMenu
{
private:
   vector<MenuElement*> elements;
   SDL_Surface* workingSurface;
   SDL_Surface* backGround;
   int activeElement;

public:
   SubMenu(vector<MenuElement*> elements, SDL_Surface* backGround);
   ~SubMenu(void);
   int Width();
   int Height();
   int handleClick(int x, int y, int begX, int begY, int type);
   int handleMouseMotion(int x, int y, int begX, int begY);
   int handleKeyEnter();
   int handlekeyCharacter();
   int handleKeyEscape();
   void paint(SDL_Surface* screen, int x, int y);
};

#endif


cpp :
كد:

#include "SubMenu.h"
#include "mathutil.h"
#include "SDL_gfxPrimitives.h"

SubMenu::SubMenu(vector<MenuElement*> elements,   SDL_Surface* backGround) :
elements(elements), backGround(backGround)
{
   activeElement = 0;
   for(int i=0; i<elements.size() ; i++)
   {
      elements[i]->setX((backGround->w - elements[i]->getPicture().w)/2);
      elements[i]->setY(((4*backGround->h/5)/(elements.size()+1))*(i+1)+elements[i]->getPicture().h/2);
   }
}

SubMenu::~SubMenu(void)
{
   SDL_FreeSurface(backGround);
}

int SubMenu::Width()
{
   return backGround->w;
}

int SubMenu::Height()
{
   return backGround->h;
}

int SubMenu::handleMouseMotion(int x, int y, int begX, int begY)
{
   for(int i=0 ; i<elements.size() ; i++)
   {
      SDL_Rect rect = elements[i]->getPicture().clip_rect;
      rect.x = elements[i]->X();
      rect.y = elements[i]->Y();
      if(isInRect(x-begX, y- begY, rect))
      {
         activeElement = i;
         return i;
      }
   }
   return -1;
}

int SubMenu::handleClick(int x, int y, int begX, int begY, int type)
{
   return handleMouseMotion(x, y, begX, begY);
}

int SubMenu::handleKeyEnter()
{
   return activeElement;
}

int SubMenu::handlekeyCharacter()
{
   return 1;
}

int SubMenu::handleKeyEscape()
{
   return 1;
}

void SubMenu::paint(SDL_Surface* screen, int x, int y)
{
   SDL_Rect dstRect;
   dstRect.x = (screen->w - backGround->w) / 2;
   dstRect.y = (screen->h - backGround->h) / 2;
   dstRect.w = backGround->w;
   dstRect.h = backGround->h;
   SDL_BlitSurface(backGround, NULL, screen, &dstRect);
   int xl = 0, yl = 0;
   for(int i=0; i<elements.size() ; i++)
      elements[i]->paint(screen, x+elements[i]->X(), y+elements[i]->Y(), (activeElement == i) ? SELECTED : 0);
//      rectangleColor(screen, elements[i]->X()+x, elements[i]->Y()+y, elements[i]->X()+elements[i]->getPicture().w+x, elements[i]->Y()+elements[i]->getPicture().h+y, 0x00ffffff);
}



کلاس MenuElemnt :
يه کلاسه که کليه اعضاي زير منو ها از اون ارث مي برن. فعلا به بيش از همين کلاس براي اين دمو نياز نداريم.

هدر :
كد:
#include "MenuElement.h"
#include <vector>

using namespace std;

#ifndef SUBMENU_H
#define SUBMENU_H

enum Click {LEFT, RIGHT};

class SubMenu
{
private:
   vector<MenuElement*> elements;
   SDL_Surface* workingSurface;
   SDL_Surface* backGround;
   int activeElement;

public:
   SubMenu(vector<MenuElement*> elements, SDL_Surface* backGround);
   ~SubMenu(void);
   int Width();
   int Height();
   int handleClick(int x, int y, int begX, int begY, int type);
   int handleMouseMotion(int x, int y, int begX, int begY);
   int handleKeyEnter();
   int handlekeyCharacter();
   int handleKeyEscape();
   void paint(SDL_Surface* screen, int x, int y);
};

#endif



cpp :
كد:
#include "MenuElement.h"
#include "imageutil.h"

MenuElement::MenuElement(SDL_Surface* picture) : picture(picture)
{
   if(picture == NULL)
   {
      width = 0;
      height = 0;
   }
   else
   {
      width = picture->w;
      height = picture->h;
   }
}

MenuElement::~MenuElement(void)
{
   SDL_FreeSurface(picture);
   SDL_FreeSurface(workingSurface);
}

const SDL_Surface& MenuElement::getPicture()
{
   return *picture;
}

void MenuElement::setX(int val)
{
   x = val;
}

void MenuElement::setY(int val)
{
   y = val;
}

int MenuElement::X()
{
   return x;
}

int MenuElement::Y()
{
   return y;
}

int MenuElement::handleClick(int x, int y)
{
   return 0;
}

int MenuElement::handleKeyEnter()
{
   return 0;
}

int MenuElement::handlekeyCharacter()
{
   return 0;
}

int MenuElement::handleKeyEscape()
{
   return 0;
}

void MenuElement::paint(SDL_Surface* screen, int x, int y, int status)
{
   if(width != 0 && height != 0 && screen != NULL)
   {
      workingSurface = applyEffect(status);
      SDL_Rect dstRect;
      dstRect.x = x;
      dstRect.y = y;
      dstRect.w = width;
      dstRect.h = height;
      SDL_BlitSurface(workingSurface, NULL, screen, &dstRect);
   }
}

SDL_Surface* MenuElement::applyEffect(int status)
{
   workingSurface = new SDL_Surface(*picture);
   if(status&SELECTED)
   {
      SDL_LockSurface(workingSurface);
      Uint32 back = getpixel(workingSurface, 0, 0);
      for(int x=0 ; x<workingSurface->w ; x++)
         for(int y=0 ; y<workingSurface->h ; y++)
            if(getpixel(workingSurface, x, y)!= back)
               putpixel(workingSurface, x, y, 0xffffffff);
      SDL_UnlockSurface(workingSurface);
   }
   else
   {
      SDL_LockSurface(workingSurface);
      Uint32 back = getpixel(workingSurface, 0, 0);
      for(int x=0 ; x<workingSurface->w ; x++)
         for(int y=0 ; y<workingSurface->h ; y++)
            if(getpixel(workingSurface, x, y)!= back)
               putpixel(workingSurface, x, y, 0x000000ff);
      SDL_UnlockSurface(workingSurface);
   }
   return workingSurface;
}


تابع applyEffects يهتابعه که براي افزودن effectها به اعضاي زير منو استفاده ميشه. در حال حاضر تنها effect مورد استفاده تغيير رنگ متن گزينه انتخاب شده است.

کلاس Level1 :
اين کلاس به عنوان مرحله اول بازي انتخاب شده. البته درباره طراحي اش ايجاد يک کلاس براي هر مرحله کار عاقلانه اي نيست ولي براي نشون دادن تاثير فشردن دکمه شروع به طور موقتي مورد استفاده قرار گرفته.
فقط هم رويداد خروج رو مديريت مي کنه.
هدر :
كد:
#include "SDL.h"

#ifndef LEVEL1_H
#define LEVEL1_H


class Level1 : public GameLoop
{
private:
   SDL_Surface* backGround;
public:
   Level1(SDL_Surface* backGround) : backGround(backGround) {}
   ~Level1(void)
   {
      SDL_FreeSurface(backGround);
   }
   void handleEvents()
   {
      SDL_Event event;
      while(SDL_PollEvent(&event))
      {
         switch(event.type)
         {
         case SDL_QUIT:
            command = EXIT;
            break;
         }
      }
   }
   void updateGame() {}
   void paint(SDL_Surface* screen)
   {
      SDL_BlitSurface(backGround, &(screen->clip_rect), screen, &(backGround->clip_rect));
      SDL_Flip(screen);
   }
};

#endif



کلاس Button :
اين کلاس در حال حاضر بي کاربرده ولي براي نشون دادن چگونگي توسعه انواع اعضاي زير منو نوشته شده.
هدر :
كد:

#ifndef BUTTON_H
#define BUTTON_H

#include "MenuElement.h"

class Button : public MenuElement
{
public:
   Button(SDL_Surface* picture);
   ~Button(void);
   int handleClick(int x, int y);
   int handleKeyEnter();
   int handlekeyCharacter();
   int handleKeyEscape();
   void paint(SDL_Surface* screen, int x, int y, int status);
};

#endif


cpp :
كد:


#include "Button.h"

Button::Button(SDL_Surface* picture) : MenuElement (picture)
{
}

Button::~Button(void)
{
}

int Button::handleClick(int x, int y)
{
   return 1;
}

int Button::handleKeyEnter()
{
   return 1;
}

int Button::handlekeyCharacter()
{
   return 1;
}

int Button::handleKeyEscape()
{
   return 0;
}

void Button::paint(SDL_Surface* screen, int x, int y, int status)
{
   MenuElement::paint(screen, x, y, status);
}


ساير سورسها :

فايل main.cpp :
منابع رو لود مي کنه و کلا سيستم رو راه اندازي ميکنه.

كد:
#include "SDL.h"
#include "GameEngine.h"
#include "Menu.h"
#include "Button.h"
#include <vector>
#include "Level1.h"
#include "SDL_image.h"

using namespace std;

int main(int a, char* b[])
{
   Button *start;
   Button *end;
   SubMenu *mainMenu;
   Menu *menu;
   Level1 *level1;

   vector<MenuElement*> elements;
   start = new Button(IMG_Load("start.png"));
   elements.push_back(start);
   end = new Button(IMG_Load("end.png"));
   elements.push_back(end);
   vector<SubMenu*> subMenues;
   mainMenu = new SubMenu(elements, IMG_Load("menu main.png"));
   subMenues.push_back(mainMenu);
   vector<GameLoop*> loops;
   menu = new Menu(subMenues, IMG_Load("menu back.png"));
   loops.push_back(menu);
   level1 = new Level1(IMG_Load("level1.png"));
   loops.push_back(level1);
   GameEngine myGame(loops);
   myGame.start();

   delete start;
   delete mainMenu;
   delete menu;
   delete level1;

   return 0;
}
}


فايل : mathutil
كد:

#include "SDL.h"

#ifndef MATHUTIL_H
#define MATHUTIL_H

bool isInRect(int x, int y, const SDL_Rect& rect)
{
   if(x>rect.w+rect.x || x<rect.x || y>rect.h+rect.y || y<rect.y)
      return false;
   return true;
}

#endif


فايل imageutil :
اينا دو تابع براي دريافت و تعيين رنگ يک پيکسل هستند. که توي خود راهنماي SDL نوشته شده بودن.

كد:

#include "SDL.h"

#ifndef IMAGEUTIL_H
#define IMAGEUTIL_H

Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
   int bpp = surface->format->BytesPerPixel;
   /* Here p is the address to the pixel we want to retrieve */
   Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

   switch(bpp) {
      case 1:
         return *p;

      case 2:
         return *(Uint16 *)p;

      case 3:
         if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
         else
            return p[0] | p[1] << 8 | p[2] << 16;

      case 4:
         return *(Uint32 *)p;

      default:
         return 0;       /* shouldn't happen, but avoids warnings */
   }
}

/*
 * Set the pixel at (myX, myY) to the given myValue
 * NOTE: The surface must be locked before calling this!
 */
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
    int bpp = surface->format->BytesPerPixel;
    /* Here p is the address to the pixel we want to set */
    Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

    switch(bpp) {
    case 1:
        *p = pixel;
        break;

    case 2:
        *(Uint16 *)p = pixel;
        break;

    case 3:
        if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
            p[0] = (pixel >> 16) & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = pixel & 0xff;
        } else {
            p[0] = pixel & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = (pixel >> 16) & 0xff;
        }
        break;

    case 4:
        *(Uint32 *)p = pixel;
        break;
    }
}

#endif

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


5 شنبه 29 شهريور 1386 - 16:42
پاسخ بصورت نقل قول
آخرین قسمت آموزش به روز شد.
برخی ایرادات در کد و فایلها برطرف شد.

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نمايش نامه هاي ارسال شده قبلي:   
ارسال يك موضوع جديد   پاسخ به يك موضوع    صفحه 3 از 7 تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد
برو به صفحه قبلي  1, 2, 3, 4, 5, 6, 7  بعدي


 
پرش به:  


شما نمي توانيد در اين انجمن نامه ارسال كنيد.
شما نمي توانيد به موضوعات اين انجمن پاسخ دهيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن ويرايش كنيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن حذف كنيد
شما نمي توانيد در نظر سنجي هاي اين انجمن شركت كنيد


unity3d

بازگردانی به فارسی : علی کسایی @ توسعه مجازی کادوس 2004-2011
Powered by phpBB © 2001, 2011 phpBB Group
| Home | عضويت | ليست اعضا | گروه هاي كاربران | جستجو | راهنماي اين انجمن | Log In |