PDA

نسخه کامل مشاهده نسخه کامل : ساختار یه بازی از پایه



EYEprogrammer
08-05-2014, 20:53
سلام!
در حال آغاز یه بازی هستم رو SDL با C++ و در مورد ساختارش یه سری سوال ها داشتم که شاید بتونم اینجا پاسخ بگیرم!!
کلا اگه کسی با ساختار انجین ها و بازی ها آشنایی داره کمک کنه چون قبلا تجربه ای رو این نداشتم!!! ساختار خودمم هم به این شکله که (فعلا) یه حلقه هست که سه تا تابع داره، اینپوت، آپدیت، درا که اینپوت هرچی ورودی هست رو میگیره آپدیت نسبت به اونها تغییر میده روی مدل و درا مدل رو رندر میکنه! مدل هم یه کلاسه که یه سری آبجکت تو خودش داره(مث تکست و بکگراند و اینحرف ها) که یه سری حرکت کننده اند یه سری نه! آبجکت هاش هم یه کلاس کلی آبجکت ن که چیزایی مث کاراکتر و اسپرایت های دیگه ارث میبرن ازش این وسط!!! حالا این یه مقدار نا مطمئن و خامه و میخواستم بدونم اگه کسی نظری داره چه حرفه ای چه نه خوشحال میشم!

ehsan_wwe
08-05-2014, 21:48
سلام این حلقه به خیلی چیزا احتیاج داره
مثلا اگه i = با یک باید استارت بشه استارت معمولا مقدار های اولیه برای یه بازی توش داده میشه
یا یه پارامتر برای حرکت ها حرکت ها
برای هر آبجکت یه مارتیکس بساز 3 در 3 که توش scale rotation posiion رو قرار بدی که به اینا همه varable[,,] vector میگن
برای دایرکس بگو چه کارایی می خوای بکنی یادت باشه حتما از collada برای ایمپورت ابجکت استفاده کنی که یه دیتابیس کامل میده از همه چیش
و از api های directx 11 برای به روز بودن انجین:n12:

همینارو فعلا یادم میومد موفق باشی

god of war 2
08-05-2014, 23:02
سلام.
ساختار حلقه در پایه ایی ترین حالت همینجوری هست یعنی معمولا 3 تا تابع اصلی هستند که به ترتیب دریافت ورودی - آپدیت - رسم رو انجام میدن. اما با توجه به نوع طراحیت میتونی این ساختارو به حالت های دیگه مثل رویدادگرا (Event) گسترشش بدی.
یه مثال ساده برای بخش input به این شکله که شما یک ساختار رویداد تعریف میکنی که مثلا شامل آخرین کلید فشرده شده , آخرین مختصات موس, ... هست. داخل تابع ورودی این ساختار رو برای هر فریم مقدار دهی میکنی و در نهایت این ساختار رو به تنهایی به تابع کنترل ورودیت ارسال میکنی بجای اینکه مستقیما در هر فریم تمام ورودی هارو چک کنی. مزیتی که این روش داره اینه که برای هر فریم و در 1 لحظه کل وضعیت ورودی رو با یک ساختار مناسب در اختیار داری. اگر دیده باشید در بعضی از بازیها حرکات ترکیبی به نام combo وجود داره که با "فشردن همزمان چند کلید" صورت میگیره. این جور مواقع مثالی که در بالا زدم میتونه خیلی مفید باشه برای تشخیص و پردازش تمام کلید های فشرده شده در یک زمان.
برای تابع update زیاد جالب نیست که همه چیز رو update کنی بجاش میتونی ساختاری پیاده کنی که فقط بخشی که در حال حاضر در حال رسم شدن هست رو آپدیت کنه.
همچنین برای رسم میتونی این کارو انجام بدی.
از این دست مسائل شامل جزئیات زیادی میشه که در نهایت باعث میشه این 3 تابع اصلی به شاخه های زیادی تقسیم بشن و از حالت خام و نا مطمئن خارج بشن.

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

EYEprogrammer
10-05-2014, 00:37
خیلی ممنون و خیلی مفید بود! میخواستم بدونم از نظر شما توی حلقه اصلی مود های مختلف برای منو و بازی و ... بذارم یا همه رو به شکل ورلد در بیارم و یه جور رفتار کنم باهاشون(یعنی منو هم یه نوع ورلد باشه که آبجکتاش دکمه ها و اینا هستن یا مثلا صفحه ای که اول بازی میاد هم یه ورلد باشع که یه عکس داره و ...)؟

god of war 2
10-05-2014, 01:17
بستگی داره که منطور شما از ورد یا word چی باشه؟؟ یا اصلا با چه برنامه ایی داری کار میکنی و واژه ورد داخل اون برنامه چطور تعریف شده باشه؟؟؟
اگر از انجین های آماده ساخت بازی استفاده میکنی که من تجربه ایی راجبش ندارم و نمیتونم راهنماییت کنم.
ولی اگر از پایه داری کار میکنی پس در اینصورت وردی وجود نداره و شما با یکسری اشیاء پایه مثل sprite, color, line,text , .... سروکار داری. این اشیاء نقش آجر در ساخت ساختمان رو ایفا میکنند. یعنی به فرض مثال یک منو تشکیل میشه از 1 شی sprite و تعدادی شی text که بصورت منظم زیر هم دیگه قرار گرفتن و یک منوی کشویی رو تشکیل دادن. یا مثلا یک دکمه دقیقا یک sprite هست که نسبت به وضعیت موس واکنش نشون میده.
اما راجب اینکه صفحه شروع بازی مجزا باشه از مراحل بازی بستگی به طراحی ساختارت داره. معمولا سازندگان بازی منوی شروع بازی رو مجزا از گیم پلی بازی تعریف میکنن. حتی من در مواردی دیدم که فایل منو مستقل از فایل اصلی بازی هست یعنی منو در یک فایل exe جداگانه قرار داره و تمام تنطیمات رو ست میکنه بعد فایل اصلی بازی که یک exe دیگه هست رو با تنظیمات مناسب run میکنه. این کار از نطر فنی میتونه مزیت های زیادی داشته باشه مثلا منوی شروع همیشه در بالاترین کیفیت نمایش داده میشه چون پردازش زیادی نداره و مشکلی ایجاد نمیکنه و میتونه به کاربر حس خوبی رو منتقل کنه. اما این اختیار رو به کاربر میده که بتونه مثلا از بخش option تنطیمات گرافیکی "بازی اصلی" که در یک فایل exe دیگه هست رو خودش مدیریت کنه و وقتی که گزینه play رو کلیک میکنه فایل exe بازی اصلی با تنطیمات گرافیکی خود کاربر run بشه. برای این کار هم روشهای متنوعی وجود داره میتونی مثلا تنظیمات رو داخل یک فایل ذخیره کنی و بازی از رو اون فایل تنظیمات رو بخونه. یا میتونی تنظیماتت رو مستقیما از طریق پارامتر به فایل exe ارسال کنی و ...
----
در کل اگر قصد داری که بازیتو از پایه بنویسی باید مسائل "خیلی زیادی" رو در نطر بگیری ...

EYEprogrammer
10-05-2014, 07:20
خیلی ممنون !!:n01: اما منظور من از ورلد با «ل» world بود. که یه شیءه که آبجکت های بازی رو تو خودش داره مثلا همین اسپرایت ها و تریگر ها و تکست و ... یه سری آبجکتن که داخل worldان! و پرسش اصلیم هم این بود که با منو مثل یه world رفتار کنم یعنی تکست ها و دکمه ها و ... رو آبجکت هایی تصور کنم که توی worldام و بعد با ورودی آپدیتشون کنم یا این که یه مود جداگونه بذارم برای منو که توی وایلم در صورت استیت منو اون رو انجام بدم. برای مثال؛
حالتی که توش مستقیم با world سر و کار دارم: [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حالتی که مود منو جداگونه س: [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

به نظرم اولی بهتره ولی نظر شما رو هم میخوام بدونم.

god of war 2
10-05-2014, 17:50
خوب شاید این سوالتو دوستای دیگه بهتر بتونن جواب بدن ولی نظر من اینه که کارو پیچیده نکن!
صفحه شروع بازی یا منوی شروع بازی هیچ تفاوتی با خود بازی نداره یعنی همه از اجزای مشابه تشکیل شدن, همه نیاز به آپدیت و رسم شدن دارن. پس لزومی نداره که متفاوت باهاشون رفتار کنی. فقط ساختارتو طوری طراحی کن که بتونی منابع اون قسمتی که بهش نیاز نداری رو آزاد کنی. مثلا وقتی بازی شروع میشه دیگه نیازی به منوی شروع نداری پس باید منابعی که اشغال کرده رو آزاد کنی و بلعکس وقتی کاربر وارد منوی شروع میشه این امکانو داشته باشی که دوباره ایجادش کنی (منابع رو بهش برگردونی).

EYEprogrammer
11-05-2014, 10:21
خیلی باز هم ممنون!! در مورد پکیج بندی کار یه پکیج World مد نظرمه (که توش Object هست با خود کلاس World -که world توش یه تابع آپدیته که خودشو با اینپوت آپدیت میکنه) و بقیه آبجکت ها که از خود آبجکت ارث میبرن) با یه Utilities که باید باشه همیشه به هر حال(که توش چیزایی مث ابزار هندسی و ادیتور و اینا هست) و Input که توش چیزایی که مربوط به ورودیه میره و Render که ابزار مخصوص نمایش و اینا رو اینور کنترل میکنم... فعلا پرسش دیگه ای ندارم ولی باز هم خوشحال میشم نظر کسی رو بدونم(چون تا حالا یه پروژه ی انجین مانند به این بزرگی و پر جزییاتی نداشتم)

ehsan_wwe
11-05-2014, 18:04
من هرچی فک میکنم نمیفهمم ان world چیه ؟
روشن تر بگو داری چی کار میکنی ؟
یه کلاس ساختی برا اینکه پراسس پایین بیاد فقط وقتی keypress داریم لوپ کنه ؟ این لوپ تو اولین خط یا آخریشم رندر بشه ؟ بعد ای این میگی world

خواهشن eng حرف بزن بیشتر من اصلا با واژه های فارسی آشنایی ندارم مثل ارث بری (فکنم یه جور brush fire باشه درسته ؟)

EYEprogrammer
11-05-2014, 19:16
من تا حالا یه بازی رو از پایه نساختم ولی دیگه فکر کنم این مفهوم روشن باشه که هر جوری هم شما بخواید ساختارش (structure) رو طراحی (design) کنید باید یه class داشته باشید که همه ی آبجکت (object) های اون level یا بازیتون رو توش نگه دارید. اسمشو هم من گذاشته ام World حالا یکی میتونه بذاره Level یا هرچی.

ارث بری (class inheritance) هم که دیگه یکی از ساده ترین مفاهیم شی گرایی(object oriented) هست.

حلقه(loop) هم برای اینه که هر فریم (frame) یه کد اجرا بشه که ورودی(input) بگیره با اونا World یا همون بازی رو update کنه و بعد draw یا همون render کنه! تا برا فریم بعدی. این ساختار، استاندارد جایی نیست ولی تا اونجایی که من خوندم و کار کردم نزدیک به یه ساختار خوبی هست(هنوز شروع به نوشتنش نکرده‌ام)

ehsan_wwe
12-05-2014, 13:45
سیستم اندروید تو حالت دیفالت مثل ساختار شماست فقط با ورودی update میکنه کلاس اصلی رو
ایده خیلی خیلی خوبیه برا بازی های فکری یا board game ها
راستی من شی گرایی رو هم نشنیده بودم همیشه به اسم OO میشناختمش مرسی برا ترجمه (جایی هست معانی فارسی این اطلاعات رو داشته باشه ؟ اصلا ارزش داره فارسی هارو یاد بگیرم ؟)

راستی یه سوال هدفت از اینم انجین چیه می خوای Donate بگیری یا می خوای تجاری کنیش ؟ یه به عنوان یه تجربه کاری بهش نگاه میکنی
قراره انجینت چه فرمت هایی publish بده
اصلا render رو چی اجرا میکنی OpenGL یا Directx بعد چه ورژنی اگه جفتشونه که کار بزرگیه parallel rendering
بعد قراره دو بعدی باشه اگه دو بعدیه میشه بدون این دوتا SDK هم کار کرد و به اسطلاح software رندر کرد

اگه می خوای سبک بشه سعی کن از الگوریتم های پیشبینی تو فانکشن های فیزیکیت استفاده کنی تا هر فریم آپدیت نکنه پیشبینی کنه (با این کار حدود 30% از process رو میاری پایین

EYEprogrammer
12-05-2014, 18:49
*اینارو همینطور فارسی من تو مدرسه یاد گرفتم ولی انگلیسیشون رو هم میدونم نمیدونم هم مهمه فارسیش یا نه ولی کتابای فارسی از فارسیاش استفاده میکنند(بعضی از ترجمه هاش هم خیلی دور از ذهنه مث heap که میشه پشته)

*زیاد نمیشه گفت انجین ولی میخوام باهاش بازی های آینده ام رو بسازم. که این بازیا رو هم قصد تجاری بودنشون رو دارم البته! دو بعدی هم هست... دلیل این که از unity و flash و ... استفاده نمیکنم هم اینه که یه تجربه بزرگه در بیشتر زمینه های برنامه نویسی (از طراحی نرم افزار تا دیباگ و ورژن بندی) بدست میارم با این کار ولی ممکنه روی unity هم برم (چون برای console و smart phone راحت تر خروجی میده)

*فعلا نمیخوام کار رو جدی کنم تا حدودای مرداد ولی ممنون از راهنماییتون :n01:

ehsan_wwe
12-05-2014, 19:41
Unity برای ماها که برنامه نویسی بدون OO رو بلدیم چیز خوبی نیست چون خیلی محدوده و بیشتر تکنولوژی هاش بر میگرده به سال های 2007 و اطراف

فلش که گفتی کلآ فازش فرق داره و با Functions های vector و Image processing کار میکنه تغریبآ از لحاظ ساختار هیچ ربطی به انجین های بازی سازی نداره

برای خروجی اندروید اگه می خوای حتما از API های Opengl ES 2 استفاده کن یادت نره تو جاوا کد باید بزنی
اگه این کارو کنی دردسر نوشتن کامپایلر رو نداری
دردسر اجرا نشدن تو CPU architecture های مختلف smart phone هارو نداری
و....
پس به نظر من
سویچ کن رو JAVA اگه دوست نداری مجبوری از کامپایلر های آماده پیش بری و ...

سوالی بود در باره خروجی ها در خدمتم

EYEprogrammer
13-05-2014, 16:22
آخه از طرفی میخوام یه وقت اگه یه روز گفتن موقعیتش پیش اومده که رو کنسول یا گوشی پیادش کنم لازم نباشه کل کار رو رو SDK اونا با OpenGL یا DirectX پیاده کنم. راحت با یونیتی اینپوتش رو تغییر بدم و یه خروجی ازش بگیرم و از طرفی هم میخوام که تجربه خوبی تو برنامه نویسی دستم بیاد ... برای همین یه مقدار مرددم! به احتمال زیاد همین رو رو ++c ادامه میدم و اگر هم تونستم برای کنسول پیادش کنم یکی رو پیدا میکنم که برام پورتش کنه رو openGL یا DirectX یا Android یا خودم پورتش میکنم!

ehsan_wwe
14-05-2014, 22:05
راستی OpenGL و Java هم اندرویده هم PSP و محصولات پلی استیشن هم windows
از این نظرایی که میگی یونیتی آسونه ولی فکر نکنم هزینه اولیه خروجی رو کنسول رو داشته باشی
سوای اینکه باید جزو بر ترین ها register شده باشی تا اجازه خروجی داشته باشی ( البطه vitara فرق داره قضیه اش )

EYEprogrammer
14-05-2014, 22:51
*در مورد اون فک کنم با OpenGL و ++C بنویسمش بهترین راه باشه چون اونوقت راحت تر به play station میتونم خروجی بدم. کلا هم کی به XBox توجه میکنه وقتی Xbox one گند زده!!!!

*فکر اونجاش رو هم کردم! موضوع خیلی پیچیده س ولی در هر صورت نمیخوام بازیم آخرش از یه گوشه ی greenlight سر در بیاره و مجبور شم رو gog.com بذارمش تا شاید یه روزنه امیدی بشه و اینا! میخوام درست حسابی روی PSN و steam منتشر بشه و یه بازخورد درست حسابی داشته باشه. راهش رو هم میدونم ولی از ایران زیاد جالب نمیشه! برا همین باید یه جوری فقط سعی کنم وارد نمایشگاه های درست حسابی شم و تو مسابقه های جهانی شرکت کنم که ناشر پیدا کنم! اونوقت همه چی خوب پیش میره تقریبا!

ehsan_wwe
15-05-2014, 09:51
سلام
تفکرت در مورد بازار بازی ایران و جهان 90% اشتباهه
من چندین ساله دارم رو این بازی تحقیق میکنم و کلی آزمون خطا دادم
شرکت تو مسابقه راه خوبیه
نمایشگاه STEAM و psn ایده های سوخته و کار نشده است
ناشرم هم ریخته اندازه مو های سرت باید دید کارت چیه
از معروف ترینا تا درپیت ها

یکم جستجو کنی با 4 5 تا اینکاره دوست شی راهاشو بهت میگن ( اینجا محیط پابلیک هست و من نمی خوام نتایج بازار کارمو که به سختی بدست آوردم بنویسم ولی باورکن بجز شرکت تو مسابقه اگه 3 4 تا مقدمه دیگه هم جور کنی 100% میری تو بازار جهانی)
:n12:

EYEprogrammer
15-05-2014, 21:47
اینقدرا هم غلط نیست... نظر من اینه که اگه آدم بخواد تو جهان کارش به صورت مستقل بگیره یا باید رو اینترنت سر و صدا کنه و خب مسلما منتشر بشه که ترکیب این دوتا موفقیت رو میاره!!! که برای اون هم باید تو نمایشگاهایی مث PAX و comic con و ... شرکت کنه یا تو مسابقه هایی مث Indiecade و IGF و ... که بعد بتونه خبراش پخش شه و ناشرا بدونن در باره ش! همینجوری با صحبت کردن و اینا خیلی سخت تره! برای مثال خود steam به شخصه بازیای فینالیست IGF رو وارد سیستم انتشارش کرد! یا play station خیلی حمایت میکنه از عنوان های مستقل اگر که باهاش قرارداد داشته باشی که اون هم در صورت وجود ناشره. پس مرحله اول مسلما شرکت کردن توی نمایشگاه ها و مسابقاته! (که تو ایران این چیزا معادل جشنواره بنیاد ملی بازی های رایانه ای و نمایشگاه بازی های رایانه ای عه) بعد مرحله دوم میشه ناشر و انتشارات و سرمایه گذارا و بعد هم میشه خود انتشار!! این روش نسبت به سیستم های self-publishing مث greenlight و gog خیلی بیشتر جواب میده! با تشکر!! --پاسخم رو هم از تاپیک گرفتم رو OpenGL و ++C و خیلی ممنونم!

ehsanyacoza0021
25-05-2014, 22:52
این کتابو سرج کن پیدا میکنی خیلی کمکت میکنه مخصوصا اگه میخوای واقعا یه چیزی درست کنی که بشه بهش گفت انجین و بتونی در آینده توسعش بدی و همینطور براش ادوطور درست کنی

Game Enigne Archtecture
by Jason Gregory ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) (Author), Jeff Lander ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) (Foreword), Matt Whiting ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) (Foreword)