PDA

View Full Version : پیشنهاد برای حل این مشکل در کامپایلر قدیمی



one hacker alone
جمعه 05 خرداد 1391, 21:42 عصر
سلام مجدد
من یه بازی ساده راکت و توپ رو دارم مینویسم توی محیط tc
کد زیر رو در نظر بگیرید




while(1)
{
ball();
key();
}


خوب من نتونستم از چند نخی توی این محیط استفاده کنم چون نداره اما اومدم کل برنامه رو توی while گذاشتم
حالا حلقه کار میکنه و هر سری هم تابع ball رو اجرا میکنه که این تابع کارش اینه که توپ رو توی صفحه بچرخونه هم اینکه تابع key اجرا میشه که این تابع هنوز ننوشتم اما کارش اینه که باید چک کنه ببینه کلید های چپ و راست فشرده شدن یا نه که اگه شده باشن راکت هم تکون بخوره

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



الان من برای تشخصی کلید های چپ و راست چکار کنم؟

ASGGSA
شنبه 06 خرداد 1391, 16:11 عصر
سلام.
در ابتدای صحبت هام تشکر کنم از شما بخاطر سایت هایی که معرفی کردید برای رایت CD اما من هنوز از این کدها جواب نگرفته ام.
حالا بحث اصلی : شما می دانید که راههای زیادی برای ارتباط با صفحه کلید وجود دارد. یکی از این راهها استفاده از تابع bioskey(1) است. وقتی ورودی این تابع را مقدار 1 قرار می دهیم این تابع منتظر نمی ماند تا کلیدی زده بشود بلکه کاراکتری که در بافر صفحه کلید وجود دارد را برمی گرداند. من از انواع وقفه ها نیز استفاده کردم اما مشکل اینجاست که این توابع را وقتی در while(1) قرار می دهیم کارایی خود را از دست می دهد و دیگر کاراکتر جدیدی برنمی گرداند. معمولاً برای بازی ها باید از یک تایمر استفاده کرد چون دستور while سرعت خیلی بالایی دارد. حالا باید یه راه حل پیدا کنید.

shahmohammadi
شنبه 06 خرداد 1391, 21:51 عصر
سلام دوباره.
ببينيد اين كد به دردتون مي خوره.
http://letusprogramming.in/snk.cpp
توي محيطي كه گفتيد برنامه رو نوشته، يه مار هست كه در حال حركته و وقتي كه ما يكي از جهت‌ها رو فشار بديم به اون جهت تغيير مسير مي‌ده.
بررسيش نكردم ولي گفتم شايد يه چيزايي ازش بدونيد.

shahmohammadi
شنبه 06 خرداد 1391, 22:50 عصر
راستي، ASGGSA (http://barnamenevis.org/member.php?239157-ASGGSA) جان، الان كه بررسيش كردم از روشي كه شما گفتيد يعني bioskey(1)داخل يك while(1) استفاده كرده. اما منظورتون از اينكه "مقدار جديد برنمي‌گردونه" چي بود؟ توي اين برنامه كه مشكلي نداشت.

void game()
{
init();
loadmaze();
sleep(2);
while(1)
{
if(bioskey(1))
{
key=bioskey(0);
int s=key>>8;
if(s==1)
exit();
else
if(s==72) //If UP arrow key is pressed
{
if(DIRECTION==4 || DIRECTION==2)
{
Pre_Dir=DIRECTION;
DIRECTION=UP;
}
}
else if(s==80) //If DOWN arrow key is pressed
{
if(DIRECTION==4 || DIRECTION==2)
{
Pre_Dir=DIRECTION;
DIRECTION=DOWN;
}
}
else if(s==77) ////If RIGHT arrow key is pressed
{
if(DIRECTION==1 || DIRECTION==3)
{
Pre_Dir=DIRECTION;
DIRECTION=RIGHT;
}
}
else if(s==75) ////If LEFT arrow key is pressed
{
if(DIRECTION==1 || DIRECTION==3)
{
Pre_Dir=DIRECTION;
DIRECTION=LEFT;
}
}
}

if(DIRECTION==2) //Right Key
head.x++;
else if(DIRECTION==1) //Up Key
head.y--;
else if(DIRECTION==4) //Left Key
head.x--;
else if(DIRECTION==3) //Down Key
head.y++;
//...وغيره

ASGGSA
شنبه 06 خرداد 1391, 23:56 عصر
سلام.
نمی دونم دیروز که تو TC امتحانش کردم با while(1) تابع bioskey بعد از اولین مقداری که برمیگرداند دوباره همون عدد پشت سرهم چاپ می شد.

فهمیدم bioskey را در یک if بررسی کرده اگر کلیدی زده شده باشد در نتیجه از bioskey(0) برای گرفتن کلید زده شده یا فشار داده شده استفاده کرده و چون مقدار ورودی این تابع 0 است منتظر فشار دادن کلید می ماند. برای همین مشکلی پیش نیامده.

shahmohammadi
یک شنبه 07 خرداد 1391, 01:09 صبح
نمي‌دونم دوستمون one hacker alone (http://barnamenevis.org/member.php?33297-one-hacker-alone) در مورد bioskey مي‌دونند يانه. اينه كه يه توضيح مختصري مي دم.
اين تابع بر اساس ورودي اي كه مي گيره عمل خاصي انجام ميده. در اينجا ما به دو ورودي اون يعني 0 و 1 نياز داريم.
وقتي بهش 0 ميديم، كد اسكي يا اسكن كليدي رو كه فشار دادند يا همون keystrock به عنوان خروجي بر مي‌گردونه.
وقتي بهش 1 مي دهيم، كارش اين مي‌شه كه مشخص كنه آيا به تازگي كليدي فشار داده شده يا نه. اگه فشار داده نشده، 0 رو بر مي‌گردونه. اگه ctrlBrk رو زدن -1 رو بر مي‌گردونه.در غير اين‌صورت مقدار كليد بعدي رو بر مي‌گردونه. keystrock رو براي اينكه بدونيم بايد اين تابع رو با 0 صدا بزنيم تا مقدارشو بدونيم.
توي برنامه‌تون مي‌تونيد مثل مثال بالا از روش while(1) استفاده كنيد تابرنامه‌تون درست شه.
اگه باز مشكلي بود در خدمتيم.

one hacker alone
یک شنبه 07 خرداد 1391, 15:20 عصر
ممنون از شما دوستان عزیز
به ناچار محیط پر از محدودیت TC رو رها و برای تکمیل پروژه اون رو به VS2008 بردم و اونجا با یه کتابخانه آماده تونستم فایل ghraphics.h رو بکارگیری کنم و کارم راه افتاد البته تابعی که شما معرفی کردین هم باعث حل مشکل من تو TC میشه هرچند تست نکردم اما عملکردش اینجور نشون میده
در کل ممنون از راهنماییتون