![]() |
|
|||||||
| RGSS-Scripts Postet hier die Scripts die ihr im Script-Editor selbst erstellt oder gefunden habt. Gefundene Scripts jedoch mit Quellenangabe posten! |
![]() |
|
|
Themen-Optionen |
16.10.2009, 05:09
|
#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). |
|
|
24.03.2010, 16:55
|
#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 |
|
|
24.03.2010, 23:59
|
#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 |
|
|
22.05.2010, 13:52
|
#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* |
|
|
22.05.2010, 15:32
|
#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 |
|
|
|
22.05.2010, 15:55
|
#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 |
|
|
22.05.2010, 17:33
|
#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 |
|
|
22.05.2010, 19:44
|
#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 |
|
|
23.05.2010, 12:30
|
#11 |
|
Neuling
![]() Registriert seit: 22.05.2010
Beiträge: 6
|
also viren hab ich nicht drauf
und wie könnte ich das beheben??? |
|
|
23.05.2010, 21:03
|
#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 | |
|
|