آموزش ساخت بازی آنلاین-نوبتی(قسمت سوم)


آموزش ساخت بازی آنلاین-نوبتی(قسمت سوم)


قبل از اینکه بریم سراغ آموزش لازمه یه کد رو توی ایونت draw آبجکت obj_helthbar اصلاح کنیم تا نام کاربری دو طرف بازی زیر اسپرایت نوار زندگی (healthbar) نمونه و نمایش داده بشه برای این کار در این اونت آبجکت خط 8 رو منتقل میکنیم به خط 1 در این صورت کدهای این ایونت به صورت زیر در میاد.

draw_sprite(sprite_index,0,x,y)
draw_healthbar(x+143,y+66,x+291, y+85, global.heath,c_black, c_aqua,c_aqua,0,1,0)
draw_healthbar(x+496,y+66,x+344, y+85, global.e_heath,c_black, c_aqua,c_aqua,0,1,0)

draw_set_colour(c_white)
draw_text(x+180,y+43,global.username)
draw_text(x+457,y+43,global.e_username)

نتیجه این کارمون نمایش نام کاربری دو طرف در بخش مربوطه به رنگ سفید هست (تست1 و تست2 در تصویر زیر) به صورت زیر

آموزش ساخت بازی آنلاین-نوبتی(قسمت سوم)

خب بریم سراغ کار خودمون

چهار تا اسپرایت ایجاد میکنیم برای نمایش حالات ضربه و دفاع کاراکتر با نامهای spr_but1 و spr_but2 وspr_but3 وspr_but4 (برای این آموزش یکی از همین اسپرایتها کافیه برای آموزش بعدی هر 4 مورد الزامیه)

یه چندتا متغییر گلوبال جدید لازم داریم و این متغییر ها رو در آبجکت obj_global ایونت Create ایجاد میکنیم که کدهای این ایونت به صورت زیر تغییر پیدا میکنه

randomize()
global.username=""
global.userhero=0
global.heath=100

global.e_username=0
global.e_userhero=0
global.e_heath=100


global.tern=0
////new
global.file=""
global.attack=0
global.e_attack=0
////

برای اینکه بتونیم دو کاربر رو با همدیگه مرتبط کنیم نیازمند یک فایل هستیم که بین دو کاربر مشترک باشه برای این کار نام فایل مربوطه رو به دو کاربر باید اختصاص بدیم که این نام باید یکتا باشه تا تداخلی بین بازی ها به وجود نیاره به این منظور کدهای فایل player.php رو به صورت زیر تغییر میدیم

<?php

$user=$_GET['name'];
$hero=$_GET['hero'];

$read = file("start.txt");

foreach($read as $name)

{
$old_user=$name; 
}


$char=substr_count($old_user,"±");
if($char!=0)
{
$myfile = fopen("start.txt", "w");
fclose($myfile); 
$old_user='';
}


if($old_user!='')
{
$myfile = fopen("start.txt", "w");
fwrite($myfile,$old_user."±".$user.'°'.$hero);
fclose($myfile);
//////new
$time=rand(1000,9999).time().".txt";
$myfile = fopen("file.txt", "w");
fwrite($myfile,$time);
fclose($myfile);
/////
}
else
{
$myfile = fopen("start.txt", "w");
fwrite($myfile,$user.'°'.$hero);
fclose($myfile);
}

?>

 

  • کدهای 29 تا 34 یک نام یکتا با ترکیب اعداد رندوم و زمان کنونی با فرمت txt ایجاد کرده و در فایل file.txt ذخیره میکند.

جهت جلوگیری از بروز خطاهای احتمالی یک فایل به نام file.txt در سرور یا هاست ایجاد نمایید (خالی)

برای اینکه این نام فایل رو به کاربر ارجاع بدیم فایل start.txt رو هم به صورت زیر اصلاح میکنیم.

<?php

$user=$_GET['name'];

$array = array();

$read = file("start.txt");
foreach($read as $name)
{$file=$name; }
///////new
$read = file("file.txt");
foreach($read as $name)
{$filename=$name; }
//////////
$char=substr_count($file,"±");
if($char!=0)
{

$users=explode("±",$file);

$users1=explode("°",$users[0]);
$users2=explode("°",$users[1]);
if($user==$users1[0])
{
array_push($array,array("name"=>"$users2[0]", "hero"=>"$users2[1]","file"=>"$filename"));
array_push($array,array("show"=>"1"));
}
else
{
array_push($array,array("name"=>"$users1[0]", "hero"=>"$users1[1]","file"=>"$filename"));
array_push($array,array("show"=>"2")); 
}


$print = json_encode($array);

echo $print;


}
?>

 

  • دقت کنید در این فایل در خطوط 10 تا 14 نام فایل یکتا رو از فایل file.txt خونده و در خطوط 25 و یا 30 به کاربر ارجاع میدیم برای استفاده.

برای دریافت نام فایل یکتا در گیم میکر تغییرات زیر رو در آبجکت obj_loading_player اعمال میکنیم

ایونت .http. رو به صورت زیر تغییر میدیم

var type = ds_map_find_value(async_load,'id');
    if type == get
    {
        if ds_map_find_value(async_load,'status') == 0
        {
            var requestResult = ds_map_find_value(async_load,'result');
            var resultMap = json_decode(requestResult);
            var list = ds_map_find_value(resultMap, "default");
            top_rank_size = ds_list_size(list);
            size=real(top_rank_size);
            for (var n = 0; n < ds_list_size(list); n++;)
            {
                var map = ds_list_find_value(list, n);
                var curr = ds_map_find_first(map);
                while (is_string(curr))
                {  
                 
                name[n] = ds_map_find_value(map, "name");
                hero[n] = ds_map_find_value(map, "hero");
                ////new
                file[n] = ds_map_find_value(map, "file");
                ////
                curr = ds_map_find_next(map, curr);
                } 
     
                show = ds_map_find_value(map, "show");                      
                    
                ds_map_destroy(map);
            }
            ds_list_destroy(list);
            ds_map_destroy(resultMap);
        }
    }
  • خط 21 رو به این ایونت اضافه کردیم تا نام فایل رو از سرور یا هاست دریافت کنه

ایونت .step. رو به صورت زیر تغییر میدیم

if(show='1' or show='2')
{
global.e_username=string(name[0])
global.e_userhero=real(hero[0])
////new
global.file=string(file[0])
////
global.tern=real(show)

room_goto_next()
}
  • خط 6 رو به این ایونت اضافه کردیم تا نام فایل رو در متغییر گلوبال مربوطه ذخیره کنه

یه آبجکت با نام obj_send_attack ایجاد میکنیم تا اطلاعات حمله رو به سرور ارسال و دریافت کنه برای این آبجکت اسپرایت spr_loading رو انتخاب میکنیم.

یه آبجکت ایجاد میکنیم با نام obj_attack این آبجکت برای نمایش حالت ضربه هست و هدفمون اینه که با کلیک بر روی این آبجکت حمله مربوطه به سرور ارسال بشه و در صورتی که طرف مقابل هم ضربه زده باشه اقدامات لازمه انجام بگیره

یکی از چهار اسپرایت جدید رو به این آبجکت اختصاص میدیم

در این آبجکت ایونت Create کد زیر رو میزنیم که مانع حرکت فریمهای اسپرایت میشه

image_speed=0

در ایونت left pressed این آبجکت کدهای زیر رو وارد میکنیم

if(instance_number(obj_send_attack)=0 )
{
global.attack=random_range(0.1,2)
instance_create(400,240,obj_send_attack)
}
  • در خط 1 بررسی میکنیم اگه تعداد آبجکت obj_send_attack موجود در روم صفر باشه کدهای مربوطه اجرا بشه (برای جلوگیری از چند بار کلیک)
  • خط سوم یه عدد رندوم به متغییر حمله میدیم (این مقدار رندم فعلا قرار داده شده و در مراحل بعدی این مقدار بر اساس اصولی در نظر گرفته خواهد شد)
  • خط چهارم هم ابجکت obj_send_attack رو ایجاد میکنیم تا با سرور ارتباط برقرار کنه و اطلاعات بگیره.

در ایونت draw این آبجکت کدهای زیر رو وارد میکنیم

if(instance_number(obj_send_attack)=0 )
{
draw_sprite(sprite_index,image_index,x,y)
}
  • این کدها فقط جهت جلوگیری از کلیک مدام کابر هست و آبجکت رو در حالت انتظار محو میکنه و نمایش نمیده

برای آبجکت obj_send_attack کدهای زیر رو وارد میکنیم این آبجکت از روی آبجکت obj_loading_player کپی شده و تغییرات چندانی در کدهاش ایجاد نکردیم به همین دلیل تغییرات توضیح داده میشه. 

در ایونت Create کدهای زیر رو وارد میکنیم

http_get(string('https://gmstudio.ir/online_tenbase/attack.php?name=')
+string(global.username)+ string('&file=')+string(global.file)+
string('&attack=')+string(global.attack))

get = ''

image_speed=0.5

show=0
size=0


alarm[0]=30
  • در خطوط 1 تا 3 کدهای ارسال حمله به صفحه attack.php رو زدیم که متغییر های نام پلیر میزان حمله و نام فایل مشترک رو به این فایل ارسال میکنه
  • در خط 13 هم میزان آلارم رو برابر 30 فریم گذاشتیم تا نتیجه سریعتر به دستمون برسه

در ایونت alarm این آبجکت کدهای زیر رو وارد میکنیم

get = http_get(string("https://gmstudio.ir/online_tenbase/end.php?name=")
+string(global.username)+string('&file=')+string(global.file))

alarm[0]=30
  • در خطوط 1 تا 2 کدهای ارسال اطلاعات برای دریافت اطلاعات طرف مقابل به صفحه end.php رو زدیم که متغییر های نام پلیر و نام فایل مشترک رو به این فایل ارسال میکنه
  • در خط 4 هم میزان آلارم رو برابر 30 فریم گذاشتیم تا نتیجه سریعتر به دستمون برسه

در ایونت .http. همین آبجکت کدهای زیر رو وارد میکنیم 

var type = ds_map_find_value(async_load,'id');
    if type == get
    {
        if ds_map_find_value(async_load,'status') == 0
        {
            var requestResult = ds_map_find_value(async_load,'result');
            var resultMap = json_decode(requestResult);
            var list = ds_map_find_value(resultMap, "default");
            top_rank_size = ds_list_size(list);
            size=real(top_rank_size);
            for (var n = 0; n < ds_list_size(list); n++;)
            {
                var map = ds_list_find_value(list, n);
                var curr = ds_map_find_first(map);
                while (is_string(curr))
                {  
                 
                attack[n] = ds_map_find_value(map, "attack");
                
                curr = ds_map_find_next(map, curr);
                } 
     
                show = ds_map_find_value(map, "show");                      
                    
                ds_map_destroy(map);
            }
            ds_list_destroy(list);
            ds_map_destroy(resultMap);
        }
    }
  • در خط 18 متغییر حمله طرف مقابل رو از سرور دریافت کردیم

در ایونت .step. کدهای زیر رو وارد میکنیم

if(show='1' or show='2')
{
global.e_attack=real(attack[0])
global.e_heath=global.e_heath-global.attack*10
global.heath=global.heath-global.e_attack*10
instance_destroy()
}
  • در این کدها بررسی میکنیم اگه متغییر از سرور گرفته شده باشه میزان جان پلیر و طرف مقابل رو با استفاده از متغییر حمله دو طرف محاسبه میکنیم (فعلا)
  • بعد از اتمام کار این آبجکت رو در خط 7 حذف کردیم تا آماده حمله بعدی بشیم

یک فایل به نام attack.php ایجاد میکنیم و کدهای زیر رو داخلش وارد میکنیم

<?php

$user=$_GET['name'];
$attack=$_GET['attack'];
$file=$_GET['file'];

$read = file($file);
foreach($read as $name)

{
$old_attack=$name; 
}


$char=substr_count($old_attack,"±");
if($char!=0)
{
$myfile = fopen($file, "w");
fclose($myfile); 
$old_attack='';
}


if($old_attack!='')
{
$myfile = fopen($file, "w");
fwrite($myfile,$old_attack."±".$user.'°'.$attack);
fclose($myfile);
}
else
{
$myfile = fopen($file, "w");
fwrite($myfile,$user.'°'.$attack);
fclose($myfile);
}

?>

 

  • خط 3 تا 5 دو متغییر رو که از سمت گیم میکر ارسال شده دریافت میکنیم
  • خط 7 تا 12 محتویات فایل با نام یکتایی که از کاربر دریافت کردیم  رو میخونیم و در متغییر $old_attack ذخیره میکنیم
  • خط 15 تعداد کاراکتر ± موجود در محتویات فایل یکتا رو برمیگردونیم (چون اطلاعات دو پلیر رو با ± از هم جدا میکنیم پس اگه این کاراکتر وجود داشته باشه یعنی دوتا پلیر جمله رو انجام دادن)
  • خط 16 تا 21 اگه تعداد این کاراکترمون صفر نباشه محتویات فایل رو خالی کرده و متغییر$old_attack رو خالی میکنیم (این حالت یعنی دو پلیر قبلا حمله انجام دادن و این حمله جدید هست پس فایل رو خالی کرده و حمله جدید رو ذخیره میکنیم)
  • خط 24 بررسی میکنیم اگ فایل یکتامون خالی نباشه خط 25 تا خط 29 اجرا بشه و اگه خالی باشه کدهای خط 31 تا 35 اجرا بشه.
  • خط 25 تا 29 اطلاعات پلیر منتظر (پلیری که اول حمله رو تموم کرده ) رو با ± از اطلاعات پلیر دوم از هم جدا کرده در فایل ثبت میکنیم (نام و میزان حمله رو با استفاده از ° از هم جدا میکنیم)
  •  خط 31 تا 35 اطلاعات پلیر دوم در فایل ثبت میکنیم (نام و میزان حمله رو با استفاده از ° از هم جدا میکنیم)

یک فایل با نام end.php ایجاد میکنیم و کدهای زیر رو داخلش وارد میکنیم

<?php

$user=$_GET['name'];
$files=$_GET['file'];
$array = array();

$read = file($files);
foreach($read as $name)
{$file=$name; }


$char=substr_count($file,"±");
if($char!=0)
{

$users=explode("±",$file);

$users1=explode("°",$users[0]);
$users2=explode("°",$users[1]);

if($user==$users1[0])
{
array_push($array,array("name"=>"$users2[0]", "attack"=>"$users2[1]"));
array_push($array,array("show"=>"1"));
}
else
{
array_push($array,array("name"=>"$users1[0]", "attack"=>"$users1[1]"));
array_push($array,array("show"=>"2")); 
}


$print = json_encode($array);

echo $print;


}
?>
  •  خط3 و نام پلیر درخواست کننده و نام فایل یکتای مبارزه رو میگیریم
  • خط 5 یه متغییر از نوع آرایه ایجاد میکنیم بعدا لازم داریم
  • خط 7 تا 9 اطلاعات فایل یکتا رو میخونیم
  • خط 12 تعداد کاراکتر ± موجود در محتویات فایل یکتا رو برمیگردونیم (چون اطلاعات دو پلیر رو با ± از هم جدا میکنیم پس اگه این کاراکتر وجود داشته باشه یعنی دوتا پلیر حمله رو انجام دادن)
  • خط 13 بررسی میکنیم اگه کاراکتر ± داخل فایل موجود باشه (یعنی اگه دو پلیر حمله رو انجام داده باشن) کدهای خطوط 23 تا 35 رو اجرا میکنیم
  • خطوط 16 و 18 و 19 به ترتیب اطلاعات دو پلیر رو از هم جدا کرده بعد نام و میزان حمله رو از هم جدا میکنیم 
  • خط 21 بررسی میکنیم اگه پلیر درخواست دهنده پلیر اول باشه کدهای خطوط 23 و 24 رو اجرا میکنیم در غیر این صورت کدهای خطوط 28 و 29 اجرا میشه (یعنی میزان حمله طرف مقابل رو براش نشون میدیم)
  • خط 23 و 24 نام پلیر دوم و میزان حمله کاربر دوم رو در متغییر ارایه خودمون برای نمایش به کاربر اول (درخواست دهنده )ذخیره میکنیم و بعد متغییر show رو برابر یک وارد میکنیم به آرایه که یعنی پلیر درخواست دهنده پلیر اول ما هست.
  •  خط 28 و 29 نام پلیر اول  و میزان حمله کاربر دوم رو در متغییر ارایه خودمون برای نمایش به کاربر دوم (درخواست دهنده) ذخیره میکنیم و بعد متغییر show رو برابر دو وارد میکنیم به آرایه که یعنی پلیر درخواست دهنده پلیر دوم ما هست.
  •  خط 33 و 35 متغییر آرایه خودمون رو تبدیل به جیسون کرده و نمایش میدیم.

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

آموزش ساخت بازی آنلاین-نوبتی(قسمت سوم)

 

 

 


Download

zip

3.64 mb

    نظرات


    نام: ahmadreza

    8 آذر 1396
    عالیه ممنون
    نام: ایران رادا

    7 دی 1396
    حتما بخوانید با سامانه افزایش بازدید ایران رادا رتبه گوگل و الکسا سایتتان را بهبود دهید. ویژگی های استفاده از سامانه افزایش بازدید ایران رادا : 1 ) بهبود رتبه الکسا 2 ) بهبود جایگاه سایت در گوگل 3 ) قدرت بسیار زیاد نسبت به پاپ آپ 4 ) بهبود بانس ریت و پیج و ویو و تایم سایت 5 ) قیمت مناسب و تاثیر گذاری بالا به ما اعتماد کنید و یکبار تست کنید لینک سفارش : https://goo.gl/rQpcqs در صورت نیاز به هرگونه مشاوره با ما تماس بگیرید ☎️ تلفن : 03136511074 و 09395304616






ارسال نظر




رفتن به بالا