ساخت انجین بازی Game engine

saalek110

Well-Known Member
من در حال ساخت یک بازی سه بعدی هستم. ولی به مشکلاتی برخوردم که می خواهم آنها را به کمک شما برطرف کنم.
بازی با opengl و زبان سی نوشته شده.
بازی تجاری نیست و فقط تفریحی است.
تصمیم من اینه : رسم اشیا با opengl و بقیه کارها با زبان سی.
دنبال موتورآماده نیستم.
روی نسخه ویندوزی مدتی است کار می کنم. ممکن است نسخه اندرویدی هم داشته باشد و از طریق سایت با هم در ارتباط هستند. یعنی محیط ساخته شده در ویندوز از طریق سایت به گوشی منتقل می شود.
انتقال اطلاعات بین ویندوز و گوشی با فایل های دانلودی از سایت است. قسمت اپلود و دانلود سایت را امروز نوشتم.
Php AND HTML
بیشتر محیطی ۳ بعدی و زیباسازی منظور است. درخت و خانه های زیبا و ... ولی هوش مصنوعی بازی مسلما لطف خاص خودش را دارد. یک سری حیوانات هم قراره بسازم و روی حرکات نرم آنها کارخواهم کرد.
در بلندر اشیایی می سازم و به بازی منتقل می کنم. مخصوصا انسان و حیوان.



قصد دارم کمی هم سرچ کنم در مورد روش ساخت انجین بازی. تا تکنیک های دیگران را بخوانم.


با دو سری مشکل فعلا روبرو هستم:
اول: باید در ترسیمات صرفه جویی کرد تا برنامه کند نشود.
دوم : هوش بازی چطور ساخته شود.
 
آخرین ویرایش:

saalek110

Well-Known Member
در مورد مشکل اول خوب فکر می کنم باید رسم های غیرضروری حذف شود.
مثلا اشیای دور که به چشم بازیکن نمی آید رسم نشود. و از این جور صرفه جویی ها.
روش برنامه نویسی پیشنهادی من اینه که هر شی مختصات دو بعدش مشخص باشد(مثلا x و y اش ) و مشخصات بازیکن(player_x و player_y ) هم مشخص باشد و رسم کننده بازی با توجه به سایز اشیا(و افقی یا عمودی بودن ) و دوری از بازیکن تصمیم بگیرد آن اشیا را رسم کند یا نه.
 

saalek110

Well-Known Member
در مورد مشکل دوم یعنی هوش برنامه من تصمیم دارم آبجکتهای بازی را دسته بندی کنم.
برای سادگی فهم مطلب فرض کنید فقط 3 نوع آبجکت داریم. 1-بازیکن 2- دشمن 3-دیوارها
کار این طوری برای هوش برنامه ساده است. چون 3 نوع جنس بیشتر نیست و با توجه به مختصات و طرز قرارگیری هر یک تصمیماتی می گیرد.

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

saalek110

Well-Known Member
معرفی activeworlds.com : دنیایی مجازی مثل secondlife است. ولی کم هزینه تر است و ساده تر. البته من مجانی ساخت و ساز می کنم.
ActiveWorlds

اکتیو ورلد یک نرم افزار ویندوزی دارد که دانلود می کنید. و بعد ساختن اکانت در سایت می توانید در زمین های مجانی آن ساخت و ساز کنید.
اکثرا اهل ایالات متحده هستند و برای تقویت زبان انگلیسی هم خوب است.

علت معرفی این نرم افزار این بود که ساخت و سازها در این محیط خیلی ساده انجام می شود. بدون برنامه نویسی میشه یک شهر کامل ساخت.
من خیلی ایده ها را برای ساخت نرم افزارم از این محیط گرفتم.

مثلا دیواری را با کلیک کپی می کنید و با چند حرکت کلیدهای جهت کیبورد می گذارید کنار قبلی. یا با 6 چرخش 90 درجه دیوار می چرخد و حکم کف پیدا می کند.
آنهایی که دنیای شخصی می خرند می توانند آبجکت های ساخته شده 3 بعدی را آپلود کنند. ولی در قسمت مجانی همان ساختمان سازی هست فقط.

a22.jpg
عکس بالا یکی از دنیاهای پولی است. جاده اش هنوز لود نشده و اون اشیای قرمز کوچک هم آبجکتهایی هستند که باید لود شوند. درخت ها را یا خود شخص ساخته یا از جایی مجانی یا پولی تهیه کرده.

09.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
برمی گردم به بحث تاپیک : سطوح در بازی می تواند افقی یا عمودی باید و سطوح عمودی هم می تواند در راستای شمال به جنوب یا شرق به غرب باشد.
بعضی سطوح هم مایل هستند. مثلا سطح یک تپه که بازیکن روی آن بالا می رود.
من قصد دارم به هر یک از این سطوح کدی اختصاص دهم. مثلا کدهای 1 تا 8 . و بازیکن هم کدش فرضا صفر باشد.
در قسمت هوش برخورد برنامه برخورد و تماس بازیکن با هر یک از سطوح را بررسی می کند.

پس
تمام اجزای بازی به شکل کد ذخیره می شود. مثلا
1 10 10 5 5 5 ......
1 10 10 5 5 10......
2 5 5 20 20 5.........
قرمزها کدها و سبزها مختصات است.

اعداد یک و دو در بالا کدهای اشیا هستند. مثلا 1 دیوار عمودی و 2 دیوار افقی است. و اعداد بعدی اندازه و مختصات و دیگر مشخصات مثل کد تکسچر است.
تکسچر مثلا دیوار طرح آجری دارد یا لباس بازیکن طرح پارچه دارد یا زمین تکسچر چمن دارد. یعنی عکس چمن روی صفحات افقی انداخته می شود.
r4.jpg
برنامه رسم با دانستن این کدها بازی را رسم می کند
و برنامه هوش با دانستن این کدها جریان بازی را کنترل می کند.

ولی همه چیز به شکل کد در
آرایه
یا فایل
یا دیتابیس
یا به شکل کد درون برنامه
ذخیره می شود.
 
آخرین ویرایش:

saalek110

Well-Known Member
از شی گرایی می خواهم در جهت راحت کردن کدنویسی استفاده کنم.
مثلا یک انسان یا حیوان در کلاس خودش محاسبه کند کدام قسمت بدنش چقدر فرضا به سمت شمال بیرون زده تا به هوش کلی برنامه(هوش سنترال برنامه ) در محاسبه برخوردها کمک کند.
خوب دستش به دیوار بخوره فرق داره تا سرش بخورد. مخصوصا در نزاع ها اینها مهم است. مثل شمشیر زنی.


همچنین حرکت دادن دست و پا به کلاس خود حیوان یا انسان سپرده می شود. و کلاس مذکور گزارشهایی را در موقع لزوم به هوش مرکزی برنامه ارسال می کند.
 

saalek110

Well-Known Member
در ضمن من با چند تا بازی ساز کار کردم و آشنایی دارم. مثل یونیتی و udk
به نظرم خوبه کمی آشنا بشوید. چون به ما ایده می دهد تا از قسمتهایی از کارهای آنها استفاده کنیم.

udk.jpg unity3d.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
تا می توانید ادواتی ایجاد کنید که از حالت run خارج نشوید.

توصیه ای که خودم می توانم بکنم این است که تا می توانید محیط کار خود را بهتر کنید.
مثلا برای تنظیم محل یک دیوار مدام از حالت run خارج نشوید . من 3 متغیر برای تنظیم محل هر شی اختصاص دادم که به مختصات x و y و z آن شی اضافه می شود و آن 3 متغیر را می توانم راحت تغییر دهم. مثلا با یک منو. این طوری برای تنظیم محل هر شی کلی در وقت صرفه جویی می شود.

a3.jpg f4.jpg
یا اینکه اشیایی که می سازم مختصات همه در فایلی جمع می شود و بعد می توانم همه را یک جا به برنامه اضافه کنم.
از قدرت برنامه نویسی برای رفاه خود استفاده کنید.
 
آخرین ویرایش:

saalek110

Well-Known Member
یک سوال : آیا میشه از سرورهای php مجانی برای پردازش بازیهای خود در کامپیوتر استفاده کنیم؟

یعنی اطلاعات را ارسال کنیم. در سرور پردازش بشود و نتیجه را مدام دریافت و در بازی استفاده کنیم.
 
آخرین ویرایش:

saalek110

Well-Known Member
من الان یک برنامه php هم روی لوکال و هم یک هاست مجانی php اجرا کردم. زمان اجرا یکی بود. چرا؟

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

در php زمان max اجرا 30 ثانیه است.

کد php برای علاقه مندان:

PHP:
<?php

$milliseconds1 = round(microtime(true) * 1000);
echo $milliseconds1;


// codes


echo "<br><br>";     
$milliseconds2 = round(microtime(true) * 1000);
echo $milliseconds2;


echo $milliseconds2-$milliseconds1;

?>
منبع
 
آخرین ویرایش:

saalek110

Well-Known Member
افزودن اشکال بدون خروج از برنامه در حالت اجرا:

یک پوشه درست کنید. فایلهایی را برای خواندن آنجا قرار دهید.
یک تابع رسم اشکال بسازید.
با متغیرهایی که از فایل های خوانده شده آن پوشه بدست آورده اید تابع فوق را صدا بزنید.
مثلا 3 عدد x و y و z را از فایل خواندید. با این 3 عدد مختصات یک کره یا استوانه یا ... را تغییر می دهید. می توانید متغیرهای زیادی در فایل بنویسید تا همه چیز را کنترل کنید. مثل سایز و میزان چرخش و نوع تکسچر و غیره.
در پوشه خود می توانید بی نهایت فایل قرار دهید تا اشکال متعددی در بازی ایجاد کنید. بعدا می توانید اعداد تنظیم شده را به هر شکلی استفاده کنید و نیازی نیست این روش را همیشه ادامه دهید.
توجه داشته باشید که برنامه در حال اجرا است و شما با تغییر فایلهای بیرونی در حال طراحی عناصر بازی هستید. در عرض چند دقیقه کلی شکل می سازید. بعد تنظیم هر شکل می توانید فایل را به اسم آن شکل تغییر دهیدRename مثلا برج. Tower
در تاپیک توابع سی در تالار سی همین انجمن طرز لیست گیری از پوشه و خواندن فایل را نوشته ام.

a8.gif

تا می توانید لوازمی بسازید تا بازی را با آنها راحت تر بسازید.
لوازم بازی را می سازد نه شما.

چند نوع استفاده میشه کرد.
نوع اول: در یک روش یک سری اعداد و مختصات تبدیل به فایل سورس شده و جزو برنامه شده.
نوع دوم: در یک پوشه دیگر مختصاتی که خودش ساخته را رسم می کند. از یک شکل به عنوان الگو استفاده می کنید و حرکتش می دهید و می چرخانید وقتی که محل و زاویه اش خوب بود با زدن یک دکمه از آن کپی می گیرید و در یکی از این پوشه ها انداخته می شود و در طی برنامه مدام در حال رسم است در حالی که فقط به شکل فایل خارج برنامه است.

سوم: در یک پوشه دستور جمع آوری اعداد به شکل خاصی داده می شود و بعد آن اعداد به شکل خاصی در برنامه استفاده می شود.
در پست های قبل گفتم قصد دارم متغیرهایی به شکل خام وارد برنامه کنم و هوش برنامه و قسمت رسم برنامه می دانند از آن اعداد خام چطور استفاده کنند. منظور از اعداد خام اینه که به شکل کدهای رسم کننده opengl نیست. فقط یک سری عدد است.

مسلما اشتباهات زیادی در کار من هست. ولی منظور اینجا تبادل تجربه است. شما خودتان با کمی فکر کردن ممکن است روش های بهتری بیابید.
 
آخرین ویرایش:

saalek110

Well-Known Member
جهت دوربین:
یک تجربه ایجاد حرکت دوربین است. مثلا با بالا بردن دوربین احساس بالون دست می دهد.
یا وقتی در هوا حرکت مداوم باشد احساس هواپیما می دهد. یا تجربه سواری با ماشین در حرکت مدام دوربین روی زمین ایجاد می شود. با ساخت قسمتی از موتور و ماشین و ایجاد یک سری صدا و جلوه بصری این حالت تقویت می شود.
در اکتیوورلد که در بالا معرفی شد. یک وسایلی بود که ایجاد حالت هواپیما یا ماشین یا قایق میکرد.به نام mover

همچنین زاویه دوربین که به سمت روبرو باشد یا به سمت پایین احساس های مختلفی ایجاد می کند.
 
آخرین ویرایش:

saalek110

Well-Known Member
استفاده از یک متغیر به عنوان یک نشانه و یک مشکل و رفع مشکل:

PHP:
void change_key()
          {
if ( a==0 ) a=1;
if ( a==1 ) a=0;
           }
تابع بالا قرار است حالت یک متغیر را برعکس کند ولی اگر در حالت اولیه عدد مورد نظر صفر باشد تابع آن را یک و فوری صفر می کند یعنی کارش را درست انجام نمی دهد.

راه حل:
HTML:
 void change_key()
           {
  int lock=1;
  if ( a==0) {a=1;  lock=0;}
   if ( a==1 && lock==1) a=0;
          }

مثل اینه کسی برود کلید وسیله ای را بزند ولی بعد شک کند که زده یا نزده و دوباره بزند.

images.jpg

برنامه کامل آن:
PHP:
#include <stdio.h>
#include <conio.h>
int a=0;



void change_key()
           {
  int lock=1;
  if ( a==0) {a=1;  lock=0;}
   if ( a==1 && lock==1) a=0;
          }


int main(int argc, char **argv) {
 
    a=0;
    change_key();
    printf ("a= %d\n",a);
 
    a=1;
    change_key();
    printf ("a= %d\n",a);
 
 
    getch();
        return 1;
}

a1.jpg
و برنامه ناقص اولی:

a2.jpg
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا