PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WASD-Steuerung + klassenfremde Methoden nutzen + Transfer Hero per Ruby



shimassy
01.02.2010, 16:41
Hallo!

1.)
Ich habe vor kurzem versucht, eine Steuerung per WASD (zusätzlich zu den Pfeiltasten) in mein Projekt einzubauen.
Momentan habe ich aber auf die äußerst unelegante und teilweise nicht recht funktionieren wollende Methode zurückgegriffen, mit diesem

#===================================
# Keyboard
#---------------------------------------------------------------
# Created by Corbaque and TLN - 09/07/07
#---------------------------------------------------------------
# English conversion by Corbaque
#---------------------------------------------------------------
# Methods :
# - press
# - trigger
# - dbtrigger
# - repeat => press 1 of 3
# - hold => bloc note press
# - release
# - active => like caps lock
# - getpress
#---------------------------------------------------------------
# Update :
# - Key.update
#=> Classical
# - Key.update("enter", "esc")
#=> Only enter and escap
# - Key.update(*$arraykeys)
#=> Only the keys included on $arraykeys
#===> Think to define it before using :P
#---------------------------------------------------------------
# QWERTY version
#===================================
# Win32API constant
Key = Win32API.new("user32","GetAsyncKeyState",['i'],'i')
State = Win32API.new("user32","GetKeyState",['i'],'i')
GetPress = Win32API.new('user32', 'keybd_event', ['i', 'i', 'i'], ' ')
#---------------------------------------------------------------
# Pressed ?
#---------------------------------------------------------------
def press(n)
R[n][0]
end
#---------------------------------------------------------------
# Clicked ?
#---------------------------------------------------------------
def trigger(n)
R[n][1] >= 1
end
#---------------------------------------------------------------
# Double Clicked ?
#---------------------------------------------------------------
def dbtrigger(n)
R[n][1] == 2
end
#---------------------------------------------------------------
# Pressed ?, false, false, false, Pressed ?...
#---------------------------------------------------------------
def repeat(n)
R[n][2] %= 4; R[n][2].zero? and R[n][0]
end
#---------------------------------------------------------------
# Like when you write anything with pressing
#---------------------------------------------------------------
def hold(n)
(R[n][2] % 20).zero? and R[n][0]
end
#---------------------------------------------------------------
# Released ?
#---------------------------------------------------------------
def release(n)
R[n][1] == -1
end
#---------------------------------------------------------------
# Actived ? (Like caps lock)
#---------------------------------------------------------------
def active(n)
State.call(TAB_KEY[n]) & 1 == 1
end
#---------------------------------------------------------------
# Get pressing
#---------------------------------------------------------------
def getpress(*a)
a.each do |n|
GetPress.call(TAB_KEY[n], 0, 0)
end
a.each do |n|
GetPress.call(TAB_KEY[n], 0, 2)
end
end
#---------------------------------------------------------------
# Update keys state
#---------------------------------------------------------------
class Keys
def Keys.update(*tab)
if tab != []
tab.each do |n|
m = R[n][0]
pr = Key.call(TAB_KEY[n]) != 0
tr = m == pr ? 0 : (pr ? (R[n][2].between?(1, 9) ? 2 : 1) : -1)
count = tr > 0 ? 0 : [R[n][2]+1, 20].min
R[n] = [pr, tr, count]
end
else
TAB_KEY.keys.each do |n|
m = R[n][0]
pr = Key.call(TAB_KEY[n]) != 0
tr = m == pr ? 0 : (pr ? (R[n][2].between?(1, 9) ? 2 : 1) : -1)
count = tr > 0 ? 0 : [R[n][2]+1, 20].min
R[n] = [pr, tr, count]
end
end
end
end
# All Keys
TAB_KEY = {
"click gauche" => 1,
"sg" => 1,
"click droit" => 2,
"sd" => 2,
"click milieu" => 4,
"sm" => 4,
"del" => 8,
"tab" => 9,
"enter" => 13,
"shift" => 16,
"ctrl" => 17,
"alt" => 18,
"pause" => 19,
"caps lock" => 20,
"esc" => 27,
"space" => 32,
"pg up" => 33,
"pg down" => 34,
"end" => 35,
"home" => 36,
"left" => 37,
"up" => 38,
"right" => 39,
"down" => 40,
"impr" => 44,
"insert" => 45,
"suppr" => 46,
"0" => 48,
"1" => 49,
"2" => 50,
"3" => 51,
"4" => 52,
"5" => 53,
"6" => 54,
"7" => 55,
"8" => 56,
"9" => 57,
"a" => 65,
"b" => 66,
"c" => 67,
"d" => 68,
"e" => 69,
"f" => 70,
"g" => 71,
"h" => 72,
"i" => 73,
"j" => 74,
"k" => 75,
"l" => 76,
"m" => 77,
"n" => 78,
"o" => 79,
"p" => 80,
"q" => 81,
"r" => 82,
"s" => 83,
"t" => 84,
"u" => 85,
"v" => 86,
"w" => 87,
"x" => 88,
"y" => 89,
"z" => 90,
"lwin" => 91,
"rwin" => 92,
"apps" => 93,
"n0" => 96,
"n1" => 97,
"n2" => 98,
"n3" => 99,
"n4" => 100,
"n5" => 101,
"n6" => 102,
"n7" => 103,
"n8" => 104,
"n9" => 105,
"n*" => 106,
"+" => 107,
"num" => 108,
"n-" => 109,
"n." => 110,
"n/" => 111,
"F1" => 112,
"F2" => 113,
"F3" => 114,
"F4" => 115,
"F5" => 116,
"F6" => 117,
"F7" => 118,
"F8" => 119,
"F9" => 120,
"F10" => 121,
"F11" => 122,
"F12" => 123,
"vernum" => 144,
"verdefil" => 145,
"lmaj" => 160,
"rmaj" => 161,
"lctrl" => 162,
"rctrl" => 163,
"lalt" => 164,
"ralt" => 165,
"]" => 186,
"=" => 187,
";" => 188,
"," => 190,
"." => 191,
"'" => 192,
"-" => 219,
'\\' => 220,
"[" => 221,
"`" => 222,
"/" => 223,
"|" => 226
}
R = TAB_KEY.clone
R.keys.each { |k| R[k] = [false, false, 10]}
und 2 kleinen Codeschnipseln in Game_Player und Window_Selectable so eine Steuerung einzubauen, allerdings funktioniert das teilweise nicht (z.B. im KS, wo 2 Commandwindows gleichzeitig angezeigt werden, aber immer nur eines aktiv ist, funktioniert die WASD-Steuerung nur bei einem der beiden)
Deshalb wollte ich fragen, ob es eine einfachere Möglichkeit gibt, so eine Steuerung zu implementieren.

2.)
Kann man in Ruby irgendwie aus einer fremden Klasse auf Methoden einer anderen Klasse zugreifen?


3.)
Wie kann ich den Helden per Ruby auf eine andere Map teleportieren lassen?
Habe mir gedacht einfach folgenden Code benutzen, aber das funktioniert leider nicht...

$game_temp.player_new_map_id = 1
$game_temp.player_new_x = 1
$game_temp.player_new_y = 1

MfG und Danke im Voraus!

Ascare
08.02.2010, 13:52
2) ja mit $klasse.methode also zb $game_system.bgm_stop

3) zb so:


Graphics.freeze
$game_temp.player_new_map_id = 1
$game_temp.player_new_x = 9
$game_temp.player_new_y = 10
$game_temp.player_new_direction = 0
$game_temp.transition_processing = true
$game_temp.transition_name = ""
$game_temp.player_transferring = true

shimassy
08.02.2010, 18:25
Erstmal vielen Dank!
Allerdings funktioniert nach dem Teleportieren durch dieses Ruby-Script auf der nächsten Map folgender Code


for i in 0..($game_party.partysize - 1)
x = $game_party.actors[i].character_name
$game_map.events[i+10].\
instance_variable_set(:@character_name, x)
end
plötzlich nicht mehr (hab es ausprobiert, es funktioniert nur dann, wenn ich noch zusätzlich ein "Execute Transition" anhänge, obwohl das eigentlich schon in deinem Code implementiert sein sollte) ...

Ascare
08.02.2010, 22:30
$game_temp.player_transferring = true
$game_temp.player_new_map_id = 1
$game_temp.player_new_x = 9
$game_temp.player_new_y = 10
$game_temp.player_new_direction = 0
Graphics.freeze
$game_temp.transition_processing = true
$game_temp.transition_name = ""

Habs mal umgestellt, dann versuch es mal so.

-KD-
09.02.2010, 17:01
# transition code
$game_temp.player_new_map_id = 1
$game_temp.player_new_x = 9
$game_temp.player_new_y = 10
$game_temp.player_new_direction = 0
$scene.transfer_player

# jetzt dein anderer Code
$game_party.actors.each_with_index do |actor, index|
$game_map.events[index + 10].character_name = actor.character_name
end

Wobei du noch ein

class Game_Character
attr_writer :character_name
end
setzen musst um den Charakternamen des Events zu ändern. instance_variable_set ist eher 'ne Notlösung.

Zu 1.) Du musst nur das Standard-Input Modul um die neuen Tasten erweitern. Allerdings würde ich dir raten ein anderes Keyboard-Script zu verwenden. Das obige ist nicht nur schlecht gescriptet, sondern auch noch teilweise französisch.