PDA

View Full Version : نحوه گرفتن arrow key براي بازي مار !



program33r
سه شنبه 20 دی 1390, 19:28 عصر
دارم يه بازي مار مينويسم كه بايد فردا بايد تحويلش بدم

الان دقيقا مشكلم اينه كه وقتي ميخوام از تابع getch و يا هر تابع ديگه اي استفاده بكنم
تابع صبر ميكنه تا كليدي فشار داده بشه كه اينطوري فايده نداره
يه چيزي ميخوام كه موازي با برنامه كار كنه
يا يه چيزي تو مايه هاي break باشه

ممنون

shahmohammadi
سه شنبه 20 دی 1390, 20:03 عصر
سلام.
شاید با دسترسی مستقیم به حافظه بتونید بنویسید.
البته من این مورد رو نکردم ولی کارای دیگه کردم.
یعنی اون قسمت از حافظه که کد های فرستاده شده از کیبرد ذخیره می شن رو بخونید. اینطوری هر موقع بخاین می تونید این حافظه رو بخونید و منتظر فشرده شدن کلید نمی مونید.
چون دقیقا این کارو نکردم و شما هم می گید که عجله دارید اینها رو نوشتم.
می تونید آدرس های مهم رو اینجا (http://pcnews.at/pcn/0xx/05x/056/008900/MEMBIOS.htm) ببینید.
به نظرم آخریش باشه:
Keyboard

0000:0417 - 0418 Keyboard flags
0000:0419 - 0419 Alt key numeric input
0000:041A - 041B Keyboard buffer head pointer
0000:041C - 041D Keyboard buffer tail pointer
0000:041E - 043D Keyboard buffer

موفق باشید.

b.saminjad
سه شنبه 20 دی 1390, 20:04 عصر
سلام

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

program33r
سه شنبه 20 دی 1390, 20:19 عصر
shahmohammadi جان چه طوري اين حافظه رو بگيرم ؟



b.saminjad كد زير به جاي explain كدهاي مار ما قرار گرفته.حالا بايد تو اين 300mlsec هر كليدي فشار داده بشه ذخيره بشه (به صورت موازي)
اما كد زير اينطور نيست و صبر ميكنه تا كليدي فشار داده بشه .


long ch;


while(1)
{
// EXPLAIN
Sleep(300);
ch = getch();
}

shahmohammadi
سه شنبه 20 دی 1390, 20:24 عصر
هم می تونید مستقیم با اشاره گر ها این کارو انجام بدین که باید با ساختار داخلی او بافز آشتا باشید.
هم می تونید این حافظه رو با استفاده از وقفه ها بگیرید.
برای خوندن این بافر می تونید از وقفه 16h استفاده کنید.
(http://www.romanpress.com/CBOOKS/Hardware1_Sel_Keyboards.htm)
اینجا (http://www.romanpress.com/CBOOKS/Hardware1_Sel_Keyboards.htm) رو هم نگاه کنید. همه چیزو در این مورد توضیح داده.
تو قسمت Logical Operation

shahmohammadi
سه شنبه 20 دی 1390, 20:36 عصر
اصلا خوندن از حافظخ رو بی خیال (ولی می شه).
با این وقفه بنویسید: وقفه مورد نظر (http://www.ousob.com/ng/asm/ng8a9e7.php)

program33r
سه شنبه 20 دی 1390, 20:56 عصر
دوست عزيز ميشه يه مثال بزني ؟
چون من با وقفه ها تو vc2010 كلا درگيرم .
(اگه يه مثال بزني خيلي عالي ميشه)

shahmohammadi
سه شنبه 20 دی 1390, 21:38 عصر
توی تربو سی که با dos.h می شد کار کرد، من با توابع اون کتابخونه وقفه ها رو فراخوانی می کردم، و مقادیر خروجی از وقفه ها رو که توی ثباتها بودند، اونجا راحت به متغیر های سی میدادم و کار میکردم.
ولی این توابع در کامپایلر شما نیستند و باید مستقیم از دستورات اسمبلی توی سی استفاده کنید. تو این مورد من متاسفانه ارسال پارامتر ها بین اسمبلی و سی رو بلد نیستم:
asm{
mov ah,1
int 16h
...
}
بعدش مقدار ah رو که اسکن کد هست باید بررسی کنید.
متاسفاه ار این به بعدش رو من بلد نیستم و باید بقیه دوستان بگن یا خودتون پیدا کنید.