-
ساختار یه بازی از پایه
سلام!
در حال آغاز یه بازی هستم رو SDL با C++ و در مورد ساختارش یه سری سوال ها داشتم که شاید بتونم اینجا پاسخ بگیرم!!
کلا اگه کسی با ساختار انجین ها و بازی ها آشنایی داره کمک کنه چون قبلا تجربه ای رو این نداشتم!!! ساختار خودمم هم به این شکله که (فعلا) یه حلقه هست که سه تا تابع داره، اینپوت، آپدیت، درا که اینپوت هرچی ورودی هست رو میگیره آپدیت نسبت به اونها تغییر میده روی مدل و درا مدل رو رندر میکنه! مدل هم یه کلاسه که یه سری آبجکت تو خودش داره(مث تکست و بکگراند و اینحرف ها) که یه سری حرکت کننده اند یه سری نه! آبجکت هاش هم یه کلاس کلی آبجکت ن که چیزایی مث کاراکتر و اسپرایت های دیگه ارث میبرن ازش این وسط!!! حالا این یه مقدار نا مطمئن و خامه و میخواستم بدونم اگه کسی نظری داره چه حرفه ای چه نه خوشحال میشم!
-
سلام این حلقه به خیلی چیزا احتیاج داره
مثلا اگه i = با یک باید استارت بشه استارت معمولا مقدار های اولیه برای یه بازی توش داده میشه
یا یه پارامتر برای حرکت ها حرکت ها
برای هر آبجکت یه مارتیکس بساز 3 در 3 که توش scale rotation posiion رو قرار بدی که به اینا همه varable[,,] vector میگن
برای دایرکس بگو چه کارایی می خوای بکنی یادت باشه حتما از collada برای ایمپورت ابجکت استفاده کنی که یه دیتابیس کامل میده از همه چیش
و از api های directx 11 برای به روز بودن انجین:n12:
همینارو فعلا یادم میومد موفق باشی
-
سلام.
ساختار حلقه در پایه ایی ترین حالت همینجوری هست یعنی معمولا 3 تا تابع اصلی هستند که به ترتیب دریافت ورودی - آپدیت - رسم رو انجام میدن. اما با توجه به نوع طراحیت میتونی این ساختارو به حالت های دیگه مثل رویدادگرا (Event) گسترشش بدی.
یه مثال ساده برای بخش input به این شکله که شما یک ساختار رویداد تعریف میکنی که مثلا شامل آخرین کلید فشرده شده , آخرین مختصات موس, ... هست. داخل تابع ورودی این ساختار رو برای هر فریم مقدار دهی میکنی و در نهایت این ساختار رو به تنهایی به تابع کنترل ورودیت ارسال میکنی بجای اینکه مستقیما در هر فریم تمام ورودی هارو چک کنی. مزیتی که این روش داره اینه که برای هر فریم و در 1 لحظه کل وضعیت ورودی رو با یک ساختار مناسب در اختیار داری. اگر دیده باشید در بعضی از بازیها حرکات ترکیبی به نام combo وجود داره که با "فشردن همزمان چند کلید" صورت میگیره. این جور مواقع مثالی که در بالا زدم میتونه خیلی مفید باشه برای تشخیص و پردازش تمام کلید های فشرده شده در یک زمان.
برای تابع update زیاد جالب نیست که همه چیز رو update کنی بجاش میتونی ساختاری پیاده کنی که فقط بخشی که در حال حاضر در حال رسم شدن هست رو آپدیت کنه.
همچنین برای رسم میتونی این کارو انجام بدی.
از این دست مسائل شامل جزئیات زیادی میشه که در نهایت باعث میشه این 3 تابع اصلی به شاخه های زیادی تقسیم بشن و از حالت خام و نا مطمئن خارج بشن.
--------
راجب SDL باید بگم که این کتابخانه از روش نرم افزاری برای رسم استفاده میکنه و شما امکان استفاده از سخت افزار گرافیکی (کارت گرافیک) و قدرت سخت افزاری رو نداری.
-
خیلی ممنون و خیلی مفید بود! میخواستم بدونم از نظر شما توی حلقه اصلی مود های مختلف برای منو و بازی و ... بذارم یا همه رو به شکل ورلد در بیارم و یه جور رفتار کنم باهاشون(یعنی منو هم یه نوع ورلد باشه که آبجکتاش دکمه ها و اینا هستن یا مثلا صفحه ای که اول بازی میاد هم یه ورلد باشع که یه عکس داره و ...)؟
-
بستگی داره که منطور شما از ورد یا word چی باشه؟؟ یا اصلا با چه برنامه ایی داری کار میکنی و واژه ورد داخل اون برنامه چطور تعریف شده باشه؟؟؟
اگر از انجین های آماده ساخت بازی استفاده میکنی که من تجربه ایی راجبش ندارم و نمیتونم راهنماییت کنم.
ولی اگر از پایه داری کار میکنی پس در اینصورت وردی وجود نداره و شما با یکسری اشیاء پایه مثل sprite, color, line,text , .... سروکار داری. این اشیاء نقش آجر در ساخت ساختمان رو ایفا میکنند. یعنی به فرض مثال یک منو تشکیل میشه از 1 شی sprite و تعدادی شی text که بصورت منظم زیر هم دیگه قرار گرفتن و یک منوی کشویی رو تشکیل دادن. یا مثلا یک دکمه دقیقا یک sprite هست که نسبت به وضعیت موس واکنش نشون میده.
اما راجب اینکه صفحه شروع بازی مجزا باشه از مراحل بازی بستگی به طراحی ساختارت داره. معمولا سازندگان بازی منوی شروع بازی رو مجزا از گیم پلی بازی تعریف میکنن. حتی من در مواردی دیدم که فایل منو مستقل از فایل اصلی بازی هست یعنی منو در یک فایل exe جداگانه قرار داره و تمام تنطیمات رو ست میکنه بعد فایل اصلی بازی که یک exe دیگه هست رو با تنظیمات مناسب run میکنه. این کار از نطر فنی میتونه مزیت های زیادی داشته باشه مثلا منوی شروع همیشه در بالاترین کیفیت نمایش داده میشه چون پردازش زیادی نداره و مشکلی ایجاد نمیکنه و میتونه به کاربر حس خوبی رو منتقل کنه. اما این اختیار رو به کاربر میده که بتونه مثلا از بخش option تنطیمات گرافیکی "بازی اصلی" که در یک فایل exe دیگه هست رو خودش مدیریت کنه و وقتی که گزینه play رو کلیک میکنه فایل exe بازی اصلی با تنطیمات گرافیکی خود کاربر run بشه. برای این کار هم روشهای متنوعی وجود داره میتونی مثلا تنظیمات رو داخل یک فایل ذخیره کنی و بازی از رو اون فایل تنظیمات رو بخونه. یا میتونی تنظیماتت رو مستقیما از طریق پارامتر به فایل exe ارسال کنی و ...
----
در کل اگر قصد داری که بازیتو از پایه بنویسی باید مسائل "خیلی زیادی" رو در نطر بگیری ...
-
خیلی ممنون !!:n01: اما منظور من از ورلد با «ل» world بود. که یه شیءه که آبجکت های بازی رو تو خودش داره مثلا همین اسپرایت ها و تریگر ها و تکست و ... یه سری آبجکتن که داخل worldان! و پرسش اصلیم هم این بود که با منو مثل یه world رفتار کنم یعنی تکست ها و دکمه ها و ... رو آبجکت هایی تصور کنم که توی worldام و بعد با ورودی آپدیتشون کنم یا این که یه مود جداگونه بذارم برای منو که توی وایلم در صورت استیت منو اون رو انجام بدم. برای مثال؛
حالتی که توش مستقیم با world سر و کار دارم:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حالتی که مود منو جداگونه س:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
به نظرم اولی بهتره ولی نظر شما رو هم میخوام بدونم.
-
خوب شاید این سوالتو دوستای دیگه بهتر بتونن جواب بدن ولی نظر من اینه که کارو پیچیده نکن!
صفحه شروع بازی یا منوی شروع بازی هیچ تفاوتی با خود بازی نداره یعنی همه از اجزای مشابه تشکیل شدن, همه نیاز به آپدیت و رسم شدن دارن. پس لزومی نداره که متفاوت باهاشون رفتار کنی. فقط ساختارتو طوری طراحی کن که بتونی منابع اون قسمتی که بهش نیاز نداری رو آزاد کنی. مثلا وقتی بازی شروع میشه دیگه نیازی به منوی شروع نداری پس باید منابعی که اشغال کرده رو آزاد کنی و بلعکس وقتی کاربر وارد منوی شروع میشه این امکانو داشته باشی که دوباره ایجادش کنی (منابع رو بهش برگردونی).
-
خیلی باز هم ممنون!! در مورد پکیج بندی کار یه پکیج World مد نظرمه (که توش Object هست با خود کلاس World -که world توش یه تابع آپدیته که خودشو با اینپوت آپدیت میکنه) و بقیه آبجکت ها که از خود آبجکت ارث میبرن) با یه Utilities که باید باشه همیشه به هر حال(که توش چیزایی مث ابزار هندسی و ادیتور و اینا هست) و Input که توش چیزایی که مربوط به ورودیه میره و Render که ابزار مخصوص نمایش و اینا رو اینور کنترل میکنم... فعلا پرسش دیگه ای ندارم ولی باز هم خوشحال میشم نظر کسی رو بدونم(چون تا حالا یه پروژه ی انجین مانند به این بزرگی و پر جزییاتی نداشتم)
-
من هرچی فک میکنم نمیفهمم ان world چیه ؟
روشن تر بگو داری چی کار میکنی ؟
یه کلاس ساختی برا اینکه پراسس پایین بیاد فقط وقتی keypress داریم لوپ کنه ؟ این لوپ تو اولین خط یا آخریشم رندر بشه ؟ بعد ای این میگی world
خواهشن eng حرف بزن بیشتر من اصلا با واژه های فارسی آشنایی ندارم مثل ارث بری (فکنم یه جور brush fire باشه درسته ؟)
-
من تا حالا یه بازی رو از پایه نساختم ولی دیگه فکر کنم این مفهوم روشن باشه که هر جوری هم شما بخواید ساختارش (structure) رو طراحی (design) کنید باید یه class داشته باشید که همه ی آبجکت (object) های اون level یا بازیتون رو توش نگه دارید. اسمشو هم من گذاشته ام World حالا یکی میتونه بذاره Level یا هرچی.
ارث بری (class inheritance) هم که دیگه یکی از ساده ترین مفاهیم شی گرایی(object oriented) هست.
حلقه(loop) هم برای اینه که هر فریم (frame) یه کد اجرا بشه که ورودی(input) بگیره با اونا World یا همون بازی رو update کنه و بعد draw یا همون render کنه! تا برا فریم بعدی. این ساختار، استاندارد جایی نیست ولی تا اونجایی که من خوندم و کار کردم نزدیک به یه ساختار خوبی هست(هنوز شروع به نوشتنش نکردهام)