forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   Меняем управление (http://forum.boolean.name/showthread.php?t=172)

pax 06.10.2005 23:50

Во многих играх есть нужда в подстройке управления под игрока. Когда в моей Bombers3d возникла такая нужда, то я написал следующую функцию для того чтобы поймать сканкод какой-либо клавиши:
Код:

Function PressedKey%()
        FlushKeys
        WaitKey()
        Repeat
 *For I%=1 To 255
 *        If KeyDown(I) Then
 * *FlushKeys
 * *Return I
 *        EndIf
 *Next
        Forever
End Function

А потом понадобилось выводить имена назначеных клавиш и я создал массив с их именами индексом которого является сканкод:
Код:

Dim BattonNames$(255)
For BN=0 To 255
        BattonNames$(BN)=""
Next
BattonNames$(1)="ESCAPE"
BattonNames$(2)="1"
BattonNames$(3)="2"
BattonNames$(4)="3"
BattonNames$(5)="4"
BattonNames$(6)="5"
BattonNames$(7)="6"
BattonNames$(8)="7"
BattonNames$(9)="8"
BattonNames$(10)="9"
BattonNames$(11)="0"
BattonNames$(12)="-"
BattonNames$(13)="="
BattonNames$(14)="Backspace"
BattonNames$(15)="Tab"
BattonNames$(16)="Q"
BattonNames$(17)="W"
BattonNames$(18)="E"
BattonNames$(19)="R"
BattonNames$(20)="T"
BattonNames$(21)="Y"
BattonNames$(22)="U"
BattonNames$(23)="I"
BattonNames$(24)="O"
BattonNames$(25)="P"
BattonNames$(26)="["
BattonNames$(27)="]"
BattonNames$(28)="Return/Enter"
BattonNames$(29)="Left Control"
BattonNames$(30)="A"
BattonNames$(31)="S"
BattonNames$(32)="D"
BattonNames$(33)="F"
BattonNames$(34)="G"
BattonNames$(35)="H"
BattonNames$(36)="J"
BattonNames$(37)="K"
BattonNames$(38)="L"
BattonNames$(39)=";"
BattonNames$(40)="'"
BattonNames$(41)="Grave #"
BattonNames$(42)="Left Shift"
BattonNames$(43)="\"
BattonNames$(44)="Z"
BattonNames$(45)="X"
BattonNames$(46)="C"
BattonNames$(47)="V"
BattonNames$(48)="B"
BattonNames$(49)="N"
BattonNames$(50)="M"
BattonNames$(51)=","
BattonNames$(52)="."
BattonNames$(53)="/"
BattonNames$(54)="Right Shift"
BattonNames$(55)="NumPad *"
BattonNames$(56)="Left Alt"
BattonNames$(57)="Space"
BattonNames$(58)="Capital"
BattonNames$(59)="F1"
BattonNames$(60)="F2"
BattonNames$(61)="F3"
BattonNames$(62)="F4"
BattonNames$(63)="F5"
BattonNames$(64)="F6"
BattonNames$(65)="F7"
BattonNames$(66)="F8"
BattonNames$(67)="F9"
BattonNames$(68)="F10"
BattonNames$(69)="NumLock"
BattonNames$(70)="Scroll Lock"
BattonNames$(71)="NumPad 7"
BattonNames$(72)="NumPad 8"
BattonNames$(73)="NumPad 9"
BattonNames$(74)="NumPad -"
BattonNames$(75)="NumPad 4"
BattonNames$(76)="NumPad 5"
BattonNames$(77)="NumPad 6"
BattonNames$(78)="NumPad +"
BattonNames$(79)="NumPad 1"
BattonNames$(80)="NumPad 2"
BattonNames$(81)="NumPad 3"
BattonNames$(82)="NumPad 0"
BattonNames$(83)="NumPad ."
BattonNames$(86)="OEM_102"
BattonNames$(87)="F11"
BattonNames$(88)="F12"
BattonNames$(100)="F13"
BattonNames$(101)="F14"
BattonNames$(102)="F15"
BattonNames$(112)="Kana"
BattonNames$(115)="ABNT_C1"
BattonNames$(121)="Convert"
BattonNames$(123)="NoConvert"
BattonNames$(125)="Yen"
BattonNames$(126)="ABNT_C2"
BattonNames$(141)="Numpad Equals"
BattonNames$(144)="PrevTrack"
BattonNames$(145)="AT"
BattonNames$(146)=":"
BattonNames$(147)="Underline"
BattonNames$(148)="Kanji"
BattonNames$(149)="Stop"
BattonNames$(150)="AX"
BattonNames$(151)="Unlabeled"
BattonNames$(153)="Next Track"
BattonNames$(156)="Numpad Enter"
BattonNames$(157)="Right Control"
BattonNames$(160)="Mute"
BattonNames$(161)="Calculator"
BattonNames$(162)="Play/Pause"
BattonNames$(164)="Media Stop"
BattonNames$(174)="Volume Down"
BattonNames$(176)="Volume Up"
BattonNames$(178)="Web Home"
BattonNames$(179)="NumPod ,"
BattonNames$(181)="NumPod /"
BattonNames$(183)="SysReq"
BattonNames$(184)="Right Alt"
BattonNames$(197)="Pause"
BattonNames$(199)="Home"
BattonNames$(200)="Up"
BattonNames$(201)="Page Up"
BattonNames$(203)="Left"
BattonNames$(205)="Right"
BattonNames$(207)="End"
BattonNames$(208)="Down"
BattonNames$(209)="Next"
BattonNames$(210)="Insert"
BattonNames$(211)="Delete"
BattonNames$(219)="Left Windows"
BattonNames$(220)="Right Windows"
BattonNames$(221)="Apps"
BattonNames$(222)="Power"
BattonNames$(223)="Sleep"
BattonNames$(227)="Wake"
BattonNames$(229)="Web Search"
BattonNames$(230)="Web Favorites"
BattonNames$(231)="Web Refresh"
BattonNames$(232)="Web Stop"
BattonNames$(233)="Web Forward"
BattonNames$(234)="Web Back"
BattonNames$(235)="My Computer"
BattonNames$(236)="Mail"
BattonNames$(237)="Media Select"

Это пока все что я хотел сказать :)

SubZer0 07.10.2005 00:16

только нужно еще учесть, что кнопки NumLock и Pause/Break в стандартном хелпе перепутаны... или может быть у нас русские клавы хз.. во всяком случае это надо иметь ввиду.. :)

pax 07.10.2005 00:23

Кстати эти кнопки не ловятся вообще, даже незнаю почему :dontknow:

Diplomat 07.10.2005 00:24

Вложений: 2
Цитата:

Во многих играх есть нужда в подстройке управления под игрока.
...

Хм, тут есть повеселее методы. Ну вот, к примеру.
С именами просто. Чтоб не набивать код программы не нужной пургой, создаем .CFG файл со сканкодами клавиш. А в конце- имена кнопок мыша(!). См.аттач.

Загружаем всю эту радость в массив и выводим потом по мере необходимости в меню.
Код:

Dim KeyName$(255)
LoadKeyName=ReadFile("Scancodes.cfg")
While Not Eof(LoadKeyName)
 KeyName$(q)=ReadLine(LoadKeyName)
Wend
...

А так проверяем в настройках ввод пользователя и присваиваем комманде с номером "Option" соответствующий сканкод:
Код:

Repeat
;Проверка нажатия клавиши
 *For NCode=1 To 237
 * If KeyHit(NCode) Then
 * *KeyCommand(Option)=nCode
  Goto PrCheckKey
 * EndIf
 *Next
;Проверка нажатия кнопки мыша
 *For MBtn=1 To 3
 * If MouseHit(MBtn) Then
 * *KeyCommand(Option)=MBtn+237
  Goto PrCheckKey
 * EndIf
 *Next
Forever
.PrCheckKey

А потом в игре просто проверяем:
Код:

...
;комманда №6: действие
If (KeyHit(KeyCommand(6))=True Or MouseHit(KeyCommand(6)-237)) Then Action(Player)
;комманда №7: прыжок.
If (KeyHit(KeyCommand(7))=True Or MouseHit(KeyCommand(7)-237)) Then Jump(Player)
...

Универсально, коротко и держит мышь. ;)

P.S. Очепятка была. Поправил. :)

pax 07.10.2005 00:38

Цитата:

Чтоб не набивать код программы не нужной пургой, создаем .CFG файл

Массив в программе я создал для того чтобы никто не мог его изменить. :)
И поместил я его в отдельный *.BB файл чтобы не мешался.

Когда начну делать обработку мыши учту твой совет. Спасибо. Хотя имена кнопкам мыши я давать наверное небуду. Просто сделаю так:

Код:

MBName$="Mouse Button " + WaitMouse()

Matt Merkulov 30.10.2005 01:26

Можно через DATA/READ, чтобы все было в одном файле. А еще есть программа, которая вообще любое изменение контроллера фиксирует:
http://blitzetc.boolean.name/code/Userinputsystem.bb


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

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