UltimaForum

Skrypty [XP] - Ulepszony system wpisywania imienia...

spino333 - Czw 21 Sty, 2010 01:31
Temat postu: Ulepszony system wpisywania imienia...
Skrypt ulepsza system wpisywania imienia...
Skrypt:

Spoiler:

No zaczynajmy:
Otwieramy edytor skryptów...Szukamy po lewej zakładki: Class Scene_Name , gdy ją znajdziemy usuwamy całą jej zawartość...
Następnie wklejamy do niej nowy kod:

Kod:
class Scene_Name
 # -------------------------
 def main
   @actor = $game_actors[$game_temp.name_actor_id]
   @edit_window = Window_NameEdit.new(@actor, $game_temp.name_max_char)
   @input_window = Window_NameInput.new
   @alert_window = Window_Base.new(188, 208, 264, 64)
   @alert_window.contents = Bitmap.new(228, 32)
   @alert_window.contents.font.name = "Arial"
   @alert_window.contents.font.size = 24
   @alert_window.contents.draw_text(0, 0, 228, 32, "You must enter a name.")
   @alert_window.z = 1001
   @alert_window.visible = false
   c1 = "English"
   c2 = "Chinese"
   c3 = "Japanese"
   c4 = "Space"
   c5 = "Backspace"
   c6 = "Default"
   c7 = "Done"
   commands = [c1, c2, c3, c4, c5, c6, c7]
   @command_window = Window_NameCommand.new(160, commands)
   @input_window.active = false
   @input_window.visible = true
   @command_window.index = 0
   @command_window.visible = true
   @command_window.active = true
   @command_window.x = 0
   @command_window.y = 128
   @command_window.z = 1000
   @alert_count = 0
   Graphics.transition
   loop do
     Graphics.update
     Input.update
     update
     if $scene != self
       break
     end
   end
   Graphics.freeze
   @edit_window.dispose
   @input_window.dispose
   @command_window.dispose
   @alert_window.dispose
 end
 # -------------------------
 def update
   @edit_window.update
   @input_window.update
   @command_window.update
   @alert_window.update
   if @alert_window.visible == true && @alert_count > 0
     @alert_count -= 1
     if @alert_count <= 0
       @command_window.active = true
       @alert_window.visible = false
     end
   return
   end
   if @input_window.active == false
     @command_window.active = true
   end
   if @command_window.active == false
     @input_window.active = true
   end
   if Input.repeat?(Input::B) && @input_window.active == true
     if @edit_window.index == 0
       return
     else
     $game_system.se_play($data_system.cancel_se)
     @edit_window.back
     end
   end
   if Input.repeat?(Input::B) && @command_window.active == true
     $game_system.se_play($data_system.buzzer_se)
     return
   end   
     
       
   if Input.trigger?(Input::C)     
     if @command_window.active == true
       case @command_window.index
       when 0
       $game_system.se_play($data_system.decision_se)
       @input_window.mode = 1
       @input_window.refresh
       @command_window.active = false
       @input_window.active = true
       @input_window.index = 0
       return
       when 1
       $game_system.se_play($data_system.decision_se)
       @input_window.mode = 2
       @input_window.refresh
       @command_window.active = false
       @input_window.active = true
       @input_window.index = 0
       return
       when 2
       $game_system.se_play($data_system.decision_se)
       @input_window.mode = 3
       @input_window.refresh
       @command_window.active = false
       @input_window.active = true
       @input_window.index = 0
       return
       when 3
       if @edit_window.index < $game_temp.name_max_char
         $game_system.se_play($data_system.decision_se)
         @edit_window.add("")
       else         
         $game_system.se_play($data_system.buzzer_se)
       end
       return
       when 4
       $game_system.se_play($data_system.decision_se)
       @edit_window.back
       return
       when 5
       $game_system.se_play($data_system.decision_se)
       @edit_window.restore_default
       return
       when 6
       if @edit_window.name == ""         
         $game_system.se_play($data_system.buzzer_se)
         @alert_window.visible = true
         @command_window.active = false
         @alert_count = 60
         return
       end
         $game_system.se_play($data_system.decision_se)
         @actor.name = @edit_window.name
         $game_system.se_play($data_system.decision_se)
         $scene = Scene_Map.new
         return
       end
      end
     if @edit_window.index == $game_temp.name_max_char &&
       @input_window.active == true
       $game_system.se_play($data_system.buzzer_se)
       return
     end
     if @input_window.character == "" && @input_window.active == true
       $game_system.se_play($data_system.buzzer_se)
       return
     end
    if @input_window.character != nil && @input_window.active == true &&
       @edit_window.index <= $game_temp.name_max_char
     $game_system.se_play($data_system.decision_se)
     if @input_window.mode == 1
       @edit_window.char_type[@edit_window.index] = 1
     else
       @edit_window.char_type[@edit_window.index] = 2
     end
     @edit_window.add(@input_window.character)
   end
     return
     end
 end
end


Teraz czas na kolejny krok szukamy zakładki : Window Name_Edit i zamieniamy jej zawartość na :

Cytat:
class Window_NameEdit < Window_Base
# ---------------------------
attr_accessor :char_type
attr_reader :name
attr_reader :index
# ---------------------------
def initialize(actor, max_char)
super(0, 0, 640, 128)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
@name = actor.name
@max_char = max_char
@char_type = []
name_array = @name.split(//)[0...@max_char]
@name = ""
for i in 0...name_array.size
@name += name_array[i]
@char_type[i] = 1
end
@default_name = @name
@index = name_array.size
refresh
update_cursor_rect
end
# ---------------------------
def restore_default
@name = @default_name
for i in 0..@default_name.size
@char_type[i] = 1
end
@index = @name.split(//).size
refresh
update_cursor_rect
end
# ---------------------------
def add(character)
if @index < @max_char and character != ""
@name += character
@index += 1
refresh
update_cursor_rect
end
end
# ---------------------------
def back
if @index > 0
name_array = @name.split(//)
@name = ""
for i in 0...name_array.size-1
@name += name_array[i]
end
@index -= 1
refresh
update_cursor_rect
end
end
# ---------------------------
def refresh
self.contents.clear
name_array = @name.split(//)
for i in 0...@max_char
c = name_array[i]
if c == nil
c = "�"
end
x = 320 - @max_char * 14 + i * 28
if @char_type[i] == 1
self.contents.font.name = "Arial"
self.contents.font.size = 24
else
self.contents.font.name = "Arial"
self.contents.font.size = 22
end
self.contents.draw_text(x, 32, 28, 32, c, 1)
end
draw_actor_graphic(@actor, 320 - @max_char * 14 - 40, 80)
end
# ---------------------------
def update_cursor_rect
x = 320 - @max_char * 14 + @index * 28
self.cursor_rect.set(x, 32, 28, 32)
end
# ---------------------------
def update
super
update_cursor_rect
end
end

Następnie szukamy zakładki Window Name_Input i orbimy z nią to samo tym razem wklejamy jednak ten kod:


class Window_NameInput < Window_Base
# ----------------------------------
attr_accessor :mode
# ----------------------------------
ENGLISH_TABLE =
[
"A","B","C","D","E",
"F","G","H","I","J",
"K","L","M","N","O",
"P","Q","R","S","T",
"U","V","W","X","Y",
"Z","","","","",
"0","1","2","3","4",
"5", "6" ,"7", "8" ,"9",
"","","","","",
"a", "b" ,"c", "d" ,"e",
"f","g","h","i","j",
"k","l","m","n","o",
"p","q","r","s","t",
"u","v","w","x","y",
"z","","","","",
".",",","?","!","/",
"\\","<",">",";",":",
"","", "" , "" , "" ,
"@","#","$","%","^",
"&","*","(",")","",
"[","]","'","\"","~",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"", "" ,"", "" ,"",
"","","","","",
]
HIRAGANA_TABLE =
[
"‚ ","‚¢","‚¤","‚¦","‚¨",
"‚©","‚«","‚","‚¯","‚±",
"‚³","‚µ","‚·","‚¹","‚»",
"‚½","‚¿","‚Â","‚Ä","‚Æ",
"‚È","‚É","‚Ê","‚Ë","‚Ì",
"‚Í","‚Ð","‚Ó","‚Ö","‚Ù",
"‚Ü","‚Ý","‚Þ","‚ß","‚à",
"‚â", "" ,"‚ä", "" ,"‚æ",
"‚ç","‚è","‚é","‚ê","‚ë",
"‚í", "" ,"‚ð", "" ,"‚ñ",
"‚ª","‚¬","‚®","‚°","‚²",
"‚´","‚¶","‚¸","‚º","‚¼",
"‚¾","‚À","‚Ã","‚Å","‚Ç",
"‚Î","‚Ñ","‚Ô","‚×","‚Ú",
"‚Ï","‚Ò","‚Õ","‚Ø","‚Û",
"‚á","‚ã","‚å","‚Á","‚ì",
"‚Ÿ","‚¡","‚£","‚¥","‚§",
"�[","�E", "" , "" , "" ,
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
]
KATAKANA_TABLE =
[
"‚ ","¢","¤","¦","¨",
"©","«","","¯","±",
"³","µ","·","¹","»",
"½","¿","Â","Ä","Æ",
"È","É","Ê","Ë","Ì",
"Í","Ð","Ó","Ö","Ù",
"Ü","Ý","Þ","ß","à",
"â", "" ,"ä", "" ,"æ",
"ç","è","é","ê","ë",
"í", "" ,"ð", "" ,"ñ",
"ª","¬","®","°","²",
"´","¶","¸","º","¼",
"¾","À","Ã","Å","Ç",
"Î","Ñ","Ô","×","Ú",
"Ï","Ò","Õ","Ø","Û",
"á","ã","å","Á","ì",
"Ÿ","¡","£","¥","§",
"�[","�E", "" , "" , "" ,
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
"","","","","",
]

# ----------------------------------
def initialize
super(160, 128, 480, 352)
self.contents = Bitmap.new(width - 32, height - 32)
self.active = false
@index = -1
@mode = 1
refresh
update_cursor_rect
end
# ----------------------------------
def index=(value)
@index = value
update_cursor_rect
end
#--------------------------------------
def character
if @mode == 1
return ENGLISH_TABLE[@index]
elsif @mode == 2
return HIRAGANA_TABLE[@index]
else
return KATAKANA_TABLE[@index]
end
end
# ----------------------------------
def refresh
self.contents.clear
for i in 0..134
x = 4 + i / 5 / 9 * 152 + i % 5 * 28
y = i / 5 % 9 * 32
if @mode == 1
self.contents.font.name = "Arial"
self.contents.font.size = 24
self.contents.draw_text(x, y, 28, 32, ENGLISH_TABLE[i], 1)
elsif @mode == 2
self.contents.font.name = "Arial"
self.contents.font.size = 22
self.contents.draw_text(x, y, 28, 32, HIRAGANA_TABLE[i], 1)
else
self.contents.font.name = "Arial"
self.contents.font.size = 22
self.contents.draw_text(x, y, 28, 32, KATAKANA_TABLE[i], 1)
end
end
end
# ----------------------------------
def update_cursor_rect
if self.active == false
self.cursor_rect.empty
else
x = 4 + @index / 5 / 9 * 152 + @index % 5 * 28
y = @index / 5 % 9 * 32
self.cursor_rect.set(x, y, 28, 32)
end
end
# ----------------------------------
def update
super
if @index >= 0 && @index <= 134
if Input.repeat?(Input::RIGHT)
$game_system.se_play($data_system.cursor_se)
if @index % 5 == 4
if @index < 94
@index += 41
end
else
@index += 1
end
end
if Input.repeat?(Input::LEFT)
$game_system.se_play($data_system.cursor_se)
if @index % 5 == 0
if @index < 45
self.active = false
@index = -999
return
else
@index -= 41
end
else
@index -= 1
end
end
if Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
if @index % 45 < 40
@index += 5
end
end
if Input.repeat?(Input::UP)
if Input.trigger?(Input::UP) or @index % 45 >= 5
$game_system.se_play($data_system.cursor_se)
if @index % 45 >= 5
@index -= 5
end
end
end
end
update_cursor_rect
end
end


W tabelach English table, hiregana table itd. Są znaki, które wyświetlą się po wybraniu języka...angielski będzie tu językiem standardowym...Oczywiście znaki musicie sobie zedytować...
Teraz tworzymy nową zakładke jak? klikamy prawym klawiszem myszy na liscie i wybieramy wstaw(add).
Nazwa zakładki to : Window_NameCommand

A jej zawartość to:

Kod:
class Window_NameCommand < Window_Command
# -------------------------------
 def refresh
   self.contents.clear
   for i in 0...@item_max
     if i == 1 or i == 2
       font = 1
       self.contents.font.name = "Arial"
       self.contents.font.size = 22
     else
       font = 0
       self.contents.font.name = "Arial"
       self.contents.font.size = 24
     end
     draw_item(i, normal_color, font)
   end
 end
# -------------------------------
def draw_item(index, color, f)
 if f == 0
   self.contents.font.color = color
   self.contents.font.name = "Arial"
   self.contents.font.size = 24
 else
   self.contents.font.name = "Arial"
   self.contents.font.size = 22
 end
   rect = Rect.new(4, 32 * index, self.contents.width - 8, 32)
   self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
   self.contents.draw_text(rect, @commands[index])
 end
end


No i powinno działać...Mam nadzieję, że opisałem to wystarczjąco łatwo....



Screen:
Spoiler:



R.I.P. - Nie 28 Mar, 2010 22:44

Jak dla mnie może być tylko stary też dobry, tutaj zmienia się tylko językowy ;p.
RtaMag2 - Sob 03 Kwi, 2010 19:53

To się czymś wywołuje czy coś?
Melvin - Sob 03 Kwi, 2010 19:59

To zastępuje zwykły system wpisywania imienia...
RtaMag2 - Sob 03 Kwi, 2010 20:03

I jak włączę grę to odrazu się pojawia?
Melvin - Sob 03 Kwi, 2010 20:05

Nie.
Masz w edycji zdarzeń: "Wprowadź imię bohatera"...
I to zastępuje podstawowy system wpisywania imienia...

RtaMag2 - Sob 03 Kwi, 2010 20:12

A moge zrobić tak że na początku gry pojawia mi się to wpisywanie imienia jak tak to podaj mi dokładniusi prodanik :-D
Melvin - Sob 03 Kwi, 2010 20:15

Tam gdzie pozycja startowa bohatera ustawiasz zdarzenie(równoległe) z poleceniem "Wprowadź imię bohatera" a po tym dajesz usuń zdarzenie... I już! :-D
Czeliosss - Sob 03 Kwi, 2010 20:16

1 strona zdarzenia. Robisz zdarzenie na równoległe i dajesz Zmień imię Bohatera, i główny przełącznik A.
2 strona zdarzenia. Ustawiasz warunek A=On

Izaya - Nie 11 Lip, 2010 09:16

Bardzo przydatny Skrypt. :-)
Mało "Mejkerowców" wybiera wpisywanie imienia bohatera,
ponieważ uważają że ich Imię jest bardzo dobre.
Lecz niektórym graczom nie podoba się imię i chcieliby to zmienić...
Jestem jednym właśnie z takich :mrgreen:
Nie wykluczone że ten skrypt pojawi się w mojej grze ;-)
Dobrze wykombinowane z językami Angielskim, Chińskim i Japońskim,
urozmaica to to całą grę :-)
Pozdrawiam :przytul:

vikki - Nie 12 Cze, 2011 09:27

Ops...Nie, nie działa:(
Feniks - Nie 12 Cze, 2011 12:16

co ci dokładnie nie działa?... Jakiś błąd?
vikki - Nie 12 Cze, 2011 15:45

@darknessXII
Tak 1.Wyskakuje mi błąd 2.Opcja nie działa

Ayene - Nie 12 Cze, 2011 16:31

Jakiej treści jest błąd, w którym momencie się pokazuje?
vikki - Nie 12 Cze, 2011 17:03

@Ayene

Kiedy włączam grę...

vikki - Nie 12 Cze, 2011 17:04

jakiej treści?Nie pamiętam ale pisze coś z "SYntax Error"
Ayene - Nie 12 Cze, 2011 20:30

Spakuj swój projekt, zhostuj go na www.mediafire.com i wyślij mi link na PW.
vikki - Wto 14 Cze, 2011 21:55

Ayene, niestety dopiero robię gre ale wyśle kiedy skończe, bardzo dziękuje:)

Powered by phpBB modified by Przemo © 2003 phpBB Group