تور لحظه آخری
امروز : سه شنبه ، 28 فروردین 1403    احادیث و روایات:  امام صادق (ع):آفت دینداری حسد و خودبینی و فخر فروشی است.
سرگرمی سبک زندگی سینما و تلویزیون فرهنگ و هنر پزشکی و سلامت اجتماع و خانواده تصویری دین و اندیشه ورزش اقتصادی سیاسی حوادث علم و فناوری سایتهای دانلود گوناگون شرکت ها

تبلیغات

بلومبارد

تبلیغات متنی

تریدینگ ویو

خرید اکانت اسپاتیفای

کاشت ابرو

لمینت دندان

لیست قیمت گوشی شیائومی

صرافی ارکی چنج

صرافی rkchange

لوله پلی اتیلن

دانلود سریال سووشون

دانلود فیلم

ناب مووی

مرجع خرید تجهیزات آشپزخانه

خرید زانوبند زاپیامکس

رسانه حرف تو - مقایسه و اشتراک تجربه خرید

کلاس باریستایی تهران

تعمیر کاتالیزور

تعمیر گیربکس اتوماتیک

دیزل ژنراتور موتور سازان

سرور اختصاصی ایران

سایت ایمالز

تور دبی

سایبان ماشین

جملات زیبا

دزدگیر منزل

ماربل شیت

تشریفات روناک

آموزش آرایشگری رایگان

طراحی سایت تهران سایت

آموزشگاه زبان

اجاره سند در شیراز

ترازوی آزمایشگاهی

رنگ استخری

فروش اقساطی کوییک

راهبند تبریز

قطعات لیفتراک

وکیل تبریز

خرید اجاق گاز رومیزی

آموزش ارز دیجیتال در تهران

شاپیفای چیست

فروش اقساطی ایران خودرو

واردات از چین

قیمت نردبان تاشو

وکیل کرج

تعمیرات مک بوک

قیمت فنس

armanekasbokar

armanetejarat

صندوق تضمین

سیسمونی نوزاد

پراپ تریدینگ معتبر ایرانی

نهال گردو

صنعت نواز

پیچ و مهره

خرید اکانت اسپاتیفای

صنعت نواز

لوله پلی اتیلن

کرم ضد آفتاب لاکچری کوین SPF50

دانلود آهنگ

طراحی کاتالوگ فوری

واردات از چین

اجاره کولر

دفتر شکرگزاری

 






آمار وبسایت

 تعداد کل بازدیدها : 1796382214




هواشناسی

نرخ طلا سکه و  ارز

قیمت خودرو

فال حافظ

تعبیر خواب

فال انبیاء

متن قرآن



اضافه به علاقمنديها ارسال اين مطلب به دوستان آرشيو تمام مطالب
archive  refresh

طراحی و ساخت یک Game Engine -


واضح آرشیو وب فارسی:سایت ریسک: طراحی و ساخت یک Game Engine Mahdi_Rashed 15 مرداد 1388, 12:15قبل از هر بحثی بهتره که تعریف کنیم یک Game Engine مناسب و استاندارد چیه و چه کارایی رو بر عهده داره Game Engine در اصل یک سیستم مدیریت و طراحی بازیه که تمام بخشهای طراحی , برنامه نویسی و ... رو در هنگام طراحی و هنگام انجام بازی به عهده داره . در اصل Game Engine هسته ی اصلی بازیهای رایانه یا دیگر کنسولهاست و معمولاً در اکثر پروژه های طراحی بازی یک Game Engine مخصوص برای اون نوشته میشه . ولی بهترین نوع یک Game Engine , نوعی هست که قابلیت انعطاف پذیری بالایی داره و میشه از اون در چند پروژه ی مختلف استفاده کرد . Game Engine ها به طور کلی به چهار دسته تقسیم میشن ( از نظر سبک بازی که روی سبک نوشتن Game Engine تاثیر داره ) 1 : Game Engine برای سبک First Person و یا اول شخص و سوم شخص که معروفترین Engine های این سبک رو Unreal Engine و Cry Engine تشکیل میدن 2 : Rial Time strategy هست یا همون سبک استراتژیک که خودشون باز به دو دسته ی 3D Base و 2D Base تقسیم میشه که توضیح میدم بعداً . توی این سبک Engine های معروفی وجود داره که معمولاً خصوصی ساخته میشه و به فروش نمیرسه . مثل Ensemble Studio Game Engine 3 : سبک Vehicle Simulation Game Engine یا شبیه سازهای وسایل نقلیه . قوی ترین و مهمترین این Engine ها World Engine هست که FSX رو با این Engine ساختن . البته این Engine هم برای فروش ساخته نشده . 4 : Engine هایی که برای چند سبک مختلف که معمولاً اول شخص و شبیه سازی هست ساخته میشن . مهمترین Engine به جز Unreal Engine میشه به Rage Engine هم اشاره کرد که باهاش GTA رو طراحی کردن . توی همین مبحث که ایجاد کردم آموزش طراحی یک Game Engine رو قرار میدم . ممنون :rose: Mahdi_Rashed 15 مرداد 1388, 12:39برای طراحی یک Game Engine باید از یکی از زبانهای طراحی که شی گرا باشه استفاده کرد تا راحتتر بشه یک Game Engine ایجاد کرد . پیشنهاد من زبانهای برنامه نویسی C# و DirectX هست که در نهایت یک Game Engine با زبان اسکریپت نویسی DirecX XNA تحویل شما میده . شی گرا هم هست . نسبت به C و C++ هم کمتر bug داره . برنامه نویسی شی گرا هم که میدونم همه میدونید چیه یک زبان با قابلیت های مختلف هست که به کاربر زحمت نوشتن عناصر ارتباط با کاربر رو نمیده و اون عناصر رو به صورت آماده در اختیارش قرار میده . Engine که طراحی میشه اگر با قابلیت شی گرا باشه خیلی راحت Object مورد نظر رو انتخاب میکنید و کد ها رو بهش میدیم . ولی اگر شی گرا نباشه باید اول شی رو فراخوانی کنید و در تمام تگهای Target اسم شی رو بیارید که هم زمانبره و هم نسبت به زبان شیگرا در 3D دیرتر Load میشه . هم چنین علت انتخاب C# هم به جز قابلیت خوب شی گرا قابلیت فراخوانی راخت کلاسهای برنامه نویسی و دارا بودن تمام کدهای C و C++ هست پس به طور کلی برای طراحی یک Game Engine ساده از نوع 4 به موارد زیر نیاز دارید : - Visual Studio 2008 که پک XNA 3.1 رو داشته باشه . لینک هم گذاشتم برای XNA 3.1 - DirectX SDK 9 و 10 که از سایت ماکروسافت میشه دانلود کرد . اگر دوست داشتین که بازی برای DirectX 10 هم باشه SDK 10 رو دانلود کنید . فقط اشتباهاً Component های Direct ور دانلود نکنید . - DirectX Debug Library که باید هر هفته Update بشه تا بتونه همه ی باگها رو رفع کنه - یک نرم افزار مثل Shader fx برای نوشتن زبان Shader و open GL - یک نرم افزار طراحی 3بعدی و 2 بعدی که بعداً به درد میخوره مثل 3D Max و Photoshop سیستمتون هم نباید از دو هسته پایینتر باشه . مدل سایه زن کارت گرافیک یا Shader هم 3 کمتر باشه توابع Normal map عمل نمیکنه به خوبی . همچنین کار گرافیک باید محاسبه گر phisix هم داشته باشه که اگر nVIDIA هست حتماً داره ولی ATI رو نمیدونم . اگر هم نداشت میتونید کارت سخت افزاریش رو بخرید . دیگه رم و دیگر مشخصات هم در حدی باشه که جواب بده . Mahdi_Rashed 15 مرداد 1388, 12:56اولین کلاسی که باید نوشته بشه مربوط میشه به تعریف مختصات 3بعدی که اسمش هست Vector3 . این کلاس اول با مقادیر 0 وارد میشه و در هنگام انجام عملیات مقادیر x.Y.Z رو از ماتریسهای 3بعدی دریافت میکنه و تغییر میده . این کلاس برای هر شی تعریف میشه که اطلاعات مختصاتی رو داره . در موارد کاملتر سرعت و شتاب و ... هم تعریف میشه کرد براش . شکل کلی کلاس اینه : public struct Vector3 { public float X = 0.0; public float Y = 0.0; public float Z = 0.0; } //Endسیستم محاسبات مختصات مثل طول و عرض و ارتفاع به صورت پیشفرض Feet هست که بعداً با کد تبدیل اون رو به متر یا مایل تغییر میدیم . این کلاس در Game Engine به دو صورت کلی آدرس دهی میشه . World و Local یا مختصات جهانی و محلی که مربوط میشه به مقیاس کاری که انجام میشه . برای نوشتن ای پن کلاس هم یک Empty Project از منوی C# انتخاب کنید بعد با گزینه ی Add Calss این کلاس رو تعریف کنید . () Animated Man 15 مرداد 1388, 13:12اوه چقدر سریه !!! معلومه کلی چیز میز چتد وقتیه تو دستات بوده !!! یا بهتره بگم مایو پوشیده بودی ولی آب نبود شنا کنی !!! مرسی عالیه Mahdi_Rashed 15 مرداد 1388, 13:55این تابع که تغییر یافته ی Vector3 هست برای گردش و دوران حول یک محور نوشته میشه و واحد پیشفرض اون رادیان هست که قابل تغییره . این کلاس از سه قسمت pitch یا دوران حول محور X و Yaw یا دوران حول محور Y و Roll یا دوران حول محور Z هست که در مقدارشون در حالت معمولی 0 درنظر گرفته میشه تا یک ماتریس روی مقادیرشون تغییر ایجاد کنه .کد این کلاس اینه : public struct Attitude { public float Pitch = 0.0; public float Yaw = 0.0; public float Roll = 0.0; } //end این دورانها در حالت + در جهت عقربه های ساعتن و در حالت - عکس جهت حرکت عقربه های ساعت . () Mahdi_Rashed 15 مرداد 1388, 15:03تابع mesh یک مجموعه توابع پیشرفته ی محیط 3بعدیه که اطلاعات زیادی رو در خودش جای داده و به 3 بخش face یا صفحه , Edge یا خطوط لبه دار و Vertex یا گره که هرکدوم به طور جداگانه دارای اطلاعاتی از قبیل مختصات شخصی , UV مخصوص , ساختمان داده , کد و Texture هستند که در پستهای بعد کلاس کلی اونها رو تعریف میکنم . اگر که Direct X با نسخه ی آخر روی سیستم نصب باشه نیازی به تعریف کلی نیست . یعنی فقط یکی از بخشها تعریف میشه و به 3 کلاس مختلف تقسیم میشه تا یک Object سه بعدی بوجود بیاد . هم چنین این کلاسها از دو قسمت TU و TV تشکیل شده که با اتصال کدهای او به هم مختصات 2بعدی طرح روی صفحه مشخص میشه یا UVW اون مشخص میشه . :rose: Mahdi_Rashed 15 مرداد 1388, 16:49توضیحات در پست قبل . شکل کلی : public struct Vertex { public Vector3 Point; public Vector3 Normal; public Color Diffuse; public Color Specular; public float TU = 0.0; public float TV = 0.0; } //EndPoine همون مختصات توی حالت World یا Local Normal همون جهت بازتاب نور محیطه Diffuse لایه ی اصلی Texture حساب میشه و در بعضی Engine ها به اسم master شناخته میشه Specular نوعی تکسچر با کانالهای سیاه و سفید که موتونه مقدار هم بگیره و از 1 هست تا 100 TU و TV هم توی پست بالا توضیح دادم که چیه البته این کلاس در مراحل بعدی کار کاملتر میشه . () Mahdi_Rashed 15 مرداد 1388, 18:56این یک کلیپ 50 ثانیه ای که درست کردم تا اونایی که نمیدونن چطور کلاس جدید وارد Object Browser کنن یاد بگیرن Codec کلیپ Camtasia هست و فرمت mp4 با حجم 450 kb Class.rar () Mahdi_Rashed 15 مرداد 1388, 19:27زبانهای برنامه نویسی شی گرا مثل C# از رابط استفاده مینن که باعث میشه یک شی خواص و کدهای شی دیگه رو به ارث ببره . رابط یا Interface در game Engine هم همین کار رو با کمی تغییرات برای انجام میده . کلاس رابط از چند تابع مختلف تشکیل میشه . اولین تابع , تابع IRenderable هست که با ایجاد این تابع در کلاس رابط با استفاده از زیر شاخه های Render قادر به ترسیم تصویر اشیاست . توی یک محیط میشه بیش از یک IRenderable تعریف کرد . دومین تابع , تابع ICullable هست که میتونه توی همه ی کلاسها و توابع خالی و بدون استفاده پیاده بشه و وضعیت پنهان یا آشکار بودن یک شی رو مشخص کنه . ICullable با دو وضعیت Culled و IsCulled اشیا رو از نظر آشکار یا پنهان بودن مدیریت میکنه . سومین تابع , تابع ICollidable هست که وضعیت فیزیکی و مختصاتی یک شی رو نسبت به یکی دیگه از نظر تداخل با هم مدیریت میکنه . این تایع تقریباً بخشی از عملیات Dynamic رو در Engine انجام میده . 2 ویژگی مهم این تابع عبارتند از Vector3 بودنش که سازگاری با سیستم مختصاتی چند شی رو داره یا همون وزن مرکزی اشیا (Centerofmass ) و ویژگی دومش تایین کننده ی مرکز مختصات جهانی با استفاده از یم BoundingRadius که در بعضی از Engine ها به عنوان Sky Box شناخته میشه و یک کره ی توخالیه که تمام صحنه رو در بر میگیره و هیچ عنصری نمیتونه ازش خارج بشه . تابع ICollidable خودش به دو تابع تقسیم میشه . اولی CollideSphere هست که وظیفه ی مدیریت فاصله ی دوجسم به هم و به بیننده رو داره . یعنی اگر فاصله ی دو جسم نسبت به هم زیاده و احتمال برخوردشون به هم خیلی کمه این تابع از روی اون دوتا شی برداشته میشه تا سرعت پردازش زیاد بشه و هم چنین برخورد دو جسم در دور دست که چشم ببیننده اونا رو نمیبینه یا با خطا میبینه رو چشم پوشی میکنه تا باز هم سرعت پردازش زیاد بشه . دومی هم CollidePolygon هست که مختصات صفحات جسم رو نسبت به Vector3 و مختصات جهانی طوری تغییر میده که در هنگام بروز خطا در محاسبه ی یم برخورد غیر معمول از اون چشم پوشی کنه و سیستم رو وادار به بیخیال شدن محاسبه های غیر ممکن میکنه . تابع بعدی IDynamic هست که بسیار مهم و پیچیده ی و فقط یک زیر شاخه ی Update داره که چون خیلی زیاده بعداً توضیح میدم . تابع بعدی که آخریش باشه ITerrainInfo هست و کارش در بر گیرنده ی همه ی مشخصات زمین بازی هست و 3 تا پارامتر داره . اولین پارامتر HeightOfTerrain یا HeightAboveTerrain هست که محدوده ی بازی رو نسبت به محور y مشخص میکنه . دومین پارامتر InLineOfSight هست که کارش مدیریت وجود یا عدم وجود دید خطی کاربر به یک نقطه بار گرافیکی اون نقطه رو کم میکنه تا سرعت پردازش افزایش پیدا کنه . سومین پارامتر هم GetSlope هست که هماهنگی اشیا داخل سیستم Dynamic رو با پستی و بلندی و به طور کلی صفحات شی زمین ایجاد میکنه . توی پست بعد طریقه ی نوشتن این کلاس نسبتاً بزرگ ( کلاس رابط ) رو میگم . Mahdi_Rashed 15 مرداد 1388, 19:49توضیحات در پست قبل : کد کلاس این شکلیه : public interface IRenderable { void Render(Camera cam); } public interface ICullable { bool Culled { set; } bool IsCulled { set; } } public interface IColladable { Vector3 CenterOfMass { get; } float BoundingRadius { get; } bool CollideSphere(Object3D Other); bool CollidePolygon(Vector3 Point1, Vector3 Point2, Vector3 Point3); } public interface IDynamic { void Update(float DeltaT); } public interface ITerrainInfo { float HeightOfTerrain(Vector3 Position); float HeightAboveTerrain(Vector3 Position); bool InLineOfSight(Vector3 Position1, Vector3 Position2); Attitude GetSlop(Vector3 Position, float Heading); } //End () Mahdi_Rashed 15 مرداد 1388, 21:00در ضمن این روش که من دارم آموزش میدم روش برنامه نویسی یک کتاب هست به اسم Introduction to 3D Game Engine Design Using DirectX 9 and C# - Apress Engine نوشته ی lynn thomas harrison با کمی تغییرات در کدها و یک سری امکانات اضافه که از چند تا کتاب دیگه و تجربه ی خودم بهش اضافه کردم . Mahdi_Rashed 16 مرداد 1388, 09:59با این که این بخش زیاد مربوط به طراحی Game Engine نمیشه , ولی بهتره یک سری تعاریف رو بدونیم تا به ما در ساخت یک Game Egnine استاندارد کمک کنه . یک سری مراحل هست که باید اونها رو حتماً در طراحی بازی مشخص کرد و البته کار ساده ای هم هست . 1 : صفحه ی مخصوص طراح - Developer Splash Screen 2 : صفحه ی اول بازی - Game Splash Screen 3 : گزینه ها , منو و تنظیمات بازی 4 : خود بازی و اجرا 5 : اعمالی که در حین انجام با هر یک از موارد بالا به صورت نا محسوس اتفاق می افته حالا موارد بالا رو یکی یکی توضیح میدم 1 : صفحه ی مخصوص طراح : وقتی یم بازی رو شروع میکنیم همیشه لوگوی تصویر سازنده یا استدیویی که بازی رو ساخته دیده میشه . این کار برای این صورت میگیره که کاربر هم بدونه که بازی توسط کی ساخته شده و هم از کپی برداری غیر مجاز جلوگیری بشه . این صفحه در Game Engine یک تابع ثابت هست که همیشه منتظر یک عمل از طرف کاربر که فشار دادن یک دکمه هستش . این عمل این صفحه رو میبره و Engine رو به دستورات بعد از دستور رسیده از کاربر هدایت میکنه . صفحه ی مخصوص طراح میتونه یک عکس باشه تا یک قیلم چند دقیقه ای یا حتی یک قطعه صدا . تابعش به صورت زیره و توضیحاتش رو بعداً در دروس آینده میگم : m_Engine.ShowSplash("Mjidonline_Intro.avi" , 8 , newCGameEngine.BackgroundTask(LoadOption)); //End 2 : صفحه ی اول بازی : کد و تابع هاش شبیه نمونه ی بالاس و فقط از نظر محتویات فرق داره . یعنی به جای لوگوی سازنده یک Demo یا عکس از بازی یا یک فیلم کوتاه از علت شروع کننده ی داستان بازی رو نمایش میده . 3 : گزینه ها , منو و تنظیمات بازی : 99 درصد بازی ها این بخش رو دارن که شامل منو , تصویر زمینه و تنظیمات و انتخابهای کاربر است . کاربر با فشار یک دکمه Game Engine را وادار به اجرای مجموعه کدهای پایه و کد های بارگذاری اطلاعات میکنه که نهایتاً یکی از مراحل بازی یا تغییر تنظیمات رو برای ما ظاهر میکنه . 4 : خود بازی و اجرا : اجرای بازی مجموعه ای از کدها و توابع اجرا شده توسط Game Engine هستند . کدها و توابعی که ما برای Engine تعریف کردیم یا Engine اونها رو به صورت Dynamic ایجاد کرده . در اجرای یک بازی چند اتفاق می افته : - پردازش ورودیهای کاربر . - محاسبه ی اعمال از پیش تعریف شده مثل یک Cut-scene . - به روز رسانی وضعیت اشیا و عناصر بازی که اشیایی که دارای تابع IDynamic هستند چگونه و چند وقت یکبار Update شوند . - تبادل اطلاعات از طریق خود کامپیوتر , Lan و اینترنت برای بازیهای چند نفره . - پیکر بندی فریمها و زمان نمایش هر فریم . 5 : اعمالی که در حین انجام با هر یک از موارد بالا به صورت نا محسوس اتفاق می افته : شامل یک سری کارهای Engine که به جز محاسبه و رندر در یم صحنه باید انجام دهد که کوچکترین مثالش نمایش و محاسبه ی امتیازات هست یا تعداد فشنگ و ... Mahdi_Rashed 16 مرداد 1388, 23:56این کدی که اینجا میگم باید در قالب فایل Code در Engine قرار بگیره تا سیستم بتونه تمام فعالیتهای داخل صحنه ی 3D رو با اسم sys_code دریافت کنه و به کنسول بازی که خود System هست انتقال بده . کد وقتی کامل اجرا میشه که تمام اصلاحگرای Direct X نصب شده باشه . شکل کلی کد اینه public struct system { public interface sys_base { public void sys_code = true & false; public void sys_access = true & false; public void sys_program = true & false; } public interface sys_int { public int X = 0.0; public int Y = 0.0; public int Z = 0.0; } public interface sys_render { public float X = 0.0; public float Y = 0.0; public float Z = 0.0; } } //Endمیبینید که توابع code که کار شناسایی رو داره , access که کار اجازه یا عدم اجازه ی استفاده از کد رو میده و program که ورژن اصلاحگر رو شناسایی میکنه دو حالت true و false دارن . sys_int هم وظیفش تعریف مختصاتیه که باید به کنسول منتقل بشه . تابع sys_render هم که مشابه Vectore3 هست وظیفه ی دریافت داده رو از ماتریس 3بعدی و استفاده در مواقعی که تابع sys_int که ظرفیت 1 تا 100 واحد بر میلی ثانیه هست کم میاره به کمکش بره . :rose: Mahdi_Rashed 17 مرداد 1388, 11:14رابط کاربر به طور کلی هر وسیله ای هست که بتونه محیط بازی رو به کاربر متصل کنه و از keyboard و ... شروع میشه و مانیتور رو نیز شامل میشه . رابط های کاربری هر کدوم توسط توابع مخصوص برای هر بازی به صورت جداگانه نوشته میشن . مثلاً در توابع keyboard هر دکمه معلوم میشه و وظیفه ای بهش داده میشه . موس و دیگر وسایل نیز به همین صورت . البته مانیتور چون از کارت گرافیک تبعیت مینه نیازی به تابع جداگانه نداره و یک تابع اصلی در خود Game Engine براش تعریف میشه . توی دروس آینده به تعریف رابط کاربر و به شرح موارد زیر میپردازیم 1 : تابع ورودی از keyboard 2 : تابع ورودی از Mouse 3 : تابع ورودی از دسته های بازی با استفاده از سیستم مدیریت ویندوز vista 4 : تابع های مربوط به رابط ورودی Mahdi_Rashed 17 مرداد 1388, 22:19برای ورودی گرفتن از keyboard راههای زیادی هست که آسونترین و بهترینش رو توضیح میدم . یکی از ویژگی ها و کلاسهای پیشفرض DirectX و DirectInput , کلاس هست که در زیر اشاره کردم . در زبان c# این جور برنامه نویسی , فرا خواندن کلاس از Object Browser نام داره : using Microsoft.DirectX.DirectInput.SystemGuid;این دستور کلیه ی توابع مربوط به Directinput رو از شاخه ی Systemguide فراخوانی مکنه تا راحتتر بشه برنامه نوشت . حالا که این دستور رو نوشتین برای گرفتن ورودی از Keyboard کد زیر ور وارد میکنیم . Device KeyboardDev = new Device( SystemGuide.Keyboard);با اجرای این دستور keyboard داخل Game Engine شناخته میشه و آماده ی اجرای دستورات کاربری میمونه . البته اگر دستور تعریف شده باشه . حالا باید کیبورد رو پیکر بندی کرد یا دستور بهش داد . اولین تابع دستوری برای کیبورد SetCooperativeLevel هست که کارش ارتباط Game Engine با کاربر با توجه به حدود و دستورات خاص در هر بازه ی زمانی . منظور از حدود , 5 محدودیت هست که به صورت پارامتر برای فراخوانی کلاس ایجاد میشن . پس به خط اول برنامه میریم و این دستور فراخوانی رو مینویسیم : using Microsoft.DirectX.DirectInput.CooperativeLevel.Fla gs;حالا پارامترهای محدودیت سازی رو در زیر به عنوان نکته به برنامه اضافه میکنیم //Background //Exclusive //Foreground //NonExclusive //No WindowsKey Background / Foreground و Exclusive / NonExclusive دو تابع با عمل یکسان هستند که برای دکمه هایی که نمیشه با هم کار کنن یا با هم فشار داده شوند محدودیت تعریف مینه . NoWindowsKey هم مشخص میکنه که کجا دکمه ی Windows غیر فعال بشه تا به کار Engine لطمه وارد نشه و مثل صفحه ی Loading . دستور اجرای این تابع رو میگم . البته همه جا کاربرد نداره به همین دلیل به عنوان نکته به برنامه اضافه میکنیم . /* KeyboardDev.CooperativeLevel( m_Form, CooperativeLevelFlags.NoWindowsKey | CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Foreground ); */ حالا داخل توابع کیبور و Directinput تابع از پی تعریف شده ی DataFormat هست که کارش فعال کردن پیکر بندی هایی که برنامه نویس انجام داده . که تابع Aquier این کار رو انجام میده . و همچنین مقایسه ی بین مراحل دریافت داده یکی از وظیفه هاش که با Poll انجام میشه . کد تابع بصورت زیره : KeyboardDev.SetDataFormat(DeviceDataFormat.Keyboar d;) Private KeyboardState m_Keydata = null; M_Keydata = KeyboardDev.GetCurrentStat(); حالا Game Engine میتونه از داده هایی مثل کد زیر استفاده کنه و دستورات رو اجرا کنه :if ( m_Keydata[Key.A]) // Function پس کلید A با یک سری دستورات پیکر بندی میشه . پیکر بندی رو موقع طراحی بازی انجام میدن . حالا که Engine میتونه Keyboard رو بشناسه و از دستوراتش استفاده کنه باید خود Keyboard رو از سخت افزار برای Game Engine جدا کرد تا دستورات با همه نوع کیبوردها set بشه . این کار رو توابعی مثل Unacquire و Dispos انجام میشه . در زبان C# این توابع کاملتر هم هست که میشه به IDisposable اشاره کرد که زبان C++ این تابع رو نداره . Mahdi_Rashed 18 مرداد 1388, 12:17کد همه ی دکمه های یک Keyboard و تعریف یک Function . البته هر دکمه ای که نوشته نشه تعریف نمیشه و کاری انجام نمیده . using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Majid_Online_Game_Engine { public struct KeyboardClass { public int Key_A = true & false & "Function"; public int Key_B = true & false & "Function"; public int Key_C = true & false & "Function"; public int Key_D = true & false & "Function"; public int Key_E = true & false & "Function"; public int Key_F = true & false & "Function"; public int Key_G = true & false & "Function"; public int Key_H = true & false & "Function"; public int Key_I = true & false & "Function"; public int Key_J = true & false & "Function"; public int Key_K = true & false & "Function"; public int Key_L = true & false & "Function"; public int Key_M = true & false & "Function"; public int Key_N = true & false & "Function"; public int Key_O = true & false & "Function"; public int Key_P = true & false & "Function"; public int Key_Q = true & false & "Function"; public int Key_R = true & false & "Function"; public int Key_S = true & false & "Function"; public int Key_T = true & false & "Function"; public int Key_U = true & false & "Function"; public int Key_V = true & false & "Function"; public int Key_W = true & false & "Function"; public int Key_X = true & false & "Function"; public int Key_Y = true & false & "Function"; public int Key_Z = true & false & "Function"; public int Key_1 = true & false & "Function"; public int Key_2 = true & false & "Function"; public int Key_3 = true & false & "Function"; public int Key_4 = true & false & "Function"; public int Key_5 = true & false & "Function"; public int Key_6 = true & false & "Function"; public int Key_7 = true & false & "Function"; public int Key_8 = true & false & "Function"; public int Key_9 = true & false & "Function"; public int Key_0 = true & false & "Function"; public int Spacebar = true & false & "Function"; public int Key_Lshift = true & false & "Function"; public int Key_Rshift = true & false & "Function"; public int Key_Latl = true & false & "Function"; public int Key_Ralt = true & false & "Function"; public int Key_Lctrl = true & false & "Function"; public int Key_Rctrl = true & false & "Function"; public int Key_tap = true & false & "Function"; public int Key_Enter = true & false & "Function"; // other ......... } } Mahdi_Rashed 19 مرداد 1388, 17:37تابع ورودی موس تقریباً شبیه کیبورده و از همه ی زیر شاخه های کیبورد پیتیبانی میکنه . درواقع Directinput رابطه ی قویی بین این دوتا برقرار کرده . نمونه کدهای موس این شکلیه : MouseDev = new Device ( SystemGuide.Mouse); MouseDev.SetCooperativeLevel(m_form, CooperativeLevelFlags.//Exclusive or Foreground ); MouseDev.SetDataForamt ( DeviceDataFormat.Mouse); بزرگترین تفاوت کدهای موس و کیبورد تابع MouseState هست که برای کنترل حرکت موس بین محور های X , Y و Z و کنترل دکمه های موس استفاده میشه و منظور از محور Z حرکت قرقره ی موس هستش که + و - داره . این هم کدش : MouseState m_Mousedata = new Mousestate(// x,y,z,btn1,btn2,btn3 ); همونطور که از توابع Acquire , unacquire برای اتصال یا قطع کردن کیبورد به سخت افزار و تعریف به صورت نرم افزاری , از تابع poll موس رو برای سخت افزار تعریف میکنیم و با دستور Unacqire اون رو نابود میکنیم از حالت سخت افزاری . این هم کد poll : m_mousedata = MouseDev.CurrentMoiseState();دستورا دکمه ها هم برای توابع Function به صورت زیر نمایش و نوشته میشه . برای دکمه ی چپ از LeftMousebtn یا Mousebtn1 برای دکمه ی وسط از MiddelMousebtn یا Mousebtn3 و برای دکمه ی سمت راس از RightMousebtn یا Mousebtn2 استفاده میشه . :):rose: Mahdi_Rashed 20 مرداد 1388, 14:10برای ورودی گرفتن از یک gamepad یا دسته ی بازی چند راه وجود داره که راه استاندارد اون استفاده از مدیریت gamepad ویندوزه . یعنی اول با کد مدیریت gamepad ویندوز رو به دست میگیریم . بقیه ی کارها هم میفته دست همون قسمت . برای شناسایی gamepad این کد رو مینویسیم : foreach(DeviceInstance Instance in maneger.GetDevice(DeviceClass.GameControl,enumDevi cesFlags.AttachedOnly)) { JoystickDev = new Device ( Instance.InstanceGuid); Break; } توجه داشته باشین مه با این کار فقط دسته توسط Game Engine پیدا میشه . ولی عملی انجام نمیده . چون سطح محدودیت و دستور براش تعریف نشده . برای تعریف کردن دستور و محدودیت این کد ها رو هم وارد میکنیم : JoystickDev.SetCooperativeLevel ( winHandle, CooparativeLevelFlags.//Flags ); JoystickDev.SetDataFormat ( DeviceDataFormat.Joystick); میبینید که تابع شبیه تابعهای موس هستش . چون کاربرد دسته ی بازی شبیه موسه خوب حالا نیاز به یک متغیر به اسم m_Joystick داریم تا مقادیر JoystickState رو در خودش جا بده . کد این هم مینویسیم تا این قسمت کامل بشه : m_Joystick = JoystickDev.CurrentJoystickState; با این که بعضی ار توابع دسته ی بازی شبیه موسه ولی کاملاً جداگانه عمل میکنه . :rose: Mahdi_Rashed 20 مرداد 1388, 14:38لطفاً به سایت زیر برین و به نظرسنجی پاسخ بدین که آیا آموزش طراحی Game Engine ادامه پیدا کنه یا نه ؟ اگر آره بیشتر بود که همین Engine رو آموزش میدم . ولی اگر نه بیشتر بود Engine های دیگه و هم چنینی Engine خودم رو آموزش میدم ممنون :D تا 20 شهریور ادامه داره . یعنی 1 ماه Mahdi_Rashed 22 مرداد 1388, 12:39سلام ایم کلاس ماتریس هستش که نیاز به توضیح نداره . این کلاس تمام قواعد رندر next gen رو داره و تعریف کلیش در directX 10 نوشته شده . فقط این کلاس وارد میشه تا سیستم کلاس های DirectX 10 رو فر�




این صفحه را در گوگل محبوب کنید

[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 536]

bt

اضافه شدن مطلب/حذف مطلب







-


گوناگون

پربازدیدترینها
طراحی وب>


صفحه اول | تمام مطالب | RSS | ارتباط با ما
1390© تمامی حقوق این سایت متعلق به سایت واضح می باشد.
این سایت در ستاد ساماندهی وزارت فرهنگ و ارشاد اسلامی ثبت شده است و پیرو قوانین جمهوری اسلامی ایران می باشد. لطفا در صورت برخورد با مطالب و صفحات خلاف قوانین در سایت آن را به ما اطلاع دهید
پایگاه خبری واضح کاری از شرکت طراحی سایت اینتن