![]() |
столкнулся с такой проблемой при работе в МР с библиотекой game от Pilgrim'а. Клавиатура считывается непрерывно. Тоесть например при управлении спрайта - спрайт движется без рывков после первого нажатия и удержания клавиши направления. Вопрос как зделать однократное нажатие?
если будут предложения пользоватся стандартными функциями- вместе с библиотекой чето не получается. |
Re: работа с клавиатурой. однократное нажатие клавиши
Можно сделать, что и стандартные пойдут. И вообще надо будет либу обновить
|
Re: работа с клавиатурой. однократное нажатие клавиши
а как зделать ? я псматрел впринципе можно и стандартными обойтись - клавиши работают на непрерывное нажатие. А вот однократное как зделать то? Мож быть надо таймер какойнить ввести на нажатие но только получится что для каждой кнопки наверно надо будет делать свой таймер. или просто создать массив таймеров, где индекс массива обозначал к какой кнопке он соответствует. Но имхо бред все это. Должно это как то все проще реализовыватся.. Подскажите пожалуста что делать?
ЗЫ: А обновления либы буду ждать с нетерпением))) |
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; //далее по циклу ЗЫ.чем не устраивает совместное использование стд и библиотечных функций как в кпимере? |
Re: работа с клавиатурой. однократное нажатие клавиши
Че-то у меня не запахало :(
|
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. я думаю и с либовскими функциями будет работать, хотя чесн остаточно и стандартных, единственно что кнопки надо будет прописывать както под другому в отличие от цифер |
Re: работа с клавиатурой. однократное нажатие клавиши
блин, чето я перемудрил все намного проще)) есть такая функция getKeyclicked; и все больше ниче кроме нее и ненужно)
|
Re: работа с клавиатурой. однократное нажатие клавиши
черт, при работе с либой стандартные функции отслеживания клавиатуры не работают вапще((( а если делать с либой чтото похожа на то что было в предпредыдущем посте - то там нету константы на KE_NONE.. выручайте!
|
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