انجمن تخصصی بازی سازی پرومیکرز
رد نشدن آبجکت از آبجکت دیگر - نسخه‌ی قابل چاپ

+- انجمن تخصصی بازی سازی پرومیکرز (http://promakers.ir)
+-- انجمن: نرم افزارها و موتورهای ساخت بازی (http://promakers.ir/Forum-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1%D9%87%D8%A7-%D9%88-%D9%85%D9%88%D8%AA%D9%88%D8%B1%D9%87%D8%A7%DB%8C-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A8%D8%A7%D8%B2%DB%8C)
+--- انجمن: Game Maker (http://promakers.ir/Forum-Game-Maker--30)
+--- موضوع: رد نشدن آبجکت از آبجکت دیگر (/Thread-%D8%B1%D8%AF-%D9%86%D8%B4%D8%AF%D9%86-%D8%A2%D8%A8%D8%AC%DA%A9%D8%AA-%D8%A7%D8%B2-%D8%A2%D8%A8%D8%AC%DA%A9%D8%AA-%D8%AF%DB%8C%DA%AF%D8%B1)



رد نشدن آبجکت از آبجکت دیگر - amirmahdipanahi - 13/3/1397

سلام من مشکلی دارم تو گیم میکر 8 که نمیدونم چجوری حلش کنم
من میخوام وقتی در بازی آبجکت آدم از یک جا مثل دیوار نتونه بگذره
برای اون دیوار باید چیکار کنیم یعنی چه امکانات و اکشن هایی بزاریم که آدم نتونه ازش رد بشه؟
اگه تونستید سورس بزارید ممنون میشم.


RE: رد نشدن آبجکت از آبجکت دیگر - qwerty13 - 13/3/1397

بستگی به روش حرکت بازیکنتون داره ولی معمولا بهترین روش اینه که با place_free بررسی کنید ببینید جلوی بازیکن دیوار هست یا نه.
مثلا موقع حرکت به سمت راست، سمت راستِ بازیکن رو بررسی کنید:
کد:
if(place_free(x+30,y)) {
//دستورات حرکت
}

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


RE: رد نشدن آبجکت از آبجکت دیگر - amirmahdipanahi - 14/3/1397

ممنون حتما امتحانش میکنم


RE: رد نشدن آبجکت از آبجکت دیگر - Alireza_kasir - 18/4/1397

(13/3/1397، 01:42 عصر)amirmahdipanahi نوشته است: سلام من مشکلی دارم تو گیم میکر 8 که نمیدونم چجوری حلش کنم
من میخوام وقتی در بازی آبجکت آدم از یک جا مثل دیوار نتونه بگذره
برای اون دیوار باید چیکار کنیم یعنی چه امکانات و اکشن هایی بزاریم که آدم نتونه ازش رد بشه؟
اگه تونستید سورس بزارید ممنون میشم.

گیم میکر8 رو نمیدونم ولی تو گیم میکر استودیو برای این کار توی رویداد برخورد با آبجکت دیوار speed رو مساوی صفر قرار بدی حله

فکر میکنم تو گیم میکر 8 هم اجرا بشه


RE: رد نشدن آبجکت از آبجکت دیگر - TNT - 1/5/1397

روشی که qwerty13 گفت هم روش درستیه. ولی استفاده از تیک solid کلا پیشنهاد نمیشه. بخاطراینکه باعث یکسری مشکلات مثل performance و ریسپانسیو نبودن بازی میشه.
 
پیشنهاد من استفاده از place_meeting ـه.
روش استفاده هم ممکنه یکم پیچیده باشه ولی کامل توضیح میدم که متوجه بشی.
 
تو مرحله اول باید یکسری متغیر رو معرفی کنیم که به این صورته:
 
[Create event]
کد:
Spd = 10;
 
مرحله بعد مربوط به حرکت و برخورد با دیواره.
این مرحله رو هم میشه با ایونت keyboard button اجرا کرد و هم همش رو تو یک Step event خلاصه کرد که راحت تره. که من از روش Step event میگم:
 
تعریف متغیر های مربوط به کیبورد. این متغیرا متغیر پرایوت یا لوکالن. برای همین اولشون var میزاریم.
 
[Step event]
کد:
var LeftKey = keyboard_check(vk_left);
var RightKey = keyboard_check(vk_right);
var UpKey = keyboard_check(vk_up);
var DownKey = keyboard_check(vk_down);
 
تو کد بالا در واقع با متغیر داریم فشار داده شدن دکمه های جهت کیبورد رو تو متغیر ذخیره میکنیم. ینی اگه مثلا دکمه ی "چپ" فشار داده بشه، LeftKey برابر میشه با true و اگه دستمون رو از رو دکمه ی "چپ" برداریم LeftKey برابر میشه با false.
 
کد بالا، کار چهارتا ایونت key down برای بالا و پایین و چپ و راست رو انجام میده. ببین چقدر صرفه جویی میشه تو وقت!
 
بعد از این که کیبوردمون اوکی شد، میتونیم بریم سراغ اجرای ریکشن پلیر نسبت به دکمه های کیبورد.
خوبی این روش اینه که برخورد با دیوار و حرکت کردن بازیکن هردوش با هم اجرا میشه.
ادامه [Step event]
کد:
if (LeftKey) {
hspeed = -Spd;
}
 
اینجا، میبینیم اگر دکمه ی "چپ" در حال فشار داده شدن بود، بازیکن رو به سمت چپ حرکت میدیم.
متغیر hspeed متغیر bult-in هست و جز پیشفرضای خود گیم میکره.
 
حالا همین حرکت رو برای سه جهت دیگه هم اجرا میکنیم:
 
کد:
if (RightKey) {
hspeed = Spd;
}

if (UpKey) {
vspeed = -Spd;
}

if (DownKey) {
vspeed = Spd;
}
 

خب
 
حالا میرسیم به بخشی که ممکنه فهمیدنش یکم سخت باشه.
کد بالا فقط حرکت میکنه و با دیوار برخورد نمیکنه.
 
توضیح تئوریش اینه که میایم چک میکنیم ببینیم بازیکن داره به کدوم سمت حرکت میکنه، بعد هر سمتی که میرفت، چندتا پیکسل جلوترش رو چک میکنیم و اگه دیواری نبود میزاریم بازیکن به جلو رفتن ادامه بده، و اگر دیوار بود نمیزاریم حرکت کنه.
 
برای اجراش لازمه کد های حرکت بالا رو یکم دستکاری کنیم و همین. یه سیستم برخورد خوب داریم.
 
اول کار ما یک متغیر سرعت به اسم Spd تعریف کردیم که برابر 10 بود. این ینی پلیر با سرعت 10 پیکسل حرکت میکنه. ینی هر بار دکمه ای رو نگه داره، 10 تا پیکسل جابه جا میشه. پس باید همیشه 10 تا پیکسل جلوتر رو برای دیوار چک کنیم که یوقت بازیکن تو دیوار گیر نکنه.
 
پس کدمون اینشکلی میشه:
 
کد:
if (KeyLeft) {
if (place_meeting(x-Spd, y, obj_Wall)) {
hspeed = 0;
} else {
hspeed = -Spd;
}
}
 
کد بالا 10 تا پیکسل از سمت چپ بازیکن رو برای دیوار obj_Wall چک میکنه. اگر دیواری بود hspeed رو 0 میکنه که حرکت نکنیم و اگر نبود else مقدار hspeed رو برابر Spd میکنه. ینی 10.
 
در نهایت میشه این:
 
کد:
if (KeyRight) {
if (place_meeting(x+Spd, y, obj_Wall)) {
hspeed = 0;
} else {
hspeed = Spd;
}
}

if (KeyUp) {
if (place_meeting(x, y-Spd, obj_Wall)) {
vspeed = 0;
} else {
vspeed = -Spd;
}
}

if (KeyDown) {
if (place_meeting(x, y+Spd, obj_Wall)) {
vspeed = 0;
} else {
vspeed = Spd;
}
}



RE: رد نشدن آبجکت از آبجکت دیگر - qwerty13 - 1/5/1397

این کد خیلی بهتره  V
فقط چرا تعریف متغیرو گذاشتید توی step؟ یک بار تعریف بشه توی create که بهینه تره...


RE: رد نشدن آبجکت از آبجکت دیگر - TNT - 1/5/1397

(5 ساعت پیش)qwerty13 نوشته است: این کد خیلی بهتره  V
فقط چرا تعریف متغیرو گذاشتید توی step؟ یک بار تعریف بشه توی create که بهینه تره...


 
متغیرای KeyLeft و KeyRight و KeyUp و KeyDown دائما دارن چک میشن. چون دکمه کیبورد رو چک میکنن، معلوم نیست دقیقا کی قراره مادیفای بشن.
برای همین اگر مثلا تو Create event باشن، فقط یکبار اول بازی چک میشن و یجورایی من فقط یک استپ فرصت حرکت دادن بازیکنم رو دارم، و حتی اگر موفق بشم تو اولین استپ دکمه ی مثلا "چپ" رو فشار بدم، متغیر KeyLeft برابر true میشه و حتی اگه من دستمو از رو دکمه بردارم هم دیگه آپدیت نمیشه. برای همین آبجکت بدون کنترل من برای همیشه به سمت چپ حرکت میکنه.