معرفی ارایه ها ، متغیر هایی که میتوانند بیش از یک مقدار نگهدارند

ممکن است در نگاه اول ارایه ها کمی گیج کننده به نظر برسند اما بسیار کاربردی هستند و یکی از بخش های ضروری برای ساخت بازی است اما چرا؟

لیست زیر مواردی را که بدون وجود ارایه ها انجامشان غیر ممکن است را شرح میدهد

  • منو ها : ارایه ها میتوانند کار را برای ساخت سیستم منو ها بسیار راحت کنند
  • بازی های rpg : ِارایه ها بخش ضروری برای ساخت بازی های rpg هستند زیرا به جای ایجاد چندین متغیر درهم برهم میتوانید از ارایه ها استفاده کنید و به سادگی به آنها مراجعه کنید 
  • بازی های کارتی : از ارایه ها میتواند برای نگهداری از کارت ها استفاده کرد 
  • جدول برترین امتیازات و امار : استفاده از ارایه ها به جای چندین متغیر کار را ساده میکند

مثال های بالا فقط تعدادی کمی از موارد استفاده ارایه ها بودند تا نشان داده شود چقدر در برنامه نویسی کاربردی و مهم هستند بیایید بیشتر در مورد آن ها بدانیم 

ارایه های یک بعدی

بسیار خوب ما میتوانیم از ارایه ها در مثال های ذکر شده بالا استفاده کنیم اما مسئله این است چه نوع ارایه ای؟ یک ارایه چه شکلی است تصویر زیر یک ارایه یک بعدی را نمایش میدهد

array[0] = 125; 

این یک ارایه یک بعدی است که در ادامه به توضیح تک تک بخش های آن میپردازیم

 

array

این نام ارایه است مانند یک متغیر معمولی نام آن میتواند هر چیزی باشد (طبق قوانین نام گذاری متغیرها) میتواند a یا my_swords باشد 

 

[0] 

این موقعیتی است که از آن برای بررسی و یا تغییر آن ورودی استفاده میکنیم همان طور که در عکس مشاهده کردید ارایه شامل فضایی برای ذخیره سازی داده های مختلف است هر فضا شناسه ثابت مخصوص به خود را دارد که از 0 شروع می شودو هیچ وقت عدد منفی نیست همچنین در [] قرار میگیرد بیایید در ادامه ارایه  را با موقعیت های مختلف توسعه می دهیم

 

array[2] = 0;
 array[1] = 0;
 array[0] = 0;

ارایه ما حالا شامل سه موقعیت (0،1،2) است در اینجا ما ارایه را مقداردهی اولیه کردیم ، برای استفاده از هر ارایه از قبل باید مقدار دهی اولیه شود تا در گیم میکر استادیو به ما خطا ندهد برای مقدار دهی اولیه کافیست هر موقعیت از ارایه را مقدار اولیه دهیم تا برای استفاده های بعدی در ابجکت یا کد اماده باشد (به خاطر داشته باشید در هنگام مقدار دهی اولیه باید یک مقدار قعطی به ان دهید ) میتوانید از یک حلقه برای مقدار دهی اولیه ارایه استفاده کنید :

var i;
 i = 9;
 repeat(10)
    {
    array[i] = 0;
    i -= 1;
    }

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

حالا فرض کنیم میخواهیم برای هر موقعیت در ارایه هنگام مقداردهی اولیه مقادیر متفاوتی را در نظر بگیریم برای این کار باید آن را به صورت دستی تایپ کنیم اما در این راه نکاتی وجود دارد که میتواند به ما کمک کند 

count = 3;
 array[count] = "you?"
 count -= 1;
 array[count] = "are "
 count -= 1;
 array[count] = "How "
 count -= 1;
 array[count] = "Hello!"
 count -= 1;

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

در مثال زیر میبینید که چگونه از یک ارایه مانند یک متغیر معمولی استفاده کردیم و عملیات مختلف را روی ان انجام دادیم 

total = array[0] + array[5]; //Add two array values together 

 if array[9] = 10 //Check an array value
    {
    //do something
    }

 draw_text(32, 32, array[3]); //draw an array value 

 در خط اول دو مقادیر دو ارایه با هم جمع شده اند و حاصل در متغیر total ذخیره شده است 

در خط بعد از ارایه برای بررسی مقدار آن استفاده شده است 

در خط اخر از ارایه برای دریافت مقدار داخل آن در موقعیت 3 استفاده شده است 

 

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

var i, total;
 i = 0;
 repeat(10)
    {
    total += array[i];
    draw_text(32, 32 + (i * 32), array[i]);
    i += 1;
    }
 draw_text(32, 32 + (i * 32), total);

در مثال بالا تمام مقادیر داخل ارایه را به متغیر total اضافه کردیم و هر یک از ایتم های ارایه را رسم کردیم و در اخر متغیر total رسم شده است 

 ارایه های دو بعدی 

 

 تا اینجا با ارایه های یک بعدی اشنا شدید شکل زیر یک نما از ارایه های دو بعدی است 

array[0,0] = 5; 

مانند قبل هر عدد مربوط به یک محل است فقط این بار هر موقعیت یک a و b دارد بدین صورت که حالا ارایه شامل یک ارتفاع و یک طول است در حالیکه در ارایه یک بعدی فقط ارتفاع وجود داشت به مثال زیر دقت کنید:

array[1,2] = 1;
 array[1,1] = "hello";
 array[1,0] = 55.5;
 array[0,2] = sprite_index;
 array[0,1] = "world";
 array[0,0] = -67.89;

یک ارایه دو بعدی قبل از استفاده باید مقدار دهی اولیه شود همانند ارایه های یک بعدی ، ارایه های دوبعدی میتوانند رشته ، اعداد واقعی و یا ثابت ها را در خود نگهدارند مانند هر متغیر دیگری 

ارایه های دو بعدی گزینه مناسبی برای بازی هایی هستند که باید داده های زیادی را با بهترین روش دسترسی ذخیره کنند (به خاطر داشته باشید که میتوانید از حلقه برای آن استفاده کنید) مثال زیر یک نمونه دقیق از چیزی است که ممکن است در بازی استفاده شود کد زیر شرح میدهید که چگونه 4 دشمن متفاوت را در چهار موقعیت متفاوت در حالت نگهداری کنیم 

ابتدا آن ها را در رویداد ایجاد (create) ابجکت کنترلر بازی مقدار دهی میکنیم :

enemy[3,2] = 448; //y position
 enemy[3,1] = 32; //x position
 enemy[3,0] = obj_Slime; //Object
 enemy[2,2] = 448;
 enemy[2,1] = 608;
 enemy[2,0] = obj_Skeleton;
 enemy[1,2] = 32;
 enemy[1,1] = 608;
 enemy[1,0] = obj_Knight;
 enemy[0,2] = 32; 
 enemy[0,1] = 32;
 enemy[0,0] = obj_Ogre;

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

var i;
 i = irandom(3); //get a random number from 0 to 4
 instance_create(enemy[i,1], enemy[i,2], enemy[i,0]); //Use the array to create the object

کد بالا یک دشمن به صورت تصادفی انتخاب و ایجاد میکند بدون اینکه از شرط if  یا عبارت switch استفاده کنیم ، از انجایی که کد های اولیه ارایه همگی در رویداد create ابجکت کنترلر هستند مدیریت آن ها بسیار اسان است و به راحتی میتوان آن ها را خواند 

 

 قابلیت های ارایه ها

مانند یک متغیر میتوانید آن ها را به اسکریپت ها ارسال کنید یا از آن ها ارایه برگشت دهید برای این کار کافیست نام ارایه را بدون این که لازم باشد موقعیت ورودی آن را همراه  یا از []  استفاده کنید ارایه به صورت مرجع برای اسکریپت ارسال می شوند باید در نظر داشته باشید که اسکریپت یک کپی از آن میسازد و اگر داخل اسکریپت تغییری بر روی آن اعمال شد باید ارایه برگشت داده شود در غیر این صورت تغییرات در ارایه اصلی لحاظ نخواهد شد 

نکته: در هنگام ارسال ارایه ها به اسکریپت ها توجه داشته باشید که بر روی سرعت بازی تاثیر خواهند گذاشت به خصوص اگر ارایه بسیار بزرگ باشد بنابراین در استفاده از ان دقت کنید!

 

در مثال زیر ما یک ارایه ایجاد کرده و سپس آن را به اسکریپت ارسال کرده ایم 

for (var i = 9; i > -1; i--;)
    {
    a[i] = i;
    } 

 scr_Return_Array(a);

 

کد های داخل اسکریپت به صورت زیر هستند:

for (var i = 9; i > -1; i--;)
    {
    a[i] = i * 100;
    }

 

حالا ما انتظار داریم که مقادیر داخل ارایه شامل 900،800،700 ،... باشند اما این طور نیست به دلیل ان که پس از اعمال تغییر در اسکریپت را ان بازگشت ندادیم بنابرین هنگام ارسال ارایه به اسکریپت باید به شکل زیر عمل کنیم 

for (var i = 9; i > -1; i--;)
    {
    a[i] = i;
    } 

 a = scr_Return_Array(a);

و  اسکریپت باید به شکل زیر باشد

for (var i = 9; i > -1; i--;)
    {
    argument0[i] = i * 100;
    }

 return argument0;

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

شما میتوانید به راحتی ارایه ایجاد شده را در یک خط حذف کنید برای این کار باید یک بار به ان یک مقدار نسبت دهید این کار مقدار حافظه ای را که اشغال کرده است ازاد میکند 

مثال

//Create the array for (var i = 9; i > -1; i--;)
    {
    a[i] = i;
    }
 //Delete the array a = 0; 

 

لازم به ذکر است میتوانید از دسترسی سریع @ برای ارجاع مستقیم به ارایه از یک اسکریپت برای انجام تغییرات به صورت مستقیم استفاده کنید 

 

توابع ارایه ها 

میتوانید از توابع زیر برای افزایش انعطاف پذیری و استفاده پویا از ارایه استفاده کنید 

is_array

array_length_1d

array_length_2d

array_height_2d



نسخه PDF این مطلب را دانلود کنید




نویسنده: hadi eb