انجمن تخصصی بازی سازی پرومیکرز

نسخه‌ی کامل: رد نشدن آبجکت از آبجکت دیگر
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام من مشکلی دارم تو گیم میکر 8 که نمیدونم چجوری حلش کنم
من میخوام وقتی در بازی آبجکت آدم از یک جا مثل دیوار نتونه بگذره
برای اون دیوار باید چیکار کنیم یعنی چه امکانات و اکشن هایی بزاریم که آدم نتونه ازش رد بشه؟
اگه تونستید سورس بزارید ممنون میشم.
بستگی به روش حرکت بازیکنتون داره ولی معمولا بهترین روش اینه که با place_free بررسی کنید ببینید جلوی بازیکن دیوار هست یا نه.
مثلا موقع حرکت به سمت راست، سمت راستِ بازیکن رو بررسی کنید:
کد:
if(place_free(x+30,y)) {
//دستورات حرکت
}

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

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

فکر میکنم تو گیم میکر 8 هم اجرا بشه
روشی که 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;
}
}
این کد خیلی بهتره  V
فقط چرا تعریف متغیرو گذاشتید توی step؟ یک بار تعریف بشه توی create که بهینه تره...
(1/5/1397، 12:54 عصر)qwerty13 نوشته است: [ -> ]این کد خیلی بهتره  V
فقط چرا تعریف متغیرو گذاشتید توی step؟ یک بار تعریف بشه توی create که بهینه تره...


 
متغیرای KeyLeft و KeyRight و KeyUp و KeyDown دائما دارن چک میشن. چون دکمه کیبورد رو چک میکنن، معلوم نیست دقیقا کی قراره مادیفای بشن.
برای همین اگر مثلا تو Create event باشن، فقط یکبار اول بازی چک میشن و یجورایی من فقط یک استپ فرصت حرکت دادن بازیکنم رو دارم، و حتی اگر موفق بشم تو اولین استپ دکمه ی مثلا "چپ" رو فشار بدم، متغیر KeyLeft برابر true میشه و حتی اگه من دستمو از رو دکمه بردارم هم دیگه آپدیت نمیشه. برای همین آبجکت بدون کنترل من برای همیشه به سمت چپ حرکت میکنه.
نه منظورم اینه که توی create بنویسیم:
کد:
var Keyleft;
یعنی تعریف متغیر یکبار انجام بشه ولی مقدار دهیش توی step باشه.
(2/5/1397، 12:17 عصر)qwerty13 نوشته است: [ -> ]نه منظورم اینه که توی create بنویسیم:
کد:
var Keyleft;
یعنی تعریف متغیر یکبار انجام بشه ولی مقدار دهیش توی step باشه.


نه دیگه متغیری که تعریف کردیم متغیر پرایوته. حتی بهینه تر هم هست اگه یک راست تو Step event تعریف بشه. چون فقط تو همون Event قابل دسترسیه.
(3/5/1397، 06:07 عصر)TNT نوشته است: [ -> ]
(2/5/1397، 12:17 عصر)qwerty13 نوشته است: [ -> ]نه منظورم اینه که توی create بنویسیم:
کد:
var Keyleft;
یعنی تعریف متغیر یکبار انجام بشه ولی مقدار دهیش توی step باشه.


نه دیگه متغیری که تعریف کردیم متغیر پرایوته. حتی بهینه تر هم هست اگه یک راست تو Step event تعریف بشه. چون فقط تو همون Event قابل دسترسیه.

صحیح , ,ولی خب تعریف شدن مداومش پردازش بیشتر نمیخواد؟
صفحه‌ها: 1 2