UltimaForum

Skrypty [VX] - Dodatkowe przyciski na klawiaturze

Ayene - Nie 21 Lut, 2010 16:42
Temat postu: Dodatkowe przyciski na klawiaturze
~ Dodatkowe przyciski na klawiaturze [VX] ~

Krótki opis
Skrypt umożliwia wykorzystanie innych przycisków na klawiaturze niż domyślne. Można przykładowo wykorzystać literkę 'L', która normalnie, nie odpowiada za nic. Skrypt jest jedynie dodatkiem, ale dzięki niemu można wspomniane literki wykorzystać z innych skryptach.

Autor skryptu do XP
Vlad

Kompatybilność
XP i VX

Skrypt
Spoiler:

Kod:
# ------------------------------------------------------------------------
# Input skrypt by Vlad
# ------------------------------------------------------------------------
module Input
  @keys = []
  @pressed = []
  Mouse_Left = 1
  Mouse_Right = 2
  Mouse_Middle = 4
  Back = 8
  Tab = 9
  Enter = 13
  Shift = 16
  Ctrl = 17
  Alt = 18
  Esc = 0x1B
  LT = 0x25
  UPs = 0x26
  RT = 0x27
  DN = 0x28
  Space = 32
  Numberkeys = {}
  Numberkeys[0] = 48
  Numberkeys[1] = 49
  Numberkeys[2] = 50
  Numberkeys[3] = 51
  Numberkeys[4] = 52
  Numberkeys[5] = 53
  Numberkeys[6] = 54
  Numberkeys[7] = 55
  Numberkeys[8] = 56
  Numberkeys[9] = 57
  Numberpad = {}
  Numberpad[0] = 45
  Numberpad[1] = 35
  Numberpad[2] = 40
  Numberpad[3] = 34
  Numberpad[4] = 37
  Numberpad[5] = 12
  Numberpad[6] = 39
  Numberpad[7] = 36
  Numberpad[8] = 38
  Numberpad[9] = 33
  Letters = {}
  Letters["A"] = 65
  Letters["B"] = 66
  Letters["C"] = 67
  Letters["D"] = 68
  Letters["E"] = 69
  Letters["F"] = 70
  Letters["G"] = 71
  Letters["H"] = 72
  Letters["I"] = 73
  Letters["J"] = 74
  Letters["K"] = 75
  Letters["L"] = 76
  Letters["M"] = 77
  Letters["N"] = 78
  Letters["O"] = 79
  Letters["P"] = 80
  Letters["Q"] = 81
  Letters["R"] = 82
  Letters["S"] = 83
  Letters["T"] = 84
  Letters["U"] = 85
  Letters["V"] = 86
  Letters["W"] = 87
  Letters["X"] = 88
  Letters["Y"] = 89
  Letters["Z"] = 90
  Fkeys = {}
  Fkeys[1] = 112
  Fkeys[2] = 113
  Fkeys[3] = 114
  Fkeys[4] = 115
  Fkeys[5] = 116
  Fkeys[6] = 117
  Fkeys[7] = 118
  Fkeys[8] = 119
  Fkeys[9] = 120
  Fkeys[10] = 121
  Fkeys[11] = 122
  Fkeys[12] = 123
  Collon = 186
  Equal = 187
  Comma = 188
  Underscore = 189
  Dot = 190
  Backslash = 191
  Lb = 219
  Rb = 221
  Quote = 222
 
  State = Win32API.new('user32','GetKeyState',['i'],'i')
  Key = Win32API.new('user32','GetAsyncKeyState',['i'],'i')
 
  USED_KEYS = [Mouse_Left, Mouse_Right]
 
  module_function
 
  def self.getstate(key)
    return true unless State.call(key).between?(0, 1)
    return false
  end
 
  def self.testkey(key)
    Key.call(key) & 0x01 == 1
  end
 
  def self.update
    @keys = []
    @keys.push(Input::Mouse_Left) if self.testkey(Input::Mouse_Left)
    @keys.push(Input::Mouse_Right) if self.testkey(Input::Mouse_Right)
    @keys.push(Input::Back) if self.testkey(Input::Back)
    @keys.push(Input::Tab) if self.testkey(Input::Tab)
    @keys.push(Input::Enter) if self.testkey(Input::Enter)
    @keys.push(Input::Shift) if self.testkey(Input::Shift)
    @keys.push(Input::Ctrl) if self.testkey(Input::Ctrl)
    @keys.push(Input::Alt) if self.testkey(Input::Alt)
    @keys.push(Input::Esc) if self.testkey(Input::Esc)
    for key in Input::Letters.values
      @keys.push(key) if self.testkey(key)
    end
    for key in Input::Numberkeys.values
      @keys.push(key) if self.testkey(key)
    end
    for key in Input::Numberpad.values
      @keys.push(key) if self.testkey(key)
    end
    for key in Input::Fkeys.values
      @keys.push(key) if self.testkey(key)
    end
    @keys.push(Input::Collon) if self.testkey(Input::Collon)
    @keys.push(Input::Equal) if self.testkey(Input::Equal)
    @keys.push(Input::Comma) if self.testkey(Input::Comma)
    @keys.push(Input::Underscore) if self.testkey(Input::Underscore)
    @keys.push(Input::Dot) if self.testkey(Input::Dot)
    @keys.push(Input::Backslash) if self.testkey(Input::Backslash)
    @keys.push(Input::Lb) if self.testkey(Input::Lb)
    @keys.push(Input::Rb) if self.testkey(Input::Rb)
    @keys.push(Input::Quote) if self.testkey(Input::Quote)
    @keys.push(Input::Space) if self.testkey(Input::Space)
    @keys.push(Input::LT) if self.testkey(Input::LT)
    @keys.push(Input::UPs) if self.testkey(Input::UPs)
    @keys.push(Input::RT) if self.testkey(Input::RT)
    @keys.push(Input::DN) if self.testkey(Input::DN)
    @pressed = []
    @pressed.push(Input::Space) if self.getstate(Input::Space)
    @pressed.push(Input::Mouse_Left) if self.getstate(Input::Mouse_Left)
    @pressed.push(Input::Mouse_Right) if self.getstate(Input::Mouse_Right)
    @pressed.push(Input::Back) if self.getstate(Input::Back)
    @pressed.push(Input::Tab) if self.getstate(Input::Tab)
    @pressed.push(Input::Enter) if self.getstate(Input::Enter)
    @pressed.push(Input::Shift) if self.getstate(Input::Shift)
    @pressed.push(Input::Ctrl) if self.getstate(Input::Ctrl)
    @pressed.push(Input::Alt) if self.getstate(Input::Alt)
    @pressed.push(Input::Esc) if self.getstate(Input::Esc)
    @pressed.push(Input::LT) if self.getstate(Input::LT)
    @pressed.push(Input::UPs) if self.getstate(Input::UPs)
    @pressed.push(Input::RT) if self.getstate(Input::RT)
    @pressed.push(Input::DN) if self.getstate(Input::DN)
    for key in Input::Numberkeys.values
      @pressed.push(key) if self.getstate(key)
    end
    for key in Input::Numberpad.values
      @pressed.push(key) if self.getstate(key)
    end
    for key in Input::Letters.values
      @pressed.push(key) if self.getstate(key)
    end
    for key in Input::Fkeys.values
      @pressed.push(key) if self.getstate(key)
    end
    @pressed.push(Input::Collon) if self.getstate(Input::Collon)
    @pressed.push(Input::Equal) if self.getstate(Input::Equal)
    @pressed.push(Input::Comma) if self.getstate(Input::Comma)
    @pressed.push(Input::Underscore) if self.getstate(Input::Underscore)
    @pressed.push(Input::Dot) if self.getstate(Input::Dot)
    @pressed.push(Input::Backslash) if self.getstate(Input::Backslash)
    @pressed.push(Input::Lb) if self.getstate(Input::Lb)
    @pressed.push(Input::Rb) if self.getstate(Input::Rb)
    @pressed.push(Input::Quote) if self.getstate(Input::Quote)
  end
 
  def self.triggerd?(key)   
    return true if @keys.include?(key)
    return false
  end
 
  def self.pressed?(key)
    return true if @pressed.include?(key)
    return false
  end
 
  def self.dir4
    return 2 if self.pressed?(Input::DN)
    return 4 if self.pressed?(Input::LT)
    return 6 if self.pressed?(Input::RT)
    return 8 if self.pressed?(Input::UPs)
    return 0
  end
 
  def trigger?(key)
    Inputed?(key,"trigger")
  end
 
  def repeat?(key)
    Inputed?(key,"repeat")
  end
 
  def press?(key)
    Inputed?(key,"press")
  end
 
  def Inputed?(key,type)
    keys = []
    case key
    when Input::DOWN
      keys.push(Input::DN)
    when Input::UP
      keys.push(Input::UPs)
    when Input::LEFT
      keys.push(Input::LT)
    when Input::RIGHT
      keys.push(Input::RT)
    when Input::A
      keys.push(Input::Shift)
    when Input::B
      keys.push(Input::Esc, Input::Numberpad[0], Input::Letters["X"])
    when Input::C
      keys.push(Input::Space, Input::Enter)
    when Input::L
      keys.push(Input::Letters["Q"])
    when Input::R
      keys.push(Input::Letters["W"])
    when Input::X
      keys.push(Input::Letters["A"])
    when Input::Y
      keys.push(Input::Letters["S"])
    when Input::Z
      keys.push(Input::Letters["D"])
    when Input::F5
      keys.push(Input::Fkeys[5])
    when Input::F6
      keys.push(Input::Fkeys[6])
    when Input::F7
      keys.push(Input::Fkeys[7])
    when Input::F8
      keys.push(Input::Fkeys[8])
    when Input::F9
      keys.push(Input::Fkeys[9])
    when Input::CTRL
      keys.push(Input::Ctrl)
    when Input::ALT
      keys.push(Input::Alt)
    else
      keys.push(key)
    end
    case type
    when "trigger"
      for k in keys
        if Input.triggerd?(k)
          return true
        end
      end
    when "repeat"
      for k in keys
        if Input.triggerd?(k)
          return true
        end
      end
    when "press"
      for k in keys
        if self.pressed?(k)       
          return true
        end
      end
    end
   return false
 end
 
 def check(key)
   Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(key) & 0x01 == 1
 end
 
 def mouse_update
   @used_i = []
   for i in USED_KEYS
     x = check(i)
     if x == true
       @used_i.push(i)
     end
   end
 end
 
 def self.name?(num)
   return "MOUSE LEFT" if num==1
   return "MOUSE RIGHT" if num==2
   return "MOUSE MIDDLE" if num==4
   return "MOUSE 4TH" if num==5
   return "MOUSE 5TH" if num==6
   return "BACKSPACE" if num==8
   return "TAB" if num==9
   return "RETURN" if num==13
   return "SHIFT" if num==16
   return "CTLR" if num==17
   return "ALT" if num==18
   return "CAPS LOCK" if num==20
   return "ESCAPE" if num==27
   return "SPACE" if num==32
   return "PGUP" if num==33
   return "PGDN" if num==34
   return "END" if num==35
   return "HOME" if num==36
   return "LEFT" if num==37
   return "UP" if num==38
   return "RIGHT" if num==39
   return "DOWN" if num==40
   return "SNAPSHOT" if num==44
   return "INSERT" if num==45
   return "DELETE" if num==46
   return "0" if num==48
   return "1" if num==49
   return "2" if num==50
   return "3" if num==51
   return "4" if num==52
   return "5" if num==53
   return "6" if num==54
   return "7" if num==55
   return "8" if num==56
   return "9" if num==57
   return "A" if num==65
   return "B" if num==66
   return "C" if num==67
   return "D" if num==68
   return "E" if num==69
   return "F" if num==70
   return "G" if num==71
   return "H" if num==72
   return "I" if num==73
   return "J" if num==74
   return "K" if num==75
   return "L" if num==76
   return "M" if num==77
   return "N" if num==78
   return "O" if num==79
   return "P" if num==80
   return "Q" if num==81
   return "R" if num==82
   return "S" if num==83
   return "T" if num==84
   return "U" if num==85
   return "V" if num==86
   return "W" if num==87
   return "X" if num==88
   return "Y" if num==89
   return "Z" if num==90
   return "LWIN" if num==91
   return "RWIN" if num==92
   return "APPS" if num==93
   return "0" if num==96
   return "1" if num==97
   return "2" if num==98
   return "3" if num==99
   return "4" if num==100
   return "5" if num==101
   return "6" if num==102
   return "7" if num==103
   return "8" if num==104
   return "9" if num==105
   return "*" if num==106
   return "+" if num==107
   return "-" if num==109
   return "." if num==110
   return "/" if num==111
   return "F1" if num==112
   return "F2" if num==113
   return "F3" if num==114
   return "F4" if num==115
   return "F5" if num==116
   return "F6" if num==117
   return "F7" if num==118
   return "F8" if num==119
   return "F9" if num==120
   return "F10" if num==121
   return "F11" if num==122
   return "F12" if num==123
   return "NUM LOCK" if num==144
   return "SCROLL LOCK" if num==145
   return "LEFT SHIFT" if num==160
   return "RIGHT SHIFT" if num==161
   return "LEFT CTRL" if num==162
   return "RIGHT CTRL" if num==163
   return "LEFT ALT" if num==164
   return "RIGHT ALT" if num==165
   return ";" if num==186
   return "=" if num==187
   return "," if num==188
   return "_" if num==189
   return "." if num==190
   return "/" if num==191
   return "`" if num==192
   return "[" if num==219
   return " \\ " if num==220
   return "]" if num==221
   return "'" if num==222
   return "??? - " + "#{num}"
 end
end


Instrukcja
1. Wklej skrypt nad "Main" w Edytorze Skryptu.

Piszcie w razie problemów.

bionicl - Nie 21 Lut, 2010 21:20

to co zrobić aby było L ? po prostu wpisać l?
Ayene - Nie 21 Lut, 2010 21:27

Aby przyporządkować, np literkę 'L' w kodzie skryptu tam, gdzie jest np:
Kod:
if Input.trigger?(Input::R)

Zamiast Input::R należy wpisać:
Kod:
Input::Letters["L"]

Czyli po zmianach taka linijka wyglądałaby następująco:
Kod:
if Input.trigger?(Input::Letters["L"])

bionicl - Nie 21 Lut, 2010 21:46

Aaaa... dzięki.
PS. czy dzięki temu skryptowi da się jakoś ruszać myszką?...

Ayene - Pon 22 Lut, 2010 08:36

Do tego można wykorzystać Input::Mouse_Left lub Input::Mouse_Right. Wówczas coś się wyświetli po wciśnięciu lewego lub prawego przycisku myszy :->
pw115 - Pon 22 Lut, 2010 14:25

Świetny skrypt Ayene napewno go użyję w swoim vx'owym projekcie

Gz ;-)

dominikos - Sob 06 Mar, 2010 19:33

Przydało by się coś takiego do xp.
Ayene - Nie 07 Mar, 2010 11:07

dominikos, skrypt powinien też działać pod XP. Sprawdź ;-)
Asantos - Pon 05 Kwi, 2010 18:59

A jak można tego użyć w warunku? Warunek: Skrypt: Input::Numberkeys["1"] nie działa, trzeba to jakoś inaczej zdeklarować?

Dobra działa :)

Dla całej reszty: trzeba napisać input.trigger?(input::/cośtam/) - jeśli źle proszę poprawić :)

Sabikku - Pon 05 Kwi, 2010 19:10

Po pierwsze, do hasha Numberkeys wpisujesz zwykłe liczby (1), nie stringi ("1"). Po drugie, całość obejmij 'Input.trigger?(...)', które sprawdza, czy przycisk jest wciśnięty.
Twój warunek w edytorze zdarzeń będzie wyglądał tak:
Kod:
Input.trigger?(Input::Numberkeys[1])

@edit: wyprzedziłeś mnie...! :)

Sprawdziłem pod xp, działa. Fajny skrypt, krótszy i wygodniejszy niż keyboard input module cybersama, którego używałem do tej pory.

Draph - Wto 01 Cze, 2010 12:59

Zrobiłem wszystko według instrukcji, jednak przy próbie uruchomienia projektu wyskakuje mi błąd:
"Wystąpił problem z aplikacją Game.exe(...)" itd. Czy ktoś wie czym to może być spowodowane?

CreeperCrisis - Wto 01 Cze, 2010 13:15

Dragrot, zrób screen błedu.
Ayene, co mam zrobić, żeby jak kliknę lewy przycisk myszy uruchamiało mi się typowe zdarzenie?

Draph - Wto 01 Cze, 2010 13:21

Proszę: http://img34.imageshack.us/img34/6035/bladj.png
Z tego błędy chyba nic nie wywnioskujesz :/
Zaznaczę że błąd pojawia się około sekundy po włączeniu projektu.

CreeperCrisis - Wto 01 Cze, 2010 13:26

Czy to się dzieje po wstawieniu skryptu. Spróbuj na pustym lub prześlę demo
Draph - Wto 01 Cze, 2010 13:32

Usunąłem skrypt i wszystko zaczęło działać, gdy wstawiłem go ponownie błąd znowu się pojawił. Więc jest to wina skryptu o dziwo :/ Czy to może mieć coś wspólnego z tym że posiadam makera xp tsukuru? Może mam starego rgssa w windowsie?
Ayene - Wto 01 Cze, 2010 16:31

Dragrot, skrypt działa na XP, ale sprawdzany był tylko po kątem kompatybilności z wersją angielską programu. To kolejny dowód na to, że wersja polska jest do niczego.
Pozdrawiam.

sebek_minko, możesz zastosować poniższy krótki skrót:
Spoiler:

Kod:
module Ayene
  ID_TYPOWEGO_ZDARZENIA = 1  # ID typowego zdarzeniam
end

class Scene_Map < Scene_Base
  alias ayene_callcomevent_scmap_update update
  def update
    ayene_callcomevent_scmap_update
    if Input.trigger?(Input::Mouse_Left) && $data_common_events[Ayene::ID_TYPOWEGO_ZDARZENIA] != nil
      $game_temp.common_event_id = Ayene::ID_TYPOWEGO_ZDARZENIA
      $scene = Scene_Map.new           
    end     
  end   
end


Draph - Wto 01 Cze, 2010 20:54

A czy szanowna pani administratorka wie gdzie można zdobyć darmową angielską wersję makera xp? Czy jedyną darmową wersją xp jest tsukuru pl.
PaKiTos - Czw 09 Wrz, 2010 14:55

dodaj do folderu z grą bibliotekę 100J i zadziała na polskiej!
Matiwrubli - Czw 13 Sty, 2011 14:24

znajdziesz program na www.rpgmaker.pl :mrgreen:
jp145 - Pon 06 Cze, 2011 21:24

A co zrobić by gdy przycisne na klawiaturze [M] przełącznik '0001' zmienił się no on a po ponownym wcisnięcu na off itd. :?:
Angius - Wto 07 Cze, 2011 19:47

Ustawić odpowiedni warunek.
Cytat:
Jeśli przełącznik 0001 jest on
Jeśli wciśnięty przycisk M
Przełącznik 0001 na off
Jeśli nie
brak akcji
Jeśli nie
Jeśli wciśnięty przycisk M
Przełącznik 0001 na on
Jeśli nie
Brak akcji

Mogło mi się coś pomieszać przez te tagi z kolorkami :->

jp145 - Wto 07 Cze, 2011 21:45

Hmm...
Niestety jeśli chodzi o skrypty to jestem zielony ;-( .
A nie mógł by ktos by gotowego skrypyu wrzucić??
Bardzo prosze i z góry dzięki.

Angius - Wto 07 Cze, 2011 21:47

Err... To JEST gotowy skrypt, który trzeba wrzucić...
A to, co ja napisałem, to typowe zdarzenie, jakie powinienieś ustawić, by działało włączanie i wyłączanie tym samym przyciskiem.

jp145 - Wto 07 Cze, 2011 22:10

dobra nieważne..
Michu_1999 - Nie 13 Lis, 2011 14:08

Nie kumam o co chodzi z tym skryptem. Bawie się i bawię, a dalej nie wiem.
tracersgta - Nie 13 Lis, 2011 14:15

Znowu kilkumiesieczny odkop... Dodaje on do gry więcej przycisków... Bez tego skryptu, nie mogłeś nacisnąć F4, i coś by się stało... A z nim możesz...
Michu_1999 - Nie 13 Lis, 2011 15:15

@tracersgta wiem o co w nim chodzi tylko nie wiem jak się nim posługiwać
Ayene - Nie 13 Lis, 2011 16:15

Michu_1999, wysil się trochę proszę i przeczytaj kilka postów pod pierwszym, a będziesz wiedział :!:
tracersgta - Nie 13 Lis, 2011 16:34

Aby przyporządkować, np literkę 'L' w kodzie skryptu tam, gdzie jest np:
Kod:
if Input.trigger?(Input::R)

Zamiast Input::R należy wpisać:
Kod:
Input::Letters["L"]

Czyli po zmianach taka linijka wyglądałaby następująco:
Kod:
if Input.trigger?(Input::Letters["L"])

EzioMasterPl - Sob 18 Lut, 2012 20:23

Ayene , a jak mam zrobic tak , żeby po naciśnięciu "L" wyskakiwał mi dziennik misji?
Chodzi mi co mam zrobic w skrypcie z dziennikiem i tym , aby działało.
Bo nie da się wyświetlic na raz statusu i misji bez kasowania zapisu , to pomyślałem że tak wyświetlę okno misji. Z góry dzięki za pomoc

rafal3386 - Czw 05 Kwi, 2012 10:08

Mógłby ktoś dodać demo? Bo jak wpisuje w typowym zdarzeniu na warunku:
Input.trigger?(Input::Numberkeys[1])
W równoległym zdarzeniu to po naciśnięciu 1 nic sie niedzieje.

Ayene - Czw 05 Kwi, 2012 19:44

W takim razie, jakim sposobem mi działa?



Powered by phpBB modified by Przemo © 2003 phpBB Group