PDA

View Full Version : چگونه کلیدهای مکان نما را بخوانیم



هم دانشگاهی
یک شنبه 07 خرداد 1391, 11:39 صبح
سلام
من برای نوشتن بازی snake دنبال وقفه ای هستم که بافر صفحه کلید را بخواند اگر کلید های مکان نما فشرده شده بود عمل مورد نظر خودم را انجام بدم در غیر ایت صورت منتظر دریافت کلین نماند !

من خودم از سرویس 06h از وقفه 21h استفده میکنم اما نمیدونم چرا وقتی کلیدهای مکان نما را میزنم با تأخیر مار تغییر مسیر میده !

MostafaMohammadi
یک شنبه 07 خرداد 1391, 12:46 عصر
از بقیه چه انتظاری داری؟
انتظار داری در مورد کدی که تنها چیزی که در مورد اش می دونند اینه که بازی Snake است! بهت کمک کنند که چرا مار ات با تاخیر تغییر مسیر میده؟

xman_1365_x
یک شنبه 07 خرداد 1391, 13:28 عصر
سلام
من برای نوشتن بازی snake دنبال وقفه ای هستم که بافر صفحه کلید را بخواند اگر کلید های مکان نما فشرده شده بود عمل مورد نظر خودم را انجام بدم در غیر ایت صورت منتظر دریافت کلین نماند !

من خودم از سرویس 06h از وقفه 21h استفده میکنم اما نمیدونم چرا وقتی کلیدهای مکان نما را میزنم با تأخیر مار تغییر مسیر میده !

از وقفه زیر استفاده کنید ، 4 تا اسکن کد برای حالت مختلف کلید جهتدار ایجاد میکنه ، ضمنا بازی اسنیک قبلا در سایت قرار داده شده که میتونید ازش استفاده کنید
در ارتباط با اسکن کد ها هم قبلا مثال زدم ، کمی در سایت جستجو کنید

INT 16h / AH = 00h - get keystroke from keyboard (no echo).
return:
AH = BIOS scan code.
AL = ASCII character.
(if a keystroke is present, it is removed from the keyboard buffer).

موفق باشی

هم دانشگاهی
یک شنبه 07 خرداد 1391, 16:53 عصر
فک کنم این وقفه منتظر دریافت کلید از صفحه کلید میمونه !

من منتظر بمونه !!!

xman_1365_x
یک شنبه 07 خرداد 1391, 17:07 عصر
فک کنم این وقفه منتظر دریافت کلید از صفحه کلید میمونه !

من منتظر بمونه !!!
از وقفه زیر استفاده کنید

INT 16h / AH = 01h - check for keystroke in the keyboard buffer.
return:
ZF = 1 if keystroke is not available.
ZF = 0 if keystroke available.
AH = BIOS scan code.
AL = ASCII character.
(if a keystroke is present, it is not removed from the keyboard buffer).



l1:
mov ah,1
int 16h
jmp l1

شما برنامه رو به صورت یک حلقه بینهایت مینویسید اگر برد ، باخت یا کلید خاصی فشار داد از این حلقه خارج شید
موفق باشی

هم دانشگاهی
سه شنبه 09 خرداد 1391, 09:01 صبح
ممنون ! ولی این وقفه بافر رو خالی میکنه ؟
چون بدون اینکه من دکمه ای رو بزنم خودش به سمت بالا حرکت میکنه !
میشه یک ماکرو براش بنویسین ؟
ممنون

xman_1365_x
سه شنبه 09 خرداد 1391, 15:30 عصر
ولی این وقفه بافر رو خالی میکنه ؟ خیر برای خالی کردن بافر از وقفه 21 و تابع 0ch استفاده کنید

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

کد (http://barnamenevis.org/showthread.php?342054-%D9%83%D9%85%D9%83-%D8%AF%D8%B1-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A2%D8%AF%D9%85%D9%83-%D9%88-%D8%AD%D8%B1%D9%83%D8%AA-%D8%A2%D9%86-%D8%AA%D9%88%D8%B3%D8%B7-%D8%B5%D9%81%D8%AD%D9%87-%D9%83%D9%84%D9%8A%D8%AF&p=1514913&viewfull=1#post1514913)ssbostan عزیز رو تغییر کوچیکی دادم خوب نگاه کنید مشکلتون حل میشه


org 100h

mov ax, 0b800h
mov ds, ax

mov si, 0a0h

mov ds:[0a0h], '='


get_key:
mov AH,0Ch
INT 21h ;flush buffer

mov ah,01
int 16h


cmp ah, 48h
jz go_up

cmp ah, 50h
jz go_down

cmp ah, 4bh
jz go_left

cmp ah, 4dh
jz go_right


jmp get_key


go_up:
mov di, si
sub di, 0a0h
mov [di], '='
mov [si], 0
mov si, di
jmp get_key


go_down:
mov di, si
add di, 0a0h
mov [di], '='
mov [si], 0
mov si, di
jmp get_key

go_left:
mov di, si
sub di, 02h
mov [di], '='
mov [si], 0
mov si, di
jmp get_key


go_right:
mov di, si
add di, 02h
mov [di], '='
mov [si], 0
mov si, di
jmp get_key

ret

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

هم دانشگاهی
سه شنبه 09 خرداد 1391, 17:10 عصر
ضمنا به این شکل نوشتن یه مشکلی داره چون سرعت تکرار دستور بالاست اینقدر سریع بافر خالی میشه که شاید با مکث از شما ورودی بگیره
اینم نمیگم روش فکر کنیددرسته خیلی با تأخیر کلیدها رو خوند !

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

فک کنم باید وقتی کلیدی فشرده شد بافر خالی بشه تا بتونه این کار رو انجام بده !

درست گفتم ؟ اگه میشه راه حل رو بگین !

ممنون

ssbostan
سه شنبه 09 خرداد 1391, 23:24 عصر
براي چك كردن بافر بهتره به اين شكل عمل كنيد:




mov ah, 01h
int 16h
jz get_key

mov ah, 00h
int 16h



در اين صورت مشكل حركت نكردن با يك كليد حل ميشه و از طرفي ميتونيد الگوريتم ادامه حركت در صورت عدم فشردن كليد رو هم بنويسيد.

موفق باشيد.

هم دانشگاهی
چهارشنبه 10 خرداد 1391, 00:57 صبح
براي چك كردن بافر بهتره به اين شكل عمل كنيد:




mov ah, 01h
int 16h
jz get_key

mov ah, 00h
int 16h



در اين صورت مشكل حركت نكردن با يك كليد حل ميشه و از طرفي ميتونيد الگوريتم ادامه حركت در صورت عدم فشردن كليد رو هم بنويسيد.

موفق باشيد.

خیلی خیلی ممنونم !