IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Нажатие на клавишу с задержкой
UnDead_13
сообщение 23.2.2005, 16:50
Сообщение #1


Активный участник
***

Группа: Пользователи
Сообщений: 255
Регистрация: 20.10.2004
Пользователь №: 108



Вот сделал функцию для нажатия на клавишу с задержкой
В начале кода нужно прописать:
Код
DIM pkey(300,3)

Вот сама функция:
Код
function key(n,key$,delay1,delay2)
pkey=val(key$)
if key$="right" then pkey=rightkey()
if key$="left" then pkey=leftkey()
if key$="up" then pkey=upkey()
if key$="down" then pkey=downkey()
if key$="control" then pkey=controlkey()
if key$="shift" then pkey=shiftkey()
if key$="space" then pkey=spacekey()
if key$="return" then pkey=returnkey()
if key$="escape" then pkey=escapekey()
if pkey=1
  if pkey(n,2)=0 and pkey(n,3)=0 then result=1 else result=0
  if pkey(n,1)=0 then pkey(n,2)=pkey(n,2)+1
  if pkey(n,2)=delay1 then pkey(n,2)=0:pkey(n,1)=1
  pkey(n,3)=pkey(n,3)+1
  if pkey(n,3)=delay2 then pkey(n,3)=0
else
  pkey(n,1)=0
  pkey(n,2)=0
  pkey(n,3)=0
  result=0
endif
endfunction result


n - нужно всегда ставить разное значение, иначе две функции с одинаковыми значениями не будут работать
key$ - клавиша: "right", "left", "up", "down", "control", "shift", "space", "return", "escape". Если поставить число (только в кавычках - "число"), то оно будет считаться кодом опроса клавиши.
delay1 - задержка после нажатия
delay2 - задержка при выполнении действия

Пример:
Код
if key(1,"space",16,2)=1 then print 1

Выполняется этот пример так: после нажатия на клавишу выполняется команда print, потом происходит задержка на delay1, после этого, пока нажата клавиша, print выполняется с задержкой delay2. Если delay1=0 и delay2=0, то действие будет происходить только 1 раз после нажатия на клавишу.
Эта функция может пригодиться, например, в мелких играх типа тетриса и еще в некоторых играх, где лучше сделать нажатия на клавиши не мгновенными, а с некоторой задержкой.
Перейти в начало страницы
 
+Цитировать сообщение
Aniki
сообщение 26.11.2005, 6:34
Сообщение #2


Активный участник
***

Группа: Пользователи
Сообщений: 98
Регистрация: 20.11.2005
Пользователь №: 516



А как сделать чтобы при зажатии определённой кнопки, обект наоборот ускорялся всё сильнее и сильнее, но достигнув определённой скорости больше не ускорялся. Я понимаю, что смотря на эту формулу (см.выше) можно понять как это сделать, но я непонимаю например что обозначают цифры в pkey(300,3). Также как сделать, чтобы при отпускании кнопки, обьект начал замедляться , не сразу а постепенно. Только для одной кнопки можете написать код. И непишите сам код а формулу, например: pkey(что_значит_это_число,что_значит_это_число).
Спасибо.


--------------------
С уважением,
Aniki

Сегодня всё уже не так, как вчера. Сегодня всё совсем по-другому.
Перейти в начало страницы
 
+Цитировать сообщение
Sha/|/|an
сообщение 26.11.2005, 12:34
Сообщение #3


Digital Mystery
***

Группа: Пользователи
Сообщений: 1887
Регистрация: 1.9.2004
Пользователь №: 8



Контролирование скорости объекта никак не должно зависеть от функции опроса кнопок. Всмысле, не надо пихать этот код в функцию.

Код
If кнопка_нажата
  If obj_speed# < obj_max_speed#
     obj_speed# = obj_speed# + obj_accs#
  endif
endif


кнопка_нажата - условие. Это может быть вызов функции key(..) или стандартной keystate(..). Keystate здесь более уместа, т.к. в ней нету задержек. А при управлении олни не нужны.

obj_speed# - текущая скорость объекта
obj_max_speed# - максимальная скорость (можно заменить числом или константой)
obj_accs# - ускорение за цикл


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
Kolyanoid
сообщение 26.11.2005, 15:31
Сообщение #4


. . .-= SPK Games =-. . . Модератор v3.2 alpha . . Linuxoid v0.5
***

Группа: Администраторы
Сообщений: 3521
Регистрация: 1.9.2004
Из: Москва
Пользователь №: 15



Aniki, я тебе уже говорил, что прежде чем что-то делать, разберись с массивами. То, что ты спросил - это и есть массив. Двумерный, если быть точным (также он назывется "матрицей").


--------------------
Мои координаты:
  • Jabber: kolyanoid@jabber.ru
  • Почта: kolyanoid [at] mail333.com
  • Вконтакте: id64896
«Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен». (Альберт Эйнштейн)
Перейти в начало страницы
 
+Цитировать сообщение
Grossman
сообщение 26.11.2005, 17:24
Сообщение #5


Unixoid
***

Группа: Пользователи
Сообщений: 1269
Регистрация: 9.8.2005
Пользователь №: 415



Цитата
Также как сделать, чтобы при отпускании кнопки, обьект начал замедляться , не сразу а постепенно.
Код
if <кнопка_нажата>
  ...
else
   if obj_speed# <> 0.0
      if obj_speed# > obj_acc2#
         dec obj_speed#, obj_acc2#
      else
         obj_speed# = 0.0
      endif
   endif
endif
obj_acc2# - ускорение постепенного торможения.

Добавлено:
Вот еще вариант:
Код
if <кнопка_нажата> then speed_lim# = max_speed# else speed_lim# = 0.0
speed# = curvevalue( speed_lim#, speed#, accel# )
Перейти в начало страницы
 
+Цитировать сообщение
Aniki
сообщение 27.11.2005, 16:57
Сообщение #6


Активный участник
***

Группа: Пользователи
Сообщений: 98
Регистрация: 20.11.2005
Пользователь №: 516



Благодарчик.


(По настойчивым "советам" Коляноида, редактирую а не делаю новый пост. Интересно через какое время кто-нибудь увидит, что я отредактировал? : )
Итак я конечно понял смысл всего выше сказанного, но:
вот я сделал:
Код
speed#= (я ставил 0, 1, 2, object speed)
max_speed#= 15 (допустим)
accs#= speed#*speed# (математически верно)
Далее прописываю то что вы ту сказали. Пробовал по всякому, ничего неполучается.

Ещё одна проблема. Вполне возможно, что именно из-за нее у меня ничего и не получается:
скорость, как все мы знаем равна м\с. метры это понятно, а вот что-то я неонимаю, как сделать секунды? Пробовал делать SYNC RATE nn но что-то неполучается у меня связать это "nn" со скоростью. Неужели это всё делается таймером?

Вот сам кодик:
Код
if mc1=1 and coll13<>1
  if speed#<mspeed#
  speed#=speed#+acc#
  move object 1,speed#
  endif
endif



ДОБАВЛЕНННО!:
Хех, Вас послушаешь, еще больше сам запутаешься : ) Слишком сложно вы всё обьясняете. Слишком у вас всё правельно.
У меня, как всегда всё в ажуре, и вот как я этого добился:
Код
Do

speed#=1

rem Разгон
if <нажата кнопка>
  speed#=acc1#
  move object 1,speed#
endif

rem Постепенное торможение
if <НЕнажата кнопка>
  speed#=acc2#
  move object 1,speed#
endif

rem Проверки
If speed#>25 then speed#=25
if speed#<0 then speed#=0

rem Наши переменные ускорения\торможения
acc1#=speed#+0.01
acc2#=speed#-0.01

loop


--------------------
С уважением,
Aniki

Сегодня всё уже не так, как вчера. Сегодня всё совсем по-другому.
Перейти в начало страницы
 
+Цитировать сообщение
Kolyanoid
сообщение 30.11.2005, 15:18
Сообщение #7


. . .-= SPK Games =-. . . Модератор v3.2 alpha . . Linuxoid v0.5
***

Группа: Администраторы
Сообщений: 3521
Регистрация: 1.9.2004
Из: Москва
Пользователь №: 15



up!

ЗюЫю
Цитата
(По настойчивым "советам" Коляноида, редактирую а не делаю новый пост. Интересно через какое время кто-нибудь увидит, что я отредактировал? : )

Аники, я те в личку всё написал по этому поводу wink.gif


--------------------
Мои координаты:
  • Jabber: kolyanoid@jabber.ru
  • Почта: kolyanoid [at] mail333.com
  • Вконтакте: id64896
«Есть только две бесконечные вещи: Вселенная и глупость. Хотя насчет Вселенной я не уверен». (Альберт Эйнштейн)
Перейти в начало страницы
 
+Цитировать сообщение
Grossman
сообщение 30.11.2005, 20:08
Сообщение #8


Unixoid
***

Группа: Пользователи
Сообщений: 1269
Регистрация: 9.8.2005
Пользователь №: 415



Да, Aniki, если хочешь м/с - придется использовать таймер.

Код
rem Разгон
if <нажата кнопка>
 speed#=acc1#
 move object 1,speed#
endif

rem Постепенное торможение
if <НЕнажата кнопка>
 speed#=acc2#
 move object 1,speed#
endif
Во-первых, слепи вместе оба if'а (чтоб лишнее условие не проверять), во-вторых, скорость нужно не приравнивать ускорению, а увеличивать на величину ускорения (в соответствии с выбранной единицей времени). Ты физику учил? v=v0+a*t. Например, попробуй так:
Код
`Все величины в м/с
accel_in#  = <...>
accel_out# = <...>

do
   time_delta = time_loop
   time_loop = timer()
   
   if <кнопка_нажата>
      speed#=speed#+accel_in#*time_delta/1000.0
   else
      speed#=speed#+accel_out#*time_delta/1000.0
   endif

   <...>

   time_loop = timer()-time_loop
loop
Перейти в начало страницы
 
+Цитировать сообщение
Aniki
сообщение 1.12.2005, 11:14
Сообщение #9


Активный участник
***

Группа: Пользователи
Сообщений: 98
Регистрация: 20.11.2005
Пользователь №: 516



Ага, я учил физику : ) также я учил алгебру. А вот когда я пытался смешать физику, алгебру и язык програмирования - получилась полная туфта : )
Вообщем спасиб конечно, но у меня всё работает пучком, и мне этого достаточно.


--------------------
С уважением,
Aniki

Сегодня всё уже не так, как вчера. Сегодня всё совсем по-другому.
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 21.9.2017, 22:39
 X 
Ссылки на работы форумчан:
1. Cайт по использованию 3D технологий
в образовании

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight