forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   работа с клавиатурой. однократное нажатие клавиши (http://forum.boolean.name/showthread.php?t=3196)

aureli0 21.04.2007 00:20

столкнулся с такой проблемой при работе в МР с библиотекой game от Pilgrim'а. Клавиатура считывается непрерывно. Тоесть например при управлении спрайта - спрайт движется без рывков после первого нажатия и удержания клавиши направления. Вопрос как зделать однократное нажатие?

если будут предложения пользоватся стандартными функциями- вместе с библиотекой чето не получается.

Piligrim 21.04.2007 12:12

Re: работа с клавиатурой. однократное нажатие клавиши
 
Можно сделать, что и стандартные пойдут. И вообще надо будет либу обновить

aureli0 21.04.2007 23:29

Re: работа с клавиатурой. однократное нажатие клавиши
 
а как зделать ? я псматрел впринципе можно и стандартными обойтись - клавиши работают на непрерывное нажатие. А вот однократное как зделать то? Мож быть надо таймер какойнить ввести на нажатие но только получится что для каждой кнопки наверно надо будет делать свой таймер. или просто создать массив таймеров, где индекс массива обозначал к какой кнопке он соответствует. Но имхо бред все это. Должно это как то все проще реализовыватся.. Подскажите пожалуста что делать?
ЗЫ: А обновления либы буду ждать с нетерпением)))

ViNT 22.04.2007 00:10

Re: работа с клавиатурой. однократное нажатие клавиши
 
Я не уверен, но можно попробовать примерно так:

const
num_keys=10;//кол-во клавиш
LEFT_PRESSED = 4;//код клавиши Left из примера

var
keys:array[1..num_keys]of boolean;//массив состояний клавиш
//true-нажата,false-отпущена
key:integer;
index:integer;//номер в массиве последней нажатой клавиши


begin
....
//гдето в цикле обработки клавы...
key:=getkeyclicked;
if game.get_bit(key, LEFT_PRESSED)<>0 then
begin
if not keys[1] then делаем что надо//если клавиша не нажата то делаем ///что надо
keys[1]:=true;
index:=1;
end;

***//аналогично остальные клавиши

while not
(game.get_bit(key, LEFT_PRESSED)=0)and(
game.get_bit(key, RIGHT_PRESSED)=0)and(Другие клавиши) do delay(100);
//пока кнопку не отпустят, крутимся на месте
keys[index]:=false;
//далее по циклу

ЗЫ.чем не устраивает совместное использование
стд и библиотечных функций как в кпимере?

aRix 22.04.2007 15:38

Re: работа с клавиатурой. однократное нажатие клавиши
 
Че-то у меня не запахало :(

aureli0 23.04.2007 00:15

Re: работа с клавиатурой. однократное нажатие клавиши
 
аГА!! у меня получилось!!
Vint спсибо те за идею!!! Расцеловал бы;) вот кароче така я фигня:
работает на одно нажатие тока кнопка 2 (вверх)
остальные срабатывают на непрерывное нажатие, но заменить их эт как делать нечего))


var
key:integer;
ScreenHeight,ScreenWidth:integer;
x,y,a4:integer;
keys:array[1..10]of boolean;//массив состояний клавиш
index:integer;//номер в массиве последней нажатой клавиши
begin
ScreenHeight := GetHeight;
ScreenWidth := GetWidth;
a4:=getImageHeight (loadImage('/man.png'));
repeat
key := getKeyPressed;
if (keys[2]=false) and (key =KE_KEY2) then
begin
y:=y-1;
keys[2]:=true;
end;
if key=ke_none then keys[2]:=false;
if key =KE_KEY4 then x:=x-1;
if key =KE_KEY6 then x:=x+1;

if key =KE_KEY8 then y:=y+1;
setcolor(255,255,255);
FillRect(0, 0, GetWidth, GetHeight);
drawImage(loadImage('/man.png'), x, y);
repaint;
delay(40);
until key = KE_KEY0 ;
end.
я думаю и с либовскими функциями будет работать, хотя чесн остаточно и стандартных, единственно что кнопки надо будет прописывать както под другому в отличие от цифер

aureli0 23.04.2007 01:04

Re: работа с клавиатурой. однократное нажатие клавиши
 
блин, чето я перемудрил все намного проще)) есть такая функция getKeyclicked; и все больше ниче кроме нее и ненужно)

aureli0 23.04.2007 01:49

Re: работа с клавиатурой. однократное нажатие клавиши
 
черт, при работе с либой стандартные функции отслеживания клавиатуры не работают вапще((( а если делать с либой чтото похожа на то что было в предпредыдущем посте - то там нету константы на KE_NONE.. выручайте!

aureli0 23.04.2007 23:20

Re: работа с клавиатурой. однократное нажатие клавиши
 
вот получилось зделать при использовании либы однократное нажатие
каму нада - катайте:)

const
UP_PRESSED = 2;
DOWN_PRESSED = 64;
LEFT_PRESSED = 4;
RIGHT_PRESSED = 32;
FIRE_PRESSED = 256;
GAME_A_PRESSED = 512;
GAME_B_PRESSED = 1024;
GAME_C_PRESSED = 2048;
GAME_D_PRESSED = 4096;

var
key: integer;
num:integer;// положение игрока
keys:array [0..10] of boolean;
iii:integer;
begin
game.init;
game.set_clip(0,0,128,128);
game.show;
repeat
key := game.get_key_states;//опрос клавиш для управления движением спрайта

if (game.get_bit(key, LEFT_PRESSED)<>0) and (keys[4]=false) then
begin
num:=num+1;

end;

if (game.get_bit(key, RIGHT_PRESSED)<>0) and (keys[6]=false) then
begin
num:=num-1;

end;

for iii:=0 to 10 do
begin
if key<>0 then keys[iii]:=true;
if key=0 then keys[iii]:=false;
end;
setColor(255,255,255); // очистка экрана
fillRect(0,0,getWidth, getHeight);
setColor(255,0,255);
drawText('player:'+integerToString(num), 10, 1);
game.refresh; // отображение всег
delay(30); // если хочешь чтобы по медленее махол крыльями то увеличивай

until false;
end.

ЗЫ: Спасибо Винту за идею!
ЗЫЗЫ: ждемс допатченую либу))).


Часовой пояс GMT +4, время: 05:42.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot