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

امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل image_xscale
#1
سلام دوستان يک سوال دارم
اين کد پايين رو واسه پلير گذاشتم تا وقتي دشمن به محدوده رسيد بره دنبالش
تا اينجا که مشکلي نيست درسته

if (distance_to_object(obj_enemy)<150)
{
action_linear_step(instance_nearest(x,y,obj_enemy).x,instance_nearest(x,y,obj_enemy).y,4,0);
}

حالا ميخام وقتي پلير به سمت راست حرکت ميکنه
image_xscale=1
برابر همين 1 باشه
و وقتي به سمت چپ حرکت ميکنه
image_xscale=-1
بشه -1 ولي نميشه
البته من واسه دومی منفی تایپ کردم اینجا نمیدونم چرا نشون نمیده ولی بهرحال شما دومی رو منفی بگیرید یعنی سمت چپ بشه منفی
------------------
 و البته در حالت معمول وقتي کد زير رو به يه کاراکتر ميدي عمل ميکنه
مثلا
if(hspeed>0)
{
image_xscale=1
}
if(hspeed<0)
{
image_xscale=-1
}

ولي وقتي از اون کد اول مربوط به تعقيب استفاده ميکنم ديگه اينا جواب نميده
در ضمن دقت کنيد من نميخوام تو مسيرهاي مختلف اسپرايت عوض بشه هدف فقط تعقير
image_xscale=1
هست
حالا لطفا دوستان که ميتونن مشکل رو حل کنن ممنون ميشم کمکم کنيد
پاسخ
#2
سلام .
تغییر image scale رو توی کلید های کیبورد تعریف کنید .
وقتی کلید راست زده شد : image_xscale = 1
و وقتی کلید چپ زده شد : image_xscale = -1

این روش همیشه بدون مشکل جواب داده .
پاسخ
#3
(1/2/1398، 11:08 صبح)MiladKaydi نوشته است: سلام .
تغییر image scale رو توی کلید های کیبورد تعریف کنید .
وقتی کلید راست زده شد : image_xscale = 1
و وقتی کلید چپ زده شد : image_xscale = -1

این روش همیشه بدون مشکل جواب داده .

ممنونم بابت پاسخ
ولی داداش سوال رو با دقت خوندی اینی که گفتی رو من میدونم
تو سوال گفتم که از کلید خبری نیست
پلیر حرکتش خودکار هست و وقتی دشمن بهش نزدیک میشه خودش دنبال دشمن میره اصلا اون کد بالا واسه تعقیب دشمن هست sad
پاسخ
#4
این شیوه رو امتحان کنید ، احتمالا مشکل رو برطرف میکنه.
توی آبجکت پلیر در step تعریف کنید :
if x < obj_enemy.x
{ image_xscale = 1 }
else
{ image_xscale = -1 }

اگر تصویر اسپرایتتون ، چهره ش به سمت راسته همین
کدا رو بنویسید ، ولی اگه روش به سمت چپه ، جای 1 و 1-
رو عوض کنید .
پاسخ
 سپاس شده توسط ProMember ، sina2000
#5
(2/2/1398، 06:52 صبح)MiladKaydi نوشته است: این شیوه رو امتحان کنید ، احتمالا مشکل رو برطرف میکنه.
توی آبجکت پلیر در step تعریف کنید :
if x < obj_enemy.x
{ image_xscale = 1 }
else
{ image_xscale = -1 }

اگر تصویر اسپرایتتون ، چهره ش به سمت راسته همین
کدا رو بنویسید ، ولی اگه روش به سمت چپه ، جای 1 و 1-
رو عوض کنید .

خیلی ممنونم ولی اینم نشد کلا ارور داره و تازه اگه میشد فکر کنم واسه یک پلیر جواب میداد تو روم من چند تا پلیر و چند تا دشمن هست
بهرحال بابت زحمتش ممنونم
و سوال همچنان بی پاسخ مونده
پاسخ
#6
سلام. میتونی یک متغیر درست کنی، مقدار x دشمن رو توی اون ذخیره کنی و هر چند وقت یک بار آپدیتش کنی. در نهایت هم بیای و چک کنی ببینی x حال حاضر دشمن نسبت به x قبلی دشمن چه تغییری کرده. این اطلاعاتو توی یک متغیر ذخیره میکنی و در نهایت اون متغیر رو برابر image_xscale دشمن قرار میدی.
 
توضیح قدم به قدمش اینه که:
 
[create event]
نقل قول:
LastX = x;
alarm[0] = 5;
 
Xdif = 1;
 
خیلی ساده اومدیم متغیری که قراره توش آخرین x رو ذخیره میکنیم رو تعریف کردیم. یعنی LastX
بعد اومدیم زمانی که طول میکشه این متغیر ینی LastX آپدیت بشه رو تعریف کردیم. یعنی بخش alarm[0] = 5
در نهایت هم اومدیم متغیری که قراره در نهایت برابر image_xscale دشمن قرار بدیم رو تعریف کردیم. یعنی Xdif
 
[alarm 0 event]
نقل قول:
LastX = x;
alarm[0] = 5;
 

اینجا میایم LastX رو آپدیت میکنیم.
و alarm 0 رو تنظیم میکنه که 5 استپ دیگه دوباره LastX رو آپدیت کنه.
 
[Step event]
نقل قول:
Xdif = x-LastX;
image_xscale = sign(Xdif);
 
در نهایت Xdif رو از منها کردن x حال حاضر دشمن و x قبلی دشمن یعنی LastX حساب میکنیم. LastX برابر اختلاف این دو تا x میشه.
در نهایت لازم داریم که Xdif رو تبدیل به -1 و یا 1 کنیم. برای این کار از sign استفاده میکنیم.
 
ُSign: ساین میاد علامت عددی که بهش میدید رو بهتون برمیگردونه. مثلا اگه عدد -40 که منفیه رو به ساین بدید، عددی که برمیگردونه میشه -1. یا اگر عدد 30 که یک عدد مثبته رو بهش بدید، عددی که برمیگردونه عدد 1 ـه.


 
تنها کاری که میمونه اینه که image_xscale رو برابر Xdif قرار بدیم که تو کد بالا انجامش دادیم.
پاسخ
 سپاس شده توسط sina2000
#7
(6/2/1398، 07:18 عصر)TNT نوشته است: سلام. میتونی یک متغیر درست کنی، مقدار x دشمن رو توی اون ذخیره کنی و هر چند وقت یک بار آپدیتش کنی. در نهایت هم بیای و چک کنی ببینی x حال حاضر دشمن نسبت به x قبلی دشمن چه تغییری کرده. این اطلاعاتو توی یک متغیر ذخیره میکنی و در نهایت اون متغیر رو برابر image_xscale دشمن قرار میدی.
 
توضیح قدم به قدمش اینه که:
 
[create event]
نقل قول:
LastX = x;
alarm[0] = 5;
 
Xdif = 1;
 
خیلی ساده اومدیم متغیری که قراره توش آخرین x رو ذخیره میکنیم رو تعریف کردیم. یعنی LastX
بعد اومدیم زمانی که طول میکشه این متغیر ینی LastX آپدیت بشه رو تعریف کردیم. یعنی بخش alarm[0] = 5
در نهایت هم اومدیم متغیری که قراره در نهایت برابر image_xscale دشمن قرار بدیم رو تعریف کردیم. یعنی Xdif
 
[alarm 0 event]
نقل قول:
LastX = x;
alarm[0] = 5;
 

اینجا میایم LastX رو آپدیت میکنیم.
و alarm 0 رو تنظیم میکنه که 5 استپ دیگه دوباره LastX رو آپدیت کنه.
 
[Step event]
نقل قول:
Xdif = x-LastX;
image_xscale = sign(Xdif);
 
در نهایت Xdif رو از منها کردن x حال حاضر دشمن و x قبلی دشمن یعنی LastX حساب میکنیم. LastX برابر اختلاف این دو تا x میشه.
در نهایت لازم داریم که Xdif رو تبدیل به -1 و یا 1 کنیم. برای این کار از sign استفاده میکنیم.
 
ُSign: ساین میاد علامت عددی که بهش میدید رو بهتون برمیگردونه. مثلا اگه عدد -40 که منفیه رو به ساین بدید، عددی که برمیگردونه میشه -1. یا اگر عدد 30 که یک عدد مثبته رو بهش بدید، عددی که برمیگردونه عدد 1 ـه.


 
تنها کاری که میمونه اینه که image_xscale رو برابر Xdif قرار بدیم که تو کد بالا انجامش دادیم.

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


if(direction < 90 )
{
if(direction > 0)
{
image_xscale=1
}}

if(direction > 270 )
{
image_xscale=1
}

if(direction > 90 )
{
if(direction < 180)
{
image_xscale=-1
}}

if(direction > 180 )
{
if(direction < 270)
{
image_xscale=-1
}}
پاسخ
 سپاس شده توسط TNT
#8
(7/2/1398، 07:55 عصر)sina2000 نوشته است: داداش ممنونم مال شما رو تست نکردم چون یکی از دوستان تو تلگرام راه حل اسونتری داد و مشکل حل شد
جوابشم کد زیر در انتهای ایونت استپ


if(direction < 90 )
{
if(direction > 0)
{
image_xscale=1
}}

if(direction > 270 )
{
image_xscale=1
}

if(direction > 90 )
{
if(direction < 180)
{
image_xscale=-1
}}

if(direction > 180 )
{
if(direction < 270)
{
image_xscale=-1
}}
 

روشی که برات نوشتم براش فرقی نمیکنه که داری از direction استفاده میکنی یا نه.
ولی بازم اگه اینجوری مشکلت حل شد، خیلی خوبه :)
پاسخ
 سپاس شده توسط MiladKaydi




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