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





صفحه اول انجمنها -> اصول اولیه در طراحی بازیهای کامپیوتری -> مقاله : حلقه اصلی بازی
 

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

نظر خود را در مورد مفید بودن این مقاله بیان کنید
چیز جدیدی یاد نگرفتم
33%
 33%  [ 2 ]
بد نبود
16%
 16%  [ 1 ]
خیلی به دردم خورد
50%
 50%  [ 3 ]
مجموع آراء : 6

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


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


4 شنبه 22 فروردين 1386 - 22:08
پاسخ بصورت نقل قول
مجتبی جان خوشم میاد که به این چیزا علاقه مندی Laughing

بریم سر حرفمون

در مورد نقل قول اول باید بگم که گاهی اوقات(شایدم اکثر اوقات) مشکل افراد رو همون بخشهاییه که صحبتشون سر اونا نیست!! Smile بگذریم منم اسراری روی اون ندارم فقط در هر موردی که نکته ای به نظرم بیاد میگمش.

و اما در نقل قول دوم باید بگم که بله برای حلقه های جدا از هم میشه به سرعت جداگانه و نسبتا ثابت فرض کرد (البته باز هم اگر کد sleep توشون باشه.)
البته هنوز هم هیچ دلیل منطقی برای استفاده از سیستم رشته ای(thread based) برای طراحی حلقه بازی به ذهنم نمیرسه به نظزم همون سیستم حلقه اصلی خیلی بهتره.
اگه کسی از بچه ها اطلاعاتی در این زمینه داره خوشحال میشم بدونم.
ببین مجتبی جان یه چیز بدیهی که شاید باید تو مقاله هم روشن تر بهش پرداخته می شد اینه که یک بازی چیزی نیست به جز یه سری کارها که پشت سر هم هی انجام میشن.
حالا برای اینکار میشه همه این کارها رو لیست کرد و تو یه حلقه قرار داد و اون حلقه نقش تکرار کردن اون عملیات رو بر عهده بگیره. راه دیگه هم اینه که هر کدوم تو یه حلقه جدا و بالتبع رشته(thread) جدا قرار بگیرند و وظیفه تکرار اونا رو همون حلقه خودشون بر عهده بگیره. که خوب به نظر من لازم نیست(چرا که تا توپی حرکت نکنه به تشخیص برخورد و کشیدن نیاز نداره و تا برخوردش تشخیص داده نشه به عکس العمل نشون دادن نیاز نداره) بنابراین وقتی برای تکرار هر عمل به یک بار تکرار عمل های دیگه نیاز داری عاقلانه ترین کار اینه که تو یه حلقه قرارشون بدیم.
پس نتیجه اخلاقی این میشه که حلقه اصلی پر!!
اما خوب از بین حلقه اصلی اونی که به چشم کاربر میاد حلقه کشیدن و رفرش کردن صفحه است یا همون چیزی که واحدش فریم در ثانیه است. پس میشه سرعت این حلقه رو به عنوان سرعت بازی در نظر گرفت.

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

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

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

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


5 شنبه 23 فروردين 1386 - 01:04
پاسخ بصورت نقل قول
نقل قول:

در مورد نقل قول اول باید بگم که گاهی اوقات(شایدم اکثر اوقات) مشکل افراد رو همون بخشهاییه که صحبتشون سر اونا نیست!! بگذریم منم اسراری روی اون ندارم فقط در هر موردی که نکته ای به نظرم بیاد میگمش.

Very Happy
مي دوني چرا مي گم صحبتم سر اون نيست ؟ چون با تستي كه توي TGB انجام دادم مطمين هستم روشي كه من براي حركت آبجكت آستفاده كردم از بيخ مشكل داره چون خيلي خطا داره و موتورها از اين روش براي حركت آبجكت استفاده نمي كنند من تو بازي سرعت 100 پيكسل در ثانيه مي دادم برخورد رو تشخيص نمي داد ولي تو TGB تا 4000 پيكسل در ثانيه هيچ خطايي نمي گرفت . نمي دونم شايد هم همينه و روش تشخيص برخوردم مشكل داره ...

نقل قول:

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


بالا گفتي كه از بين حلقه هاي اصلي ! مگه نگفتي يه حلقه اصلي وجود داره . در مورد FPS من هم به همين موضوع فكر كرده بودم آيا مقدار FPS مي تونه معياري و يا حتي مقدار سرعت حلقه اصلي باشه . ببخشيد كه هنوز متوجه نشدم چيزي به اسم سرعت حلقه اصلي مجود داره يا نه !

نقل قول:

راه دیگه هم اینه که هر کدوم تو یه حلقه جدا و بالتبع رشته (thread) جدا قرار بگیرند و وظیفه تکرار اونا رو همون حلقه خودشون بر عهده بگیره


خوب اين thread يه مقدار برام گنگه ( اگه كتابي هم مي شناسي كه توش توضيح داده باشه مي تونم پيدا كنم ... ) من يه مقدار كدهاي بيشتري مي زارم تا هم من بيشتر روشن بشم هم شما منظورم رو از اون كدها بيشتر متوجه بشي .

كد اول براي اسكريپتي به اسم game.script هستش( البته باز هم خلاصه هست ) :

كد:
#include "scripts\base.inc"
#include "scripts\keys.inc"

while(true)
{
  if(((T01.X-T02.X)*(T01.X-T02.X)) + ((T01.Y-T02.Y)*(T01.Y-T02.Y)) < 625) Lose_C = 1;
  if(((T01.X-T03.X)*(T01.X-T03.X)) + ((T01.Y-T03.Y)*(T01.Y-T03.Y)) < 625) Lose_C = 1;
  if(((T02.X-T03.X)*(T02.X-T03.X)) + ((T02.Y-T03.Y)*(T02.Y-T03.Y)) < 625) Lose_C = 1;
  Sleep(0);
}

on "Keypress"
{
  if(Keyboard.KeyCode==VK_SPACE)
  {
    t1.ApplyEvent("Go");
  }
}


خوب آبجكت t1 يه فايل اسكريپت ديگه داره يعني اين اسكريپتها توي فايل قبلي نيستند :

كد:
on "Go"
{
  for(var X=Pow; X>0 ; X = X - 3)
  {
    t1.SkipTo(t1.X + X*Math.Cos(Jahat), t1.Y + X*Math.Sin(Jahat));
    Sleep(20);
  }
  if(Lose_C==1) Game.AttachScript("scripts\Lose.script");
}


ايونت go هم خودم تعريف كردم و جزو ايونت هاي تعريف شده انجين نيست ...

نقل قول:

راستی در مورد مقاله تشخیص برخورد همه اش رو بلد بودی؟ اگه اینجوریاست که باید یه ذره مطالعه کنم تا برای تنها مشتری فعلیم مقالاتی با سطح بالاتر تهیه کنم


اختيار داريد . من تو همين اوليش موندم Embarassed

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

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


5 شنبه 23 فروردين 1386 - 11:12
پاسخ بصورت نقل قول
نقل قول:

من تو بازي سرعت 100 پيكسل در ثانيه مي دادم برخورد رو تشخيص نمي داد


البته يه اشتباهي اينجا كردم توپ در هر ثانيه 50 فريم داره كه تو سرعت 55 پيكسل ( چون 55 خيلي كوچيك بود گفتم يه دفعه بگم 100 ولي بعد كه فكر كردم ديدم اگه 100 باشه با توجه به محاسبه زير سرعت توپ از 4000 پيكسل كه تو TGB گفتم بيشتر مي شه ) در فريم مي شه چيزي حدود 2750 پيكسل در ثانيه . خوب به جاي اون 100 پيكسل تو پست قبلي بزار 2750 پيكسل ...

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

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


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


5 شنبه 23 فروردين 1386 - 14:15
پاسخ بصورت نقل قول
در مورد حلقه اصلی حق با شماست اون کلمه اصلی اضافه نوشته شده اونو بی خیال شو.
جمله اصلاح شده اینه:

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

fps :همون فریم در ثانیه است که من در بالا گفتم ( خارجکیش frame per second)
و جوابتون بله است. یعنی به نظر من مبشه fps رو به عنوان سرعت بازی در نظر گرفت.

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

thread رو بی خیال شو بدرد نمی خوره Rolling Eyes

در مورد کدها :
اگه اشتباه نکنم یه چیزایی از کدها سرم شد.

این اونت go خیلی مشکوکه از یه طرف نمیذاره فرضیه thread رو بذارم کنار به خاطر اون sleep(آخه اصلا تا حالا این رو نشنیده بودم که اجزای حلقه اصلی تو چند تا thread پخش بشن و این تنها یه فرضه که خودم کردم و ممکنه از بیخ چرت باشه. بنا براین خیلی دوست دارم تا از شر این فرضیه خلاص شم و دیگه در موردش حرف نزنم.)
و از طرف دیگه ...
بی خیال
بیا این کار رو که من میگم بکن.
تو برنامه نویسی یه چیزهایی هست که باید رعایت کرد.
مثل اینکه go به معنای برو یه فرمانه نه یه اونت بنابراین پیاده کردنش با یه اونت کار درستی نیست.
شما برای آبجکتت متغیرهای سرعت و شتاب در نظر بگیر و تو اونت کی بورد فانکشن skipTo رو صدا بزن. کافیه شتاب رو از سرعت فعلی کم بکنی و حاصل رو به سرعت انتساب بدی.
اینجوری خیلی بهتره. با وقعیت هم منطبقه. شایدم مشکل برخوردت رو به کل حل کنه.

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

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

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


5 شنبه 23 فروردين 1386 - 15:12
پاسخ بصورت نقل قول
2 نكته :
1 . go رو خودم اسم دادم مثلا مي تونستم بنويسم Dont go !
2 . با استفاده از فانكشن Skip to كل شي ناپديد مي شه و در x , y جديد ظاهر مي شه . يعني هيچ فريمي در اين بين وجود نداره كه من بخوام براش سرعتي تعيين كنم .

نقل قول:

شما برای آبجکتت متغیرهای سرعت و شتاب در نظر بگیر و تو اونت کی بورد فانکشن skipTo رو صدا بزن. کافیه شتاب رو از سرعت فعلی کم بکنی و حاصل رو به سرعت انتساب بدی .


براي اين Skip to رو تو ايونت كي برد صدا نزدم چون خيلي شلوغ مي شد . براي هر آبجكت يه اسكريپت جداگانه نوشتم و تمام فانكشناي هر كدوم رو تو همون اسكريپت نوشتم اين جوري مرتب تر هم شد ...
يه دليل ديگه هم داره من قسمتي رو حذف كردم . وقتي space رو مي زني يكي از 3 توپ در حالت انتخابه كه با سه اسم از هم متمايز مي شن t1 t2 t3 . پس من فقط مي گم ايونت go براي آبجكت انتخابي رو اجرا كن . ( براي هر توپ يه اسكريپت جداگانه درست كردم )
فكر نكنم با اين كار مشكل برخورد حل بشه ولي يه سوالي برام پيش اومده : يعني شما پيشنهاد مي كنيد همه كدها رو يه جا بنويسم ؟ اين جوري كه خيلي بي نظم مي شه !

نقل قول:

مثل اینکه go به معنای برو یه فرمانه نه یه اونت بنابراین پیاده کردنش با یه اونت کار درستی نیست


تو برنامه نويسي چيزي به اسم فرمان هم داريم كه از ايونت جدا باشه ؟ به نظر من اين 2 تا يكي هستند

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

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


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


5 شنبه 23 فروردين 1386 - 16:09
پاسخ بصورت نقل قول
خوب منم منظورم اسمش نبودم منظورم اینه که جایی که مفهوم اینه که کاری باید انجام بشه از فانکشن استفاده میشه و جایی که قراره اتفاق افتادن رویدادی اطلاع داده بشه از اونت.
تمام اینهای رو که توضیح دادی فهمیده بودم.

این بحث یه ذره قلمبه است و گفتنش و اطمینان از اینکه طرفت منظورت رو میگیره هم کمی سخته ولی خوب امتحانش بی ذرره.

اصل حرف من اینه که اون حلقه for اضافیه.

یه چندا فنکشن اضافه کردم(syntax موتور شما رو نمیدونم اینو از خودم مینویسم.)

كد:
while(true)
{
   if(((T01.X-T02.X)*(T01.X-T02.X)) + ((T01.Y-T02.Y)*(T01.Y-T02.Y)) < 625) Lose_C = 1;
   if(((T01.X-T03.X)*(T01.X-T03.X)) + ((T01.Y-T03.Y)*(T01.Y-T03.Y)) < 625) Lose_C = 1;
   if(((T02.X-T03.X)*(T02.X-T03.X)) + ((T02.Y-T03.Y)*(T02.Y-T03.Y)) < 625) Lose_C = 1;
   MoveObjects();
   Sleep(0);
}


on "Keypress"
{
   if(Keyboard.KeyCode==VK_SPACE)
   {
   // here you must set acceleration, initial speed and direction for the desired object.
   //for example :
   t1.acc = 5;
   t1.dir = 90;
   }
}

MoveObjects()
{
   Move(t1);
   Move(t2);
   // ...
}

Move(Object t)
{
// t must have these fields :
// 1 . direction (dir).
// 2 . speed (v).
// 3 . acceleration (acc).

   t.x = t.x + t.v * MATH.cos(t.dir);
   t.y = t.y + t.v *MATH.sin(t.dir);
   t.v = t.v + t.acc;

}


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

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

امیدوارم که منظور من رو درست بگیری. Surprised

خوب الان فکر میکنم یه سری مقاله برنامه نویسی هم به زودی تو تالار بذارم. نظرت چیه؟

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



0 بار اين نامه ويرايش شده است كه آخرين بار توسط 5 شنبه 23 فروردين 1386 - 16:26 در 2 بوده است.
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

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


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


5 شنبه 23 فروردين 1386 - 16:16
پاسخ بصورت نقل قول
البته خودم تو این کد اصول حلقه اصلی بازی رو رعایت نکردم اگه توجه کنی تشخیص برخورد قبل از حرکت اشیا هستش. ابته می تونستم ادیتش کم ولی گفتم یادآوری این نکته رو از دست ندم

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

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

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2069
محل سكونت: تهران


5 شنبه 23 فروردين 1386 - 17:08
پاسخ بصورت نقل قول
نقل قول:

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


ببينيد من تو بازيم مي خواستم اين فاصله هميشه چك بشه درست . من تو بازي ديدم كه وقتي موس از حدي پايين تر ميره منوي inventory باز مي شه . خوب كاري كه من كردم اين بود كه كدها رو نگاه كردم و ديدم براي چيزهايي كه مي خوان دايم چك بشن از كد زير استفاده كرده .

while(true)
{
if(mouse.y > 600) menu_inventory.visable = true;
Sleep(20);
}

خوب حالا شما هر وقت از اين كد استفاده كني هميشه چك مي شن :

while(true)
{
// some code
Sleep(x);
}

خوب الان دقيقا گرفتم چي مي گي خيلي زيبا حلقه for رو حذف كردي ولي با توجه به مطلبي كه بالا گفتم مي توني چند تا از اين حلقه ها داشته باشي پس فكر نكنم حلقه اصلي باشه به نظر خودم حلقه اصلي رو نمي شه ديد ...
و يه چيز ديگه اون حلقه for كه من استفاده كرده بودم بعد از اتمام حركت شي مي ايستاد ولي الان نه .

نقل قول:

خوب الان فکر میکنم یه سری مقاله برنامه نویسی هم به زودی تو تالار بذارم. نظرت چیه؟


خيلي عاليه . البته من يه تحقيقي دارم مي كنم در مورد اينكه چطور مي شه در دانشگاه پيام نور از يه رشته ديگه وارد بشي البته مقطع كارشناسي ارشد . اتفاقا انگار مي شه اگه قبول بشي بايد 24 واحد بگذروني ( چون رشتم نرم افزار نبوده ) بعد درسهاي اصلي .
آره احسان جان اينا رو گفتم كه يه وقت فكر نكني تا ابد اين سوال ها رو مي خوام ازت بپرسم Arrow

ولي اگه تو مقاله برنامه نويسي اول اينها رو توضيح بدي خيلي عالي مي شه :
شي گرايي
thread
كلاس
آرايه ها
و كلا اصطلاحات اين مدلي

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

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


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


5 شنبه 23 فروردين 1386 - 17:42
پاسخ بصورت نقل قول
درسته که جند تا حلقه وجود داره اما میشه یکی دوتا از اونا رو تو هم ادغام کرد. مثل همون دوتایی که گفتم.
در ضمن اگه شتا ب شما منفی باشه و سرعت مثبت دقیقا همون اتفاقی که میخوای میفته یعنی توپ بعد از یه مدتی وایمیسته. فقط باید مواظب باشی و به موقع شتاب رو صقر کنی تا دوباره از اونور راه نیفته.
من هنوز هم فکر میکنم استفاده از اون حلقه for به اون شکل ایراد داره.
در مورد مقاله هم چشم همه چیز به نوبت سعی میکنم بین هر چند تا از مقاله های مربوط به اصول بازی یه مقاله برنامه نویسی هم بگنجونم. Surprised

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

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

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


 
پرش به:  


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


unity3d

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