چگونه بايد در برنامه نويسي c از كليد هاي بالا و پايين براي طراحي بازي استفاده كنيم؟
چگونه بايد در برنامه نويسي c از كليد هاي بالا و پايين براي طراحي بازي استفاده كنيم؟
سوال شما خیلی خیلی کلی هست .
اگه منظورتون arrow key های بالا و پایین باشه ، می تونید با چند روش این کارو بکنید .
از ماکروهای ویندوز استفاده کنید که خوب کمی کندن و یا از DirectInput که داخل DirectX هست استفاده کنید ویا هر api دیگه ای مثل OIS و غیره .
کد زیر ماکرو ویندوز هست و به راحتی همه جا می تونید ازش استفاده کنید . فقط مراقب باشید که سرعتش خیلی زیاد نیست .
این ماکرو ها رو بالای کدتون وارد کنید
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
بعد تو حلقه بازی با کمک این ماکرو ها می تونید چک کنید که آیا اون دگمه ها زده شده یا نه
if (KEYUP(VK_ESCAPE)) { // exit }
if (KEYDOWN(VK_SPACE)) { }
چهار کلید جهتی دار رو می تونید با اینا چک کنید
VK_LEFT
VK_UP
VK_RIGHT
VK_DOWN
من فکر کنم چ.ن این توابع از دستورهای ویندوز استفاده میکنن خیلی سریع باشن چون بالاخره همون کتابخونه ها هم از همین توابع استفاده میکننسوال شما خیلی خیلی کلی هست .
اگه منظورتون arrow key های بالا و پایین باشه ، می تونید با چند روش این کارو بکنید .
از ماکروهای ویندوز استفاده کنید که خوب کمی کندن و یا از DirectInput که داخل DirectX هست استفاده کنید ویا هر api دیگه ای مثل OIS و غیره .
کد زیر ماکرو ویندوز هست و به راحتی همه جا می تونید ازش استفاده کنید . فقط مراقب باشید که سرعتش خیلی زیاد نیست .
یعنی استفاده از api خود ویندوز بهتره؟من فکر کنم چ.ن این توابع از دستورهای ویندوز استفاده میکنن خیلی سریع باشن چون بالاخره همون کتابخونه ها هم از همین توابع استفاده میکنن
بله. هر قدر بتونین به سیستم عامل نزدیک بشین انعطافتون بیشتر میشه. البته به همون اندازه هم باید مراقب باشین چون امکان باگ بیشتر میشه
نه پویا جان
direct input چون از خود سخت افزار استفاده می کنه یعنی شما دیواس ماوس یا کی برد رو که می سازی دقیقاً ارتباط مستقیم با سخت افزار داری و به همین خاطر خیلی خیلی سریعتره .
می تونی تست کنی .
OIS هم به نظر خوب میاد ولی من هنوز باهاش کار نکردم فقط کدهاشو دیدم .
برنامه نویس ها از ماکروها و توابع ویندوز استفاده می کنند تا سریعتر تست کنند کدهاشونو . اگه دقت کرده باشی موتورهای کاربردی یه فکر اساسی برای این موضوع می کنند نه اینکه بیان و به راحتی با چند تا ماکرو این کارو انجام بدن . و یا یه کلاس بنویسن و توابعشو به این ماکرو ها پاس بدن ! این کار زیاد منطقی به نظر نمیاد .
البته تو بعضی شرایط کار با توابع ویندوز خیلی بهتره . مثلا وقتی داریم با فایل ها کار می کنیم ، سریعترین توابع و کلاسها برای ویندوز هستند . اگه به طور مثال از iostream استفاده کنید خواهید دید که چقدر با معادل ویندوزش تفاوت سرعت داره . و برای ویندوز 7 هم شدیداً پیشنهاد می کنم از توابع ویندوز استفاده بشه . iostream سطح امنیت لازم رو نداره و ویندوز اجازه کار با فایل رو همجا بهش نمی ده .
نمی دونستم دایرکت input با درایورها مستقیما درگیر میشه.
من OIS رو هم بررسی کردم . اون از ترکیب توابع و ماکر.های ویندوز بعلاوه DirectInput استفاده می کنه .
در شرایطی که مثلا از حالا پنجره ای استفاده می کنید برای ماوس میاد و از clienttoScreen
و غیره برای بدست آوردن مختصات ماوس استفاده می کنه . به نظر خوب میاد ولی خیلی کداش زیاده و روی پلت فرم های مختلف هم کار می کنه .
و در شرایط فول اسکرین حالت Exclusive و دسترسی کامل مستقیماً با DirectInout و سخت افزار کار می کنه
ولی من ترجیح می دم از کلاس خودم که برای DirectInout نوشتم استفاده کنم . چون حداقل ساختارش هم خیلی ساده است و هم فقط از DirectInput استفاده می کنه نه ویندوز . و این سرعت رو تظمین می کنه .
mehdi21:
خوبه. فقط آیا راهی هستش که ثل دایرکت بشه api ویندوز رو دور زدش؟!
پویا منظورتو متوجه نمی شم . یه مثال بزن .
فکر کنم منظورش این باشه که به طور مستقیم با کیبورد یا موس کار کنه.پویا منظورتو متوجه نمی شم . یه مثال بزن .
سلامفکر کنم منظورش این باشه که به طور مستقیم با کیبورد یا موس کار کنه.
دقیقا همین منظور رو دارم یعنی میشه مثل دایرکت عمل کردش؟
بله همین طور که گفتید .