PDA

View Full Version : سوال: مختصات Mouse در محیط بازی



H_G_G_I
سه شنبه 07 آذر 1391, 23:21 عصر
سلام:لبخندساده:
من یه کلاس صحنه دارم که این چیزا رو داره ::

View_X
View_Y
View_Scale_X
View_Scale_Y
View_Rotation

برفرض اینکه مقادیر پیفرضش اینا باشه (به ترتیب )

100
100
0.5
0.5
45

من می خوام وقتی روی پنجره بازی کلیلک می کنم (بر فرض در نقطه 400 در 300)
معادل این نقطه تو محیط بازی رو بدست بیارم و یه ابجت تو اون قسمت بزارم !
مثلا تو حالت خیلی ساده View_X + Mouse_X کنیم حله !
ولی الان من مقباس و چرخش هم دارم !
من یه فرمول من دراوردی درست کردم مشکلش اینه که فقط چرخشش کار نمی کنه !:متفکر:
وقتی می چرخونم یه چیز دیگه میشه !
چی بنویسم تا درست شه !
الان من ته زورمو زدم اینو نوشتم !:ناراحت:

/*******************
m_WindowWidth = 800;
m_WindowHeight = 600;
m_View_Scale_X = 0.5f
m_View_Scale_Y = 0.5f
m_ViewX = 100;
m_ViewY = 100;
m_ViewAngle = 45f;
m_MouseX = 400;
m_MouseY = 300;
********************/

float l_halfW = m_WindowWidth / 2;
float l_halfH = m_windowHeight / 2;
float l_n1 = 1.0f / m_View_Scale_X;
float l_n2 = 1.0f / m_View_Scale_Y;
float l_xx = m_ViewX + (m_MouseX * l_n1 - (l_n1 * l_halfW - l_halfW));
float l_yy = m_ViewY + (m_MouseY * l_n2 - (l_n2 * l_halfH - l_halfH));
float l_angle = atan2f(l_yy , l_xx );
float l_length = sqrt( l_xx*l_xx + l_yy*l_yy);
l_xx = cosf( l_angle + m_ViewAngle * DEG2RAD ) * l_length;
l_yy = sinf( l_angle + m_ViewAngle * DEG2RAD ) * l_length;

//obj_add( l_xx, l_yy, "Mario");


یکی کمک کنه !
خسته شدم انقدر فکریدم !:گریه:

اینو نمونه رو دان کنید !:لبخند:


http://uploadkon.ir/?file=New folder_39.rar

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

H_G_G_I
چهارشنبه 08 آذر 1391, 13:24 عصر
1 سال بعد ...
کسی نیست کمک کنه ؟ سوال نا مفهومه ؟ :متفکر:
:گریه:

pswin.pooya
چهارشنبه 08 آذر 1391, 19:51 عصر
سلام
موضوعی که در مورد اعداد اعشاری بهش اشاره کردید بهش خطای دقت اعشار گفته میشه. لزوما داخل همه سیستم ها و یا حتی سیستم عامل ها این شکلی نیست و یا دقیقا توی رینج خاصی اتفاق نمی افته دلیلش مربوط به تکنیک ساخت اعداد اعشاری هست.

پیدایش این تکنیک از زمانی سرچشمه میگیره که تعداد بیت ریجیسترهای پردازنده ها کم بود و نمی تونستن اعداد بزرگ مثل هفت میلیون رو باهاش نشون بدن. به همین دلیل بیت های کم ارزش یک عدد رو حذف می کردن. با کم کردن هربیت کم ارزش از رقم میزان رینج دو برابر می شد. به عنوان مثال با یه ثبات (ریجیستر)‌ ۱۶ بیتی بزرگترین رقمی که میشه نشون داد ۶۵۵۳۶ هست در حالی که اگر هشت بیت کم ارزش حذف شه میشه تا ۱۶ میلیون نمایش داد و این قضیه لگاریتمی افزایش پیدا می کنه.

اصل این قضیه از اونجا نشات می گیره که مثلا با رقم های بزرگ سرو کار داریم رقم های کوچیک داخل اونها مهم نیست مثلا اگر یه ماشین ۱۵ میلیونی میرین بخرین دیگه فروشنده نمی گه ۱۵۰۰۱۰۲۴۳۴۵ ریال خیلی رند می کنه و میگه ۱۵ تومن. همین موضوع بعدا توی نمایش اعداد اعشاری استفاده شد تا بتونن این اعداد رو برای کامپیوترهای تعریف کنن که فقط اعداد صحیح رو می شناختن و ... به همین دلیل هم دقت اعشار داخل اعداد اعشاری کم هست. البته اگر double استفاده بکنید یه مقدار قضیه بهتر میشه. اما باز هم این قضیه وجود داره.

برای این موضوع راه حلهای زیادی هم هست.

H_G_G_I
چهارشنبه 08 آذر 1391, 20:53 عصر
سلام
موضوعی که در مورد اعداد اعشاری بهش اشاره کردید بهش خطای دقت اعشار گفته میشه. لزوما داخل همه سیستم ها و یا حتی سیستم عامل ها این شکلی نیست و یا دقیقا توی رینج خاصی اتفاق نمی افته دلیلش مربوط به تکنیک ساخت اعداد اعشاری هست.

پیدایش این تکنیک از زمانی سرچشمه میگیره که تعداد بیت ریجیسترهای پردازنده ها کم بود و نمی تونستن اعداد بزرگ مثل هفت میلیون رو باهاش نشون بدن. به همین دلیل بیت های کم ارزش یک عدد رو حذف می کردن. با کم کردن هربیت کم ارزش از رقم میزان رینج دو برابر می شد. به عنوان مثال با یه ثبات (ریجیستر)‌ ۱۶ بیتی بزرگترین رقمی که میشه نشون داد ۶۵۵۳۶ هست در حالی که اگر هشت بیت کم ارزش حذف شه میشه تا ۱۶ میلیون نمایش داد و این قضیه لگاریتمی افزایش پیدا می کنه.

اصل این قضیه از اونجا نشات می گیره که مثلا با رقم های بزرگ سرو کار داریم رقم های کوچیک داخل اونها مهم نیست مثلا اگر یه ماشین ۱۵ میلیونی میرین بخرین دیگه فروشنده نمی گه ۱۵۰۰۱۰۲۴۳۴۵ ریال خیلی رند می کنه و میگه ۱۵ تومن. همین موضوع بعدا توی نمایش اعداد اعشاری استفاده شد تا بتونن این اعداد رو برای کامپیوترهای تعریف کنن که فقط اعداد صحیح رو می شناختن و ... به همین دلیل هم دقت اعشار داخل اعداد اعشاری کم هست. البته اگر double استفاده بکنید یه مقدار قضیه بهتر میشه. اما باز هم این قضیه وجود داره.

برای این موضوع راه حلهای زیادی هم هست.

:قهقهه:
:قهقهه:
:قهقهه:
:قهقهه:

دمت گرم ولی اون امضامه ها ! :لبخند:
سوال در مورد یه چی دیگه پرسیدم ! (مختصات Mouse در محیط بازی)
ولی دستت درد نکنه خیلی خوب توضیح دادی ! من انگلیسی شو که خوندم چیزی نفهیدم ! :متفکر:
گفتم لابد سی پلاس باگ داره :بامزه:
این یکی مشکلمونم حل کنی نور الی نور میشه :بوس:
:لبخند:
:تشویق:

pswin.pooya
پنج شنبه 09 آذر 1391, 12:01 عصر
سوال کلیک و انتخاب اشیاء بارها داخل تالار پرسیده شده و اصولا من باید تاپیک رو حذف می کردم. یه سرچ کوچولو بزنی می بینی همین دو سه روز پیش هم همچین سوالی پرسیده شده.

Sharar3D
شنبه 11 آذر 1391, 21:37 عصر
من برنامت رو دانلود کردم و تست کردم
مشکل چرخش مستطیل در جهت ماوس اینه که مبدا چرخش مستطیل جای درستی نیست
مبدا محاسبه زاویه چرخش ۰ و ۰ هست٬ یعنی درست بالا سمت چپ پنجره برنامت
مبدا محاسبه زاویه رو اگه به وسط مستطیل منتقل کنی باید مشکلت حل بشه
این جوری اگه مستطیل رو هر جا منتقل کنی زاویه درست به ماوس رو میتونه پیدا کنه

باید زاویه نقطه مبدا مستطیل ( یا هر شکل دیگه رو ) نسبت به مکان ماوس بدست بیاری
نقطه مبدا مستطیل مورد نظر میشه
مکان عرضی مسطتیل + ( عرض مستطیل / ۲ )
مکان ارتفاعی مسطتیل + ( ارتفاع مستطیل / ۲ )
حالا اینها رو از مکان ماوس کسر باید کنی تا اختلاف اون ها بدست بیاد و این اختلاف ها رو توی فرمول atan2f بتونی استفاده کنی
حواست باشه فقط که y بدست اومده رو به صورت منفی وارد فرمول کنی٬ چون در نمایشگر ارتفاع از بالا به پایین رسم میشه ( برعکس جدول مختصات ریاضی )
کد کلی یه چیزی تو این مایه هاست :


# point 1
x1 = 0.5
y1 = 0.0

# point 2
x2 = -0.5
y2 = -1.0

deltax = x2 - x1
deltay = y2 - y1

angle= atan2(deltay,deltax)