درود مهمان گرامی! ثبت نام

آموزش ساخت بازی در #C آموزش UDK آموزش مدل سازی در Maya
آموزش ساخت بازی در VB آموزش Unity - پروژه محور آموزش مدل سازی با 3Ds Max
آموزش برنامه نویسی اندروید آموزش Unity - ساخت منو آموزش متحرک سازی در 3Ds Max
آموزش ساخت بازی حدس تصویر آموزش Unity - متحرک سازی مجموعه آموزش های ساخت بازی
● آموزش های رایگان ● تبلیغات دیجیتال هوشمند ● استخدام در فرادرس

امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
کد گیم میکر
#21
نگاه کاربرا نمیتونن یه کمک کنن به خدا  depressed
پاسخ
#22
(4/6/1396، 09:42 عصر)amirhosintahery نوشته است:
(4/6/1396، 08:34 عصر)TNT نوشته است: سلام.
منظورت خیلی واضح نبود ولی اگه اشتباه نکنم میخوای چیزی شبیه بازی HillClimbRacing 2 درست کنی که وقتی یک بار یک مرحله رو رد کنی، دفعه ی بعدی موقع شکستن رکوردت میتونی با خودت مسابقه بدی.
برای اینکار باید از Array استفاده کنی.
آرایه در واقع بهت کمک میکنه تا بتونی پشت سر هم یک مقدار رو تو یک متغیر ذخیره کنی.
انجام همچین کاری، ساده نیست و نمیشه تو یک پست توضیحش داد. (در واقع میشه تو یک پست آموزشش داد ولی چون مطمئن نیستم منظورت چیه، یجورایی وقت تلف کردنه.)
اگه منظورت همینیه که گفتم، بگو که توضیح بدم تا جایی که میتونم.

گل گفتی منظورم همینه اگ میتونی سورسو برات بفرستم واسم انجامش بدی  inlove

     
برای اینکار باید کار با آرایه رو بلد باشی. خود سایت یویوگیمز توضیحی در مورد آرایه ها (اینجا) داده ولی ممکنه متوجه نشی. لازم هم نیست حتما از سایتش یاد بگیری چون هر جایی میتونی در موردش اطلاعات پیدا کنی. حتی تو آموزشای زبونای دیگه.
     
کار آرایه اینه که یک مقدار رو میتونه پشت سر هم توی متغیری با شماره های مختلف ذخیره کنه.
    
هر آرایه یک بخش Index داره که توش یک شماره وارد میکنی. میتونی این شماره رو دستی وارد کنی یا با استفاده از یک متغیر دیگه. که خب ما اینجا قراره با استفاده از یک متغیر مقدارش رو عوض کنیم.
شبیه آرایه رو قبلا تو گیم میکر دیدی. Alarm ها هم یک جور آرایه هستن ولی محدودیت Index دارن و فقط 11 ایندکس قبول میکنن.
    
یک نمونه از آرایه:
کد:
Variable [index] = value;
/////
مثلا:
/////
Hassan [33] = 210;
    
ولی همونطور که گفتم ما قراره مقدار Index رو با متغیر تغییر بدیم.
    
حالا بریم سراغ کار اصلی.
اگه بخوایم بازی HillClimbRacing 2 رو در نظر بگیریم، ما به 3 مقدار احتیاج داریم که توی آرایه ذخیره میکنیم. ینی image_angle و x و y رو میخوایم ذخیره کنیم.
     
تو بازی هم 3 تا آبجکت داریم. یکی آبجکت ماشین پلیر (obj_PlayerCar)، آبجکت ماشین روح (obj_PlayerGhost) و آخری هم آبجکت مدیر که قراره آرایه ها رو نگه داره (obj_GameManager).
     
کار هر کدوم هم مشخصه:
آبجکت ماشین پلیر قراره آرایه ها رو تولید کنه.
آبجکت ماشین روح هم قراره آرایه های تولید شده رو بخونه.
آبجکت مدیر هم همونطور که گفتم کار منبع رو انجام میده.
     
حالا بریم سر بحث اصلی ینی ذخیره کردن مقدار ها و خوندنشون.
    
ذخیره کردن مقدار ها با Step event هم امکان پذیره ولی چون خیلی بهینه نیست اینکار رو انجام نمیدیم.
برای همین از Alarm استفاده میکنیم که هر چند مدت یک بار مقادیر رو ذخیره کنیم.
     
(obj_GameManager)
[Create event]
کد:
Xer = x;
Yer = y;
Angler = image_angle;
     
قبل از شروع مثل بالا، میایم متغیرای مورد نیازمون رو توی آبجکت مدیر تعریف میکنیم.
     
(obj_PlayerCar)
[Create event]
کد:
Step = 0;
alarm[0] = 0.5*room_speed;
     
مثل همیشه متغیر مورد نیاز رو تعریف میکنیم و هر نیم ثانیه هم آلارم رو فعال میکنیم تا مقادیر رو ذخیره بشن.
    
[Alarm[0] event]
کد:
obj_GameManager.Xer[Step] = x;
obj_GameManager.Xer[Step] = y;
obj_GameManager.Angler[Step] = image_angle;
Step ++;
/////
alarm[0] = 0.5*room_speed;
      
اینجا داریم مقدار x و y و image_angle آبجکت ماشین پلیر رو توی آبجکت مدیر ذخیره میکنیم.
مقدار Index رو هم با متغیر Step با هر بار خونده شدن Alarm، زیاد میکنیم.
ینی مقدار متغیر مثلا Xer به ترتیب بعد از هر بار خونده شدن Alarm به شکل زیر ذخیره میشه:
    
کد:
Xer[0] = 5;
Xer[1] = 10;
Xer[2] = 15;
...
     
توی این آموزش برای اینکه خیلی به سیستم فشار نیاد، آبجکت ماشین بازیکن رو بعد از ذخیره ی مثلا 100 بار از بین میبریم. ینی اینجوری:
     
کد:
if (Step == 100) {
instance_destroy();
}
      
     
حالا مقدارامون ذخیره شدن، فقط مونده خونده شدنشون توسط آبجکت روح ماشین.
    
(obj_PlayerGhost)
[Create event]
کد:
Step = 0;
alarm[0] = 0.5*room_speed;
   
تو کد بالا متغیرامون رو تعریف میکنیم و آلارم 0 رو برای استفاده های بعدی تعریف میکنیم.
    
موقع ذخیره کردن اطلاعات، ما مقادیر رو با فاصله ذخیره کردیم. هر نیم ثانیه مقادیر رو دوباره ذخیره میکردیم.
بنابراین باید یک روشی پیدا کنیم که این مقادیر رو به هم وصل کنیم.
پس آبجکت روح ماشین باید با همون سرعت برابر سرعت ماشین پلیر، به سمت مقادیر x و y بره و image_angle ش هم به همین صورت تغییر کنه.
    
[Step event]
کد:
Xis = obj_GameManager.Xer[Step];
Yis = obj_GameManager.Yer[Step];
Anglis = obj_GameManager.Angler[Step];

move_towards_point(Xis, Yis, speed);
image_angle += (Anglis-image_angle)/30;
   
[Alarm[0] event]
کد:
Step ++;
alarm[0] = 0.5*room_speed;
     
تو بخش اول متغیر Xis رو برابر مقادیر ذخیره شده برای x آبجکت ماشین پلیر قرار میدیم (همونایی که تو آبجکت مدیر ذخیره کردیم) و Yis رو هم برابر مقدار ذخیره شده برای y آبجکت ماشین پلیر قرار میدیم.
همین کار رو برای متغیر Anglis هم انجام میدیم.
    
بعد میایم مقادیر x و y رو با تابع move_towards_point به هم وصل میکنیم. (وقتی میخوایم آبجکتی بره دنبال آبجکت دیگه از این تابع استفاده میکنیم)
و همچنین برای image_angle.
     
دقت کن که باید speed رو برابر سرعت حرکت آبجکت ماشین پلیر قرار بدیم و چون وقتی آبجکت ماشین پلیر از بین میره، آبجکت روح تولید میشه، نمیتونیم speed رو برابر obj_PlayerCar.speed قرار بدیم.
یک نکته ی دیگه. من روش مناسبی برای وصل کردن مقادیر image_angle آبجکت روح نمیدونم؛ برای همین از فرمولی که قبلا هم گفته بودم استفاده کردم. مقداری که بعد از علامت تقسیم وارد کردم (منظورم همون 30 س) هم ممکنه مقدار مناسبی نباشه. خودت باید تنظیمش کنی با آزمون و خطا. یا اینکه از روش دیگه ای استفاده کنی.
   
آلارم 0 هم هر نیم ثانیه Step رو یک بار میبره جلو که مقدار Xis و Yis و Anglis برابر مقدار بعدی ذخیره شده بشن و آبجکت روح دنبال موقعیت بعدی بره.
    
اگه یادت باشه قبلا گفتیم که بعد از 100 Step دیگه مقداری ذخیره نشه، بنابراین وقتی Step آبجکت روح ماشین به 101 برسه، بازی اررور میده.
برای همین باید آبجکت روح رو یکجوری محدود کنیم که ساده ترین راه از بین بردن خود آبجکته.

[Step event]
کد:
if (Step == 100) {
instance_destroy();
}
    
فکر میکنم تمومه.
چون آموزشش خیلی طولانیه، ممکنه یکسری مشکلات توش باشه.
این روش رو خودم امتحان نکردم برای همین ممکنه بعضی جاها موقع اجرا کردن مشکل پیش بیاد و اررور بده.
روشای بهتر و بهینه تر از این هم وجود دارن. این روشیه که من به فکر رسید.
امیدوارم جواب بده.
فکر میکنم مشکل اصلی تازه کارای گیم تو پرومیکرز اینه که حوصله ندارن بخونن.
فقط اینو بگم، که تا یاد نگیرید مقاله های 100 صفحه ای رو به زبون فارسی و انگلیسی بخونید، چیزی یاد نمیگیرید.
!!کسی نمیتونه جواب رو اونقدر براتون ساده کنه!!
پاسخ
 سپاس شده توسط Milad_Hyper ، HADIp ، amirhosintahery
#23
(8/6/1396، 07:29 عصر)TNT نوشته است:
(4/6/1396، 09:42 عصر)amirhosintahery نوشته است: گل گفتی منظورم همینه اگ میتونی سورسو برات بفرستم واسم انجامش بدی  inlove

     
برای اینکار باید کار با آرایه رو بلد باشی. خود سایت یویوگیمز توضیحی در مورد آرایه ها (اینجا) داده ولی ممکنه متوجه نشی. لازم هم نیست حتما از سایتش یاد بگیری چون هر جایی میتونی در موردش اطلاعات پیدا کنی. حتی تو آموزشای زبونای دیگه.
     
کار آرایه اینه که یک مقدار رو میتونه پشت سر هم توی متغیری با شماره های مختلف ذخیره کنه.
    
هر آرایه یک بخش Index داره که توش یک شماره وارد میکنی. میتونی این شماره رو دستی وارد کنی یا با استفاده از یک متغیر دیگه. که خب ما اینجا قراره با استفاده از یک متغیر مقدارش رو عوض کنیم.
شبیه آرایه رو قبلا تو گیم میکر دیدی. Alarm ها هم یک جور آرایه هستن ولی محدودیت Index دارن و فقط 11 ایندکس قبول میکنن.
    
یک نمونه از آرایه:
کد:
Variable [index] = value;
/////
مثلا:
/////
Hassan [33] = 210;
    
ولی همونطور که گفتم ما قراره مقدار Index رو با متغیر تغییر بدیم.
    
حالا بریم سراغ کار اصلی.
اگه بخوایم بازی HillClimbRacing 2 رو در نظر بگیریم، ما به 3 مقدار احتیاج داریم که توی آرایه ذخیره میکنیم. ینی image_angle و x و y رو میخوایم ذخیره کنیم.
     
تو بازی هم 3 تا آبجکت داریم. یکی آبجکت ماشین پلیر (obj_PlayerCar)، آبجکت ماشین روح (obj_PlayerGhost) و آخری هم آبجکت مدیر که قراره آرایه ها رو نگه داره (obj_GameManager).
     
کار هر کدوم هم مشخصه:
آبجکت ماشین پلیر قراره آرایه ها رو تولید کنه.
آبجکت ماشین روح هم قراره آرایه های تولید شده رو بخونه.
آبجکت مدیر هم همونطور که گفتم کار منبع رو انجام میده.
     
حالا بریم سر بحث اصلی ینی ذخیره کردن مقدار ها و خوندنشون.
    
ذخیره کردن مقدار ها با Step event هم امکان پذیره ولی چون خیلی بهینه نیست اینکار رو انجام نمیدیم.
برای همین از Alarm استفاده میکنیم که هر چند مدت یک بار مقادیر رو ذخیره کنیم.
     
(obj_GameManager)
[Create event]
کد:
Xer = x;
Yer = y;
Angler = image_angle;
     
قبل از شروع مثل بالا، میایم متغیرای مورد نیازمون رو توی آبجکت مدیر تعریف میکنیم.
     
(obj_PlayerCar)
[Create event]
کد:
Step = 0;
alarm[0] = 0.5*room_speed;
     
مثل همیشه متغیر مورد نیاز رو تعریف میکنیم و هر نیم ثانیه هم آلارم رو فعال میکنیم تا مقادیر رو ذخیره بشن.
    
[Alarm[0] event]
کد:
obj_GameManager.Xer[Step] = x;
obj_GameManager.Xer[Step] = y;
obj_GameManager.Angler[Step] = image_angle;
Step ++;
/////
alarm[0] = 0.5*room_speed;
      
اینجا داریم مقدار x و y و image_angle آبجکت ماشین پلیر رو توی آبجکت مدیر ذخیره میکنیم.
مقدار Index رو هم با متغیر Step با هر بار خونده شدن Alarm، زیاد میکنیم.
ینی مقدار متغیر مثلا Xer به ترتیب بعد از هر بار خونده شدن Alarm به شکل زیر ذخیره میشه:
    
کد:
Xer[0] = 5;
Xer[1] = 10;
Xer[2] = 15;
...
     
توی این آموزش برای اینکه خیلی به سیستم فشار نیاد، آبجکت ماشین بازیکن رو بعد از ذخیره ی مثلا 100 بار از بین میبریم. ینی اینجوری:
     
کد:
if (Step == 100) {
instance_destroy();
}
      
     
حالا مقدارامون ذخیره شدن، فقط مونده خونده شدنشون توسط آبجکت روح ماشین.
    
(obj_PlayerGhost)
[Create event]
کد:
Step = 0;
alarm[0] = 0.5*room_speed;
   
تو کد بالا متغیرامون رو تعریف میکنیم و آلارم 0 رو برای استفاده های بعدی تعریف میکنیم.
    
موقع ذخیره کردن اطلاعات، ما مقادیر رو با فاصله ذخیره کردیم. هر نیم ثانیه مقادیر رو دوباره ذخیره میکردیم.
بنابراین باید یک روشی پیدا کنیم که این مقادیر رو به هم وصل کنیم.
پس آبجکت روح ماشین باید با همون سرعت برابر سرعت ماشین پلیر، به سمت مقادیر x و y بره و image_angle ش هم به همین صورت تغییر کنه.
    
[Step event]
کد:
Xis = obj_GameManager.Xer[Step];
Yis = obj_GameManager.Yer[Step];
Anglis = obj_GameManager.Angler[Step];

move_towards_point(Xis, Yis, speed);
image_angle += (Anglis-image_angle)/30;
   
[Alarm[0] event]
کد:
Step ++;
alarm[0] = 0.5*room_speed;
     
تو بخش اول متغیر Xis رو برابر مقادیر ذخیره شده برای x آبجکت ماشین پلیر قرار میدیم (همونایی که تو آبجکت مدیر ذخیره کردیم) و Yis رو هم برابر مقدار ذخیره شده برای y آبجکت ماشین پلیر قرار میدیم.
همین کار رو برای متغیر Anglis هم انجام میدیم.
    
بعد میایم مقادیر x و y رو با تابع move_towards_point به هم وصل میکنیم. (وقتی میخوایم آبجکتی بره دنبال آبجکت دیگه از این تابع استفاده میکنیم)
و همچنین برای image_angle.
     
دقت کن که باید speed رو برابر سرعت حرکت آبجکت ماشین پلیر قرار بدیم و چون وقتی آبجکت ماشین پلیر از بین میره، آبجکت روح تولید میشه، نمیتونیم speed رو برابر obj_PlayerCar.speed قرار بدیم.
یک نکته ی دیگه. من روش مناسبی برای وصل کردن مقادیر image_angle آبجکت روح نمیدونم؛ برای همین از فرمولی که قبلا هم گفته بودم استفاده کردم. مقداری که بعد از علامت تقسیم وارد کردم (منظورم همون 30 س) هم ممکنه مقدار مناسبی نباشه. خودت باید تنظیمش کنی با آزمون و خطا. یا اینکه از روش دیگه ای استفاده کنی.
   
آلارم 0 هم هر نیم ثانیه Step رو یک بار میبره جلو که مقدار Xis و Yis و Anglis برابر مقدار بعدی ذخیره شده بشن و آبجکت روح دنبال موقعیت بعدی بره.
    
اگه یادت باشه قبلا گفتیم که بعد از 100 Step دیگه مقداری ذخیره نشه، بنابراین وقتی Step آبجکت روح ماشین به 101 برسه، بازی اررور میده.
برای همین باید آبجکت روح رو یکجوری محدود کنیم که ساده ترین راه از بین بردن خود آبجکته.

[Step event]
کد:
if (Step == 100) {
instance_destroy();
}
    
فکر میکنم تمومه.
چون آموزشش خیلی طولانیه، ممکنه یکسری مشکلات توش باشه.
این روش رو خودم امتحان نکردم برای همین ممکنه بعضی جاها موقع اجرا کردن مشکل پیش بیاد و اررور بده.
روشای بهتر و بهینه تر از این هم وجود دارن. این روشیه که من به فکر رسید.
امیدوارم جواب بده.

میشه سورسو برات بفرستم برام انجامش بدی چون من با توضیح دادن خیلی یاد نمیگیرم فیلمش باشه میفهمم تروخدا سورسو برات میفرستم برام انجامش بده
پاسخ
#24
(11/6/1396، 09:44 صبح)amirhosintahery نوشته است: میشه سورسو برات بفرستم برام انجامش بدی چون من با توضیح دادن خیلی یاد نمیگیرم فیلمش باشه میفهمم تروخدا سورسو برات میفرستم برام انجامش بده
      
خیر نمیشه. من همچین کاری انجام نمیدم.
همونقدری که شما قراره زحمت بکشی بخونی، من زحمت کشیدم نوشتم.
کامل توضیح دادم کدوم کد رو باید کجا وارد کرد. فقط کافیه کدا رو همون جاهایی که گفتم وارد کنی. این کار فرقی با فرستادن سورس و ادیت شده گرفتنش نداره.

      
یه راهنمایی برای بهتر فهمیدن اینجور توضیحا:
سعی نکن تغییرات گفته شده رو یک راست تو پروژه ت وارد کنی؛ یک پروژه ی جدید درست کن، اینا رو توش تست کن و بعد وارد پروژه ی اصلیت کن.
فکر میکنم مشکل اصلی تازه کارای گیم تو پرومیکرز اینه که حوصله ندارن بخونن.
فقط اینو بگم، که تا یاد نگیرید مقاله های 100 صفحه ای رو به زبون فارسی و انگلیسی بخونید، چیزی یاد نمیگیرید.
!!کسی نمیتونه جواب رو اونقدر براتون ساده کنه!!
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  سورس گیم میکر استودیو و گیم میکر hasanpo 0 1,428 13/5/1394، 10:55 عصر
آخرین ارسال: hasanpo



کاربرانِ درحال بازدید از این موضوع: 1 مهمان