![]() |
|
RGSS-Scripts Postet hier die Scripts die ihr im Script-Editor selbst erstellt oder gefunden habt. Gefundene Scripts jedoch mit Quellenangabe posten! |
![]() |
|
Themen-Optionen |
![]() |
#1 |
23
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Dies ist das "Keyboardscript" oder wie man das auch nennen will, das in Genocide zum Einatz kommt. Es bietet mit einem einfachen Edit abschaltbare (theoretische) Mausunterstützung, die allerdings noch selber integriert werden muss dass es funktioniert. Ich habe versucht, die für alle Window_Selectable's funktionierend zu machen, allerdings musste ich feststellen, dass da einfach zu viel fehlt. In Genocide wird größtenteils eine eigene GUI verwendet, deshalb konnte ich den Code nicht einfach so übernehmen.
Aber hier die Erklärung. Unterstützt werden alle Tasten von hier, mit denselben Konstantennamen. Ansonsten funktioniert es genauso wie das Input-Modul aus dem RGSS. Um z.B. die linke Windows-Taste abzufragen, kann Input.trigger?(Input::VK_LWIN) oder eben press? oder repeat? verwendet werden. Ändert man die Controls (mittels Rechtsklick auf Titelleiste und Optionen), so werden diese Einstellungen respektiert (es sei denn man setzt CUSTOM_CONTROLS auf false; in dem Fall gelten nur die Standardeinstellungen). Zum Thema Maus: Wenn Maussteuerung eingeschaltet ist, dann ist Input::MOUSE_SPRITE das Sprite des Mauszeigers. Folgende Eigenschaften / Funktionen stehen dann zur Verfügung: Input.mouse_pos Gibt die aktuelle Position der Maus im Fenster zurück (als Rect). Kann auch außerhalb des Fensters liegen. Input.mouse_moved? Gibt zurück, ob die Maus in diesem Frame bewegt wurde. Input.mouse_pos_relative(x, y) Input.mouse_pos_relative(rect) Gibt die Mausposition relativ zu der Position x, y bzw. zur linken oberen Ecke von rect zurück. Rect kann dabei ein beliebiges Objekt mit x- und y-Werten sein, z.B. Rect, Window, Sprite... Input.mouse_in_rect?(x, y, w, h) Input.mouse_in_rect?(rect) Überprüft, ob sich die Maus in dem angegebenen Rechteck befindet. Rect kann wieder ein beliebiges Objekt mit Eigenschaften x, y, width und height sein, zum Beispiel Rect oder Window. Input.show_mouse(val = true) Zeigt oder versteckt den System-Mauszeiger. Sooo ich hoffe jemand kann damit was anfangen. Code:
# Genocide_Input 1.0 - Input extension with mouse support # # Author: derula # # This script is taken from the German RPGXP project "Genocide" and adjusted # for standalone usage. Permission is granted by the author to freely use and # edit it as long as the game "Genocide" and the code's original author remain # credited in the code. Other means of crediting are voluntary, but appreciated. module Genocide_Input # Settings section # Change this to false if you don't want to use mouse input MOUSE_ENABLED = true # Change this to set the mouse graphic. Must be a valid file in Graphics/Icons MOUSE_ICON = "mouse" # Change this to false if you don't want the user to be able to customize controls CUSTOM_CONTROLS = true # Ersetzt das Input-Modul; ermöglicht es, mittels # Win32API alle Tasten abzufragen. Alle Methoden werden ersetzt. module ::Input # List generated from http://msdn.microsoft.com/en-us/library/ms927178.aspx VK_LBUTTON = "\001" # Left mouse button VK_RBUTTON = "\002" # Right mouse button VK_CANCEL = "\003" # Control-break processing VK_MBUTTON = "\004" # Middle mouse button on a three-button mouse VK_BACK = "\010" # BACKSPACE key VK_TAB = "\011" # TAB key VK_CLEAR = "\014" # CLEAR key VK_RETURN = "\015" # ENTER key VK_SHIFT = "\020" # SHIFT key VK_CONTROL = "\021" # CTRL key VK_MENU = "\022" # ALT key VK_PAUSE = "\023" # PAUSE key VK_CAPITAL = "\024" # CAPS LOCK key VK_ESCAPE = "\033" # ESC key VK_SPACE = "\040" # SPACEBAR VK_PRIOR = "\041" # PAGE UP key VK_NEXT = "\042" # PAGE DOWN key VK_END = "\043" # END key VK_HOME = "\044" # HOME key VK_LEFT = "\045" # LEFT ARROW key VK_UP = "\046" # UP ARROW key VK_RIGHT = "\047" # RIGHT ARROW key VK_DOWN = "\050" # DOWN ARROW key VK_SELECT = "\051" # SELECT key VK_EXECUTE = "\053" # EXECUTE key VK_SNAPSHOT = "\054" # PRINT SCREEN key VK_INSERT = "\055" # INS key VK_DELETE = "\056" # DEL key VK_HELP = "\057" # HELP key VK_LWIN = "\133" # Left Windows key on a Microsoft Natural Keyboard VK_RWIN = "\134" # Right Windows key on a Microsoft Natural Keyboard VK_APPS = "\135" # Applications key on a Microsoft Natural Keyboard VK_NUMPAD0 = "\140" # Numeric keypad 0 key VK_NUMPAD1 = "\141" # Numeric keypad 1 key VK_NUMPAD2 = "\142" # Numeric keypad 2 key VK_NUMPAD3 = "\143" # Numeric keypad 3 key VK_NUMPAD4 = "\144" # Numeric keypad 4 key VK_NUMPAD5 = "\145" # Numeric keypad 5 key VK_NUMPAD6 = "\146" # Numeric keypad 6 key VK_NUMPAD7 = "\147" # Numeric keypad 7 key VK_NUMPAD8 = "\150" # Numeric keypad 8 key VK_NUMPAD9 = "\151" # Numeric keypad 9 key VK_MULTIPLY = "\152" # Multiply key VK_ADD = "\153" # Add key VK_SEPARATOR = "\154" # Separator key VK_SUBTRACT = "\155" # Subtract key VK_DECIMAL = "\156" # Decimal key VK_DIVIDE = "\157" # Divide key VK_F1 = "\160" # F1 key VK_F2 = "\161" # F2 key VK_F3 = "\162" # F3 key VK_F4 = "\163" # F4 key VK_F5 = "\164" # F5 key VK_F6 = "\165" # F6 key VK_F7 = "\166" # F7 key VK_F8 = "\167" # F8 key VK_F9 = "\170" # F9 key VK_F10 = "\171" # F10 key VK_F11 = "\172" # F11 key VK_F12 = "\173" # F12 key VK_F13 = "\174" # F13 key VK_F14 = "\175" # F14 key VK_F15 = "\176" # F15 key VK_F16 = "\177" # F16 key VK_F17 = "\200" # F17 key VK_F18 = "\201" # F18 key VK_F19 = "\202" # F19 key VK_F20 = "\203" # F20 key VK_F21 = "\204" # F21 key VK_F22 = "\205" # F22 key VK_F23 = "\206" # F23 key VK_F24 = "\207" # F24 key VK_NUMLOCK = "\220" # NUM LOCK key VK_SCROLL = "\221" # SCROLL LOCK key VK_LSHIFT = "\240" # Left SHIFT VK_RSHIFT = "\241" # Right SHIFT VK_LCONTROL = "\242" # Left CTRL VK_RCONTROL = "\243" # Right CTRL VK_LMENU = "\244" # Left ALT VK_RMENU = "\245" # Right ALT VK_ATTN = "\366" # ATTN key VK_CRSEL = "\367" # CRSEL key VK_EXSEL = "\370" # EXSEL key VK_EREOF = "\371" # Erase EOF key VK_PLAY = "\372" # PLAY key VK_ZOOM = "\373" # ZOOM key VK_PA1 = "\375" # PA1 key VK_OEM_1 = "\272" # ";:" for US VK_OEM_PLUS = "\273" # "+" any country/region VK_OEM_COMMA = "\274" # "," any country/region VK_OEM_MINUS = "\275" # "-" any country/region VK_OEM_PERIOD = "\276" # "." any country/region VK_OEM_2 = "\277" # "/?" for US VK_OEM_3 = "\300" # "`~" for US VK_OEM_4 = "\333" # "[{" for US VK_OEM_5 = "\334" # "|" for US VK_OEM_6 = "\335" # "]}" for US VK_OEM_7 = "\336" # "'"" for US VK_OEM_AX = "\341" # AX key on Japanese AX keyboard VK_OEM_102 = "\342" # "<>" or "|" on RT 102-key keyboard VK_DBE_ALPHANUMERIC = "\360" # Changes the mode to alphanumeric. VK_DBE_KATAKANA = "\361" # Changes the mode to Katakana. VK_DBE_HIRAGANA = "\362" # Changes the mode to Hiragana. VK_DBE_SBCSCHAR = "\363" # Changes the mode to single-byte characters. VK_DBE_DBCSCHAR = "\364" # Changes the mode to double-byte characters. VK_DBE_ROMAN = "\365" # Changes the mode to Roman characters. VK_DBE_NOROMAN = "\366" # Changes the mode to non-Roman characters. VK_DBE_ENTERWORDREGISTERMODE = "\367" # Activates the word registration dialog box. VK_DBE_ENTERIMECONFIGMODE = "\370" # Activates a dialog box for setting up an IME environment. VK_DBE_FLUSHSTRING = "\371" # Deletes the undetermined string without determining it. VK_DBE_CODEINPUT = "\372" # Changes the mode to code input. VK_DBE_NOCODEINPUT = "\373" # Changes the mode to no-code input. # Alte Standard-Input-Tasten in Hash speichern KEYS = { # DOWN LEFT RIGHT UP Input::DOWN => VK_DOWN, Input::LEFT => VK_LEFT, Input::RIGHT => VK_RIGHT, Input::UP => VK_UP, # A B C X Y Z L R Input::A => [], Input::B => [], Input::C => [], Input::X => [], Input::Y => [], Input::Z => [], Input::L => [VK_PRIOR], Input::R => [VK_NEXT], # SHIFT CTRL ALT Input::SHIFT => VK_SHIFT, Input::CTRL => VK_CONTROL, Input::ALT => VK_MENU, # F5 F6 F7 F8 F9 Input::F5 => VK_F5, Input::F6 => VK_F6, Input::F7 => VK_F7, Input::F8 => VK_F8, Input::F9 => VK_F9 } module WinApi # Win32API-Funktion "GetKeyState" zum Abfragen der Tasten GET_KEY_STATE = Win32API.new("user32", "GetKeyState", ["i"], "i") if MOUSE_ENABLED # Win32API-Funktion "GetCursorPos" zum Abfragen der Mauszeigerposition GET_CURSOR_POS = Win32API.new("user32", "GetCursorPos", ["P"], "V") # Win32API-Funktion "ScreenToClient" zum Umwandeln der Koordinaten in Client-Koordinaten SCREEN_TO_CLIENT = Win32API.new("user32", "ScreenToClient", ["i", "P"], "V") # Mauszeiger anzeigen / verstecken SHOW_CURSOR = Win32API.new("user32", "ShowCursor", ["i"], "i") # Eintrag einer Inidatei lesen read = Win32API.new("kernel32", "GetPrivateProfileString", ["P", "P", "P", "P", "i", "P"], "i").call( "Game", "Title", "", title = " " * 100, 100, "./Game.ini" ) # Handle auf das Gamefenster holen HANDLE = Win32API.new("user32", "FindWindow", ["p", "p"], "i").call( "RGSS Player", title[0, read] ) end # Bit für "Taste gedrückt" KEY_STATE_DOWN = -(1 << 15) # Tastaturkonfiguration auslesen if CUSTOM_CONTROLS ok = (Win32API.new("advapi32", "RegGetValue", ["L", "P", "P", "L", "P", "P", "P"], "l").call( 1 - (1 << 31), "Software\\Enterbrain\\RGSS", "ButtonAssign", 8, " " * 4, data = " " * 25, [25].pack("L") ) == 0) end if CUSTOM_CONTROLS and ok data = data.unpack("C" * 25)[10..-1] else # Standardwerte falls aus Registry nicht geladen werden konnte data = [13, 13, 12, 12, 11, 11, 12, 13, 0, 0, 14, 15, 16, 17, 18] end codes = [VK_SPACE, VK_RETURN, VK_ESCAPE, VK_NUMPAD0, VK_SHIFT, "Z", "X", "C", "V", "B", "A", "S", "D", "Q", "W" ] (0..14).each do |i| KEYS[data[i]] << codes[i] if KEYS[data[i]].is_a? Array end # Überprüft, ob die angegebene Taste gedrückt ist def self.key_down?(key) if key.is_a? Integer if KEYS[key].is_a? Array KEYS[key].each { |k| return true if key_down?(k) } return false else key = KEYS[key] end end (GET_KEY_STATE.call(key[0]) & KEY_STATE_DOWN) != 0 end if MOUSE_ENABLED # Gibt die aktuelle Mausposition im Fenster zurück def self.cursor_pos point = " " * 8 # store two LONGs GET_CURSOR_POS.call(point) SCREEN_TO_CLIENT.call(HANDLE, point) point.unpack("ll") # get the actual values end # Externen Mauszeiger anzeigen / verstecken def self.show_cursor(val) SHOW_CURSOR.call(val ? 1 : 0) end end end @@pressed_keys = {} # Prüft, ob die Taste genau in diesem Frame heruntergedrückt wurde def self.trigger?(key) # Wenn Zahl übergeben wird, alle Tasten abfragen, die für diesen Code # festgelegt worden sind # Prüfen ob Taste gedrückt, und im vorigen Frame noch nicht gedrückt war result = (WinApi.key_down?(key) and (not @@pressed_keys.include?(key) or @@pressed_keys[key] == 1)) # Merken, ob Taste jetzt gedrückt oder nicht @@pressed_keys[key] = 1 if result # Ergebnis zurückgeben return result end # Tastendruckwiederholung (ist true, wenn trigger? true ist oder # die Taste seit mindestens 15 Frames gedrückt ist und die Anzahl # der Frames, die die Taste gedrückt ist, durch 3 teilbar ist def self.repeat?(key) # Taste noch nicht vorhanden unless @@pressed_keys.include?(key) # Taste hinzufügen (wenn gedrückt) trigger?(key) else # Taste wird seit diesem Frame gedrückt, oder: # Taste wird seit mindestens 15 Frames gedrückt und Anzahl der Frames, # die die Taste schon gedrückt ist, ist durch 3 teilbar. @@pressed_keys[key] == 1 or (@@pressed_keys[key] >= 15 and @@pressed_keys[key] % 3 == 0) end end # Prüft, ob die Taste gedrückt ist def self.press?(key) # Ist Taste gedrückt? @@pressed_keys.include?(key) or trigger?(key) end # Gedrückte Hauptrichtung def self.dir4 # Komische Richtungsangaben press?(DOWN)?2:(press?(LEFT)?4:(press?(RIGHT)?6:(press?(UP)?8:0))) end # Gedrückte Richtung inklusive schräger Richtungen def self.dir8 # SEHR komische Richtungsangaben case self.dir4 when 2 press?(LEFT)?1:(press?(RIGHT)?3:2) when 4 press?(UP)?7:(press?(DOWN)?1:4) when 6 press?(UP)?9:(press?(UP)?3:6) when 8 press?(LEFT)?7:(press?(RIGHT)?9:8) else 0 end end if MOUSE_ENABLED # Speichert die Maus-Sprite MOUSE_SPRITE = Sprite.new MOUSE_SPRITE.bitmap = RPG::Cache.icon(MOUSE_ICON) MOUSE_SPRITE.x = 640 MOUSE_SPRITE.y = 480 MOUSE_SPRITE.z = 9999 @@mouse_pos = Rect.new(640, 480, 0, 0) # Gibt die Position der Maus im inneren des Fensters zurück def self.mouse_pos() @@mouse_pos.dup; end @@mouse_moved = false # Gibt zurück ob Maus seit letztem Update bewegt wurde def self.mouse_moved?() @@mouse_moved; end # Gibt die Position der Maus relativ zu Rect x bzw. Punkt (x, y) zurück def self.mouse_pos_relative(x, y = nil) # Startposition aus Rect laden falls kein y angegeben if y == nil mouse_pos_relative(x.x, x.y) else pos = mouse_pos pos.x -= x; pos.y -= y pos end end # Stellt fest, ob sich die Maus innerhalb von Rect x bzw. Rect(x, y, w, h) aufhält def self.mouse_in_rect?(x, y = nil, w = nil, h = nil) if y == nil and w == nil and h == nil mouse_in_rect?(x.x, x.y, x.width, x.height) else (x <= @@mouse_pos.x and @@mouse_pos.x <= x + w and y <= @@mouse_pos.y and @@mouse_pos.y <= y + h) end end def self.show_mouse(val = true) if @@mouse_visible != val @@mouse_visible = val WinApi.show_cursor(val) end end @@mouse_visible = true show_mouse(false) end # Aktualisiert Mausposition / Frameanzahl bzw. löscht Tasten def self.update if MOUSE_ENABLED x, y = WinApi.cursor_pos if @@mouse_pos.x != x or @@mouse_pos.y != y @@mouse_pos.x, @@mouse_pos.y = x, y MOUSE_SPRITE.x, MOUSE_SPRITE.y = x, y show_mouse(y < 0) @@mouse_moved = true else @@mouse_moved = false end end @@pressed_keys.each_key do |key| if not WinApi.key_down?(key) @@pressed_keys.delete(key) else @@pressed_keys[key] += 1 end end end end # Cursor zeigen, wenn Message angezeigt wird module ::Kernel alias :old_print :print def print(*args) Input.show_mouse old_print(*args) Input.show_mouse(false) end alias :old_p :p def p(*args) Input.show_mouse old_p(*args) Input.show_mouse(false) end end end
__________________
"So, und jetzt Schluss mit dem Lamentieren - lasst uns etwas Kunst machen!!!" - GS_Raphael Geändert von derula (25.03.2010 um 00:00 Uhr). |
![]() |
![]() |
![]() |
#2 |
Neuling
![]() Registriert seit: 01.10.2009
Beiträge: 41
|
![]() In dem Script ist ein Fehler bei der repeat-Funktion.
Die Zeile: unless @@pressed_keys.include?(key[0]) muss lauten: unless @@pressed_keys.include?(key) mfg _Matrix |
![]() |
![]() |
![]() |
#3 |
23
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Tatsache! Das stammt noch aus einer älteren Version, als Input noch nicht komplett ersetzt worden war - Standard-Tasten wurden damals noch mit dem Standard-Input abgefragt. Danke!
__________________
"So, und jetzt Schluss mit dem Lamentieren - lasst uns etwas Kunst machen!!!" - GS_Raphael |
![]() |
![]() |
![]() |
#4 |
Neuling
![]() Registriert seit: 22.05.2010
Beiträge: 6
|
![]() hallo
ich hab da mal ne frage immer wenn ich den script in den RMXP reinhaue kommt eine fehlermeldung nämlich diese Script 'Genocide_Input' line 189: RuntimeError occurred. GetProcAdress: RegGetVolue or RegGetVolueA und ich habe es schon mit RegGetVolueA versucht aber das klappt auch nicht ich bitte um Hilfe Crveno Ps: Ich benutze ein StarterKit von poccil *Klick* |
![]() |
![]() |
![]() |
#5 | |
23
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Zitat:
Wenn das immer noch nicht geht: Welche Windows-Version?
__________________
"So, und jetzt Schluss mit dem Lamentieren - lasst uns etwas Kunst machen!!!" - GS_Raphael |
|
![]() |
![]() |
![]() |
#6 |
Neuling
![]() Registriert seit: 22.05.2010
Beiträge: 6
|
![]() sorry hatte mich verschrieben
in der Fehlermeldung steht Value (sch**ß rechtschreibung xDD) Windows XP Crveno |
![]() |
![]() |
![]() |
#8 |
Neuling
![]() Registriert seit: 22.05.2010
Beiträge: 6
|
![]() hab ich schon
hab ich auch geschrieben denn wenn ich es in RegGetValueA ändere kommt diese Fehlermeldung Script 'Genocide_Input' line 189: RuntimeError occurred. GetProcAdress: RegGetValueA or RegGetValueAA Crveno |
![]() |
![]() |
![]() |
#10 |
23
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Dito. Es klingt irgendwie als ob die DLL fehlerhaft ist (Virus?), aber dann würde keine Anwendung den Einsprungpunkt finden, und nichts könnte auf die Registry zugreifen (zumindest mit dieser Funktion)... das wäre unfortunat.
__________________
"So, und jetzt Schluss mit dem Lamentieren - lasst uns etwas Kunst machen!!!" - GS_Raphael |
![]() |
![]() |
![]() |
#11 |
Neuling
![]() Registriert seit: 22.05.2010
Beiträge: 6
|
![]() also viren hab ich nicht drauf
und wie könnte ich das beheben??? |
![]() |
![]() |
![]() |
#12 |
23
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Sorry, ich habe wirklich keine Ahnung. Evtl. könnte Cherry das für dich näher untersuchen, wenn er Lust/Zeit hat, aber ich weiß echt keine bessere Erklärung als meine letzte. "Windows neu installieren" wäre der einzige Rat den ich hätte (okay, ich würde es noch etwas anders machen und die DLL manuell von der Windows-CD neu runterziehen, aber das ist für Nicht-Pros etwas schwierig zu tun), aber das ist mit Kanonen auf Spatzen geschossen und garantiert noch nicht mal ob es was bringt. Tut mir leid!
__________________
"So, und jetzt Schluss mit dem Lamentieren - lasst uns etwas Kunst machen!!!" - GS_Raphael |
![]() |
![]() |
![]() |
Lesezeichen |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
|
|