dawidpieper

Liczba postów: 38
Dołączył: 25-05-13
Pomógł: 5

|
Wprowadzanie imienia bohatera w polu tekstowym
~ Wprowadzanie imienia bohatera z klawiatury ~
Krótki opis:
Skrypt wykorzystuje windowsowe pola tekstowe. W chwili użycia funkcji Input Text, wyświetla się pole tekstowe, obsługujące kursor myszy i wszystkie znaki - polskie również.
Autor:
Dawid Pieper (pajper)
Wersja skryptu:: 1.1
Skrypt:
#Obsługa polskich znaków w winapi - dzięki Ejene
def utf8(text)
text = "\0" if text == nil
to_char = Win32API.new("kernel32", "MultiByteToWideChar", 'ilpipi', 'i')
to_byte = Win32API.new("kernel32", "WideCharToMultiByte", 'ilpipipp', 'i')
utf8 = 65001
w = to_char.call(utf8, 0, text, text.size, nil, 0)
b = "\0" * (w*2)
w = to_char.call(utf8, 0, text, text.size, b, b.size/2)
w = to_byte.call(0, 0, b, b.size/2, nil, 0, nil, nil)
b2 = "\0" * w
w = to_byte.call(0, 0, b, b.size/2, b2, b2.size, nil, nil)
return(b2)
end
#Sam skrypt
$gametitle = "\0" * 512
fw = Win32API.new("user32","FindWindow",'pp','i')
inir = Win32API.new("kernel32","GetPrivateProfileString",'ppppip','i')
inir.call("Game","Title",'',$gametitle,511,".\\Game.ini")
$gametitle.delete!("\0")
$hwnd = fw.call(nil,$gametitle)
gmh = Win32API.new("kernel32","GetModuleHandle",'p','i')
$instance = gmh.call(nil)
$hwnd_class = "\0" * 256
Win32API.new("user32","GetClassName",'ipi','i').call($hwnd,$hwnd_class,255)
$hwnd_class.delete!("\0")
class Scene_Name
def main
@actor = $game_actors[$game_temp.name_actor_id]
Win32API.new("user32","ShowWindow",'ii','i').call($hwnd,0)
@crewin = Win32API.new("user32","CreateWindowEx",'ippiiiiiiiip','i')
@nameparent = @crewin.call(0x200,$hwnd_class,$gametitle,0xC00000|0x400000|0x10000000,10,10,640,480,0,0,$instance,nil)
@name = @crewin.call(512,"EDIT",@actor.name,0x10000000|0x40000000|1,30,30,600,450,@nameparent,111,$instance,nil)
Win32API.new("user32","SetFocus",'i','i').call(@name)
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self or @break == 1
break
end
end
Graphics.freeze
Win32API.new("user32","ShowWindow",'ii','i').call($hwnd,0)
Win32API.new("user32","SetFocus",'i','i').call($hwnd)
Win32API.new("user32","DestroyWindow",'i','i').call(@nameparent)
Win32API.new("user32","UpdateWindow",'i','i').call($hwnd)
$scene = Scene_Map.new
end
def update
if Win32API.new("user32","GetAsyncKeyState",'i','i').call(0x1B) != 0
$game_system.se_play($data_system.cancel_se)
@break = 1
end
if Win32API.new("user32","GetAsyncKeyState",'i','i').call(0x0D) != 0
$game_system.se_play($data_system.decision_se)
@nazwa = "\0" * ($game_temp.name_max_char + 1)
Win32API.new("user32","GetWindowText",'ipi','i').call(@name,@nazwa,$game_temp.name_max_char)
@nazwa.delete!("\0")
@actor.name = @nazwa
@break = 1
end
end
end
Screeny:
Dodatkowe informacje:
Wklej skrypt nad main, ale pod Scene_Name. Najlepiej Usuń Scene_Name.
Skrypt podmienia całą klasę Scene_Name i ignoruje wszystkie okna wprowadzania tekstu zdefiniowane domyślnie. Prawdopodobnie nie będzie kompatybilny z żadnym skryptem, który nadpisuje lub edytuje domyślny system wprowadzania imienia bohatera.
Pozdrawiam
Dawid Pieper
Pajper
(Ten post był ostatnio modyfikowany: 31-01-14 12:31 przez dawidpieper.)
|
|