Save-Point
Changing Window Styles in Game - Printable Version

+- Save-Point (https://www.save-point.org)
+-- Forum: Games Development (https://www.save-point.org/forum-4.html)
+--- Forum: Code Support (https://www.save-point.org/forum-20.html)
+--- Thread: Changing Window Styles in Game (/thread-4570.html)



Changing Window Styles in Game - JackMonty - 03-09-2013

Hi All,

I need help with a script that is meant to change windows styles during the game. A menu lets you select the window styles and should then apply them. This is working as styles for menus and the battle scenes do change but doesn't seem to apply to text boxes when talking to characters...

Script is below from the whole of the options screen -the section I believe controls the windows styles is Window_Windowskin: have I missed something?


Code:
#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base
  #--------------------------------------------------------------------------
  def draw_meter(now, max, x, y, width, height, start_color, end_color=start_color )
    self.contents.fill_rect(x, y, width, height, Color.new(0,0,0,255))
    now = now > max ? max : now
    percentage = max != 0 ? (width) * now / max.to_f : 0
    if start_color == end_color
      self.contents.fill_rect(x, y, percentage, height, start_color)
    else
      for i in 0..percentage-1
        r = start_color.red + (end_color.red - start_color.red) / percentage * i
        g = start_color.green + (end_color.green - start_color.green) / percentage * i
        b = start_color.blue + (end_color.blue - start_color.blue) / percentage * i
        a = start_color.alpha + (end_color.alpha - start_color.alpha) / percentage * i
        self.contents.fill_rect(x+i, y, 1, height, Color.new(r, g, b, a))
      end
    end
  end
  #--------------------------------------------------------------------------
end


#==============================================================================
# ■ Window_Option
#==============================================================================

class Window_Option < Window_Base
  #--------------------------------------------------------------------------
  def initialize
    super(6*32, 128, 13*32+16, 2*24+32)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.contents.font.name = "Berlin Sans FB"
    self.contents.font.size = 20
    refresh
  end
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    
    self.contents.fill_rect(20, 0+10, 200, 6, Color.new(0, 0, 0, 255))
    self.contents.fill_rect(20, 24+10, 200, 6, Color.new(0, 0, 0, 255))
    
    draw_meter($game_system.se_volume, 100, 21, 1+10, 198, 4, Color.new(255, 255, 255, 255))
    draw_meter($game_system.me_volume, 100, 21, 25+10, 198, 4, Color.new(255, 255, 255, 255))
    
    self.contents.font.color = Color.new( 80, 32, 32)
    self.contents.draw_text(0, 0, width-32, 24, "0")
    self.contents.draw_text(224, 0, 32, 24, "100")
    self.contents.draw_text(0, 0, width-32-2, 24, $game_system.se_volume.to_s + "/ 100", 2)

    self.contents.draw_text(0, 24, width-32, 24, "0")
    self.contents.draw_text(224, 24, 32, 24, "100")
    self.contents.draw_text(0, 24, width-32-2, 24, $game_system.me_volume.to_s + "/ 100", 2)
  end
  #--------------------------------------------------------------------------
end


#==============================================================================
# ■ Window_OptionCommand
#==============================================================================

class Window_OptionCommand < Window_Selectable
  #--------------------------------------------------------------------------
  def initialize
    super(16, 160, 5*32, 4*24+32)
    @commands = [" ", " ", " ", " "]
    @description = ["",
                                "",
                                "",
                                ""]
    @item_max = 4
    @column_max = 1
    self.contents = Bitmap.new(width - 32, height-32)
    self.contents.font.name = "Berlin Sans FB"
    self.contents.font.size = 20
    for i in 0..(@item_max-1)
      draw_item(i, normal_color)
    end
    self.z = 200
    self.index = 0
  end
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    self.contents.font.color = Color.new( 80, 32, 32)
    rect = Rect.new(0, 24*index, width-32, 24)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index], 1)
  end
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(@description[index], 1)
  end
  #--------------------------------------------------------------------------
  def update_cursor_rect
    self.cursor_rect.set(0, 24*index, width-32, 24)
  end
  #--------------------------------------------------------------------------
end


#==============================================================================
# ■ Window_Windowskin
#==============================================================================

class Window_Windowskin < Window_Selectable
  #--------------------------------------------------------------------------
  def initialize
    super(6*32, 128+3*24+8, 13*32+16, 32+64)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.index = -1
    self.active = false
    @column_max = @item_max = 3#ZVB# Inserisci il numero di windowskin presenti nell'omonima cartella
    refresh
  end
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0..@item_max-1
      x = i % @column_max * (width-32)/@column_max
      y = i / @column_max * 64
      bitmap = RPG::Cache.windowskin("Windowskin#{i + 1}")
      self.contents.blt(x, y, bitmap, Rect.new(64, 0, 128, 64), 255)
    end
  end
  #--------------------------------------------------------------------------
  def update_cursor_rect
    x = index % @column_max * (width-32)/@column_max
    y = index / @column_max * 64
    if @index < 0
      self.cursor_rect.empty
    else
      self.cursor_rect.set(x, y, 128, 64)
    end
  end
  #--------------------------------------------------------------------------
end


#==============================================================================
# ■ Scene_Option
#==============================================================================

class Scene_Option
  #--------------------------------------------------------------------------
  def initialize(index=0)
    @index = index
  end
  #--------------------------------------------------------------------------
  def main
    @command_window = Window_OptionCommand.new
    @help_window = Window_Help.new
    @command_window.help_window = @help_window
    @option_window = Window_Option.new
    @windowskin_window = Window_Windowskin.new
    @se_regulation = false
    @me_regulation = false
    @menu = Plane.new    
    @menu.bitmap = RPG::Cache.picture("opzioni")
    @menu.opacity = 255
    @command_window .windowskin = RPG::Cache.windowskin("vuota")
    @help_window .windowskin = RPG::Cache.windowskin("vuota")
    @option_window .windowskin = RPG::Cache.windowskin("vuota")
    @windowskin_window .windowskin = RPG::Cache.windowskin("vuota")
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    @command_window.dispose
    @option_window.dispose
    @windowskin_window.dispose
  end
  #--------------------------------------------------------------------------
  def update
    @help_window.update
    @command_window.update
    @option_window.update
    @windowskin_window.update
    if @command_window.active
      @command_window.help_window = @help_window
      update_command
      return
    end
    if @windowskin_window.active
      @help_window.set_text("")
      update_windowskin
      return
    end
    if @se_regulation == true
      update_se_regulation
    end
    if @me_regulation == true
      update_me_regulation
    end
  end
  #--------------------------------------------------------------------------
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(4)
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @se_regulation = true
      when 1
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @me_regulation = true
      when 2
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @windowskin_window.index = 0
        @windowskin_window.active = true
      when 3
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Formation.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  def update_se_regulation
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @se_regulation = false
      @command_window.active = true
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      @se_regulation = false
      @command_window.active = true
      return
    end
    if Input.repeat?(Input::RIGHT) and $game_system.se_volume < 100
      $game_system.se_play($data_system.cursor_se)
      $game_system.se_volume += 1
      @option_window.refresh
    end
    if Input.repeat?(Input::LEFT) and $game_system.se_volume > 0
      $game_system.se_play($data_system.cursor_se)
      $game_system.se_volume -= 1
      @option_window.refresh
    end
  end
  #--------------------------------------------------------------------------
  def update_me_regulation
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @me_regulation = false
      @command_window.active = true
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      @me_regulation = false
      @command_window.active = true
      return
    end
    if Input.repeat?(Input::RIGHT) and $game_system.me_volume < 100
      $game_system.me_volume += 1
      
      $game_system.bgm_memorize
      $game_system.bgm_stop
      $game_system.bgm_restore
      
      @option_window.refresh
    end
    if Input.repeat?(Input::LEFT) and $game_system.me_volume > 0
      $game_system.me_volume -= 1
      
      $game_system.bgm_memorize
      $game_system.bgm_stop
      $game_system.bgm_restore
      
      @option_window.refresh
    end
  end
  #--------------------------------------------------------------------------
  def update_windowskin
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @windowskin_window.active = false
      @command_window.active = true
      @windowskin_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      $data_system.windowskin_name = $game_system.windowskin_name = "Windowskin#{@windowskin_window.index + 1}"
      return
    end
  end
  #--------------------------------------------------------------------------
end

Here is a video of the current behaviour if it helps...

http://www.mediafire.com/?6gg5v9f8yrnstgb

As always any help or pointers would be appreciated - Many Thanks!



RE: Changing Window Styles in Game - MechanicalPen - 03-09-2013

Oh it's you again! Hi!


I played around with this a bit, and noticed that the windowskin of one of my custom windows didn't change either. Then I found this in Window_Base:
Code:
#--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    # Reset if windowskin was changed
    if $game_system.windowskin_name != @windowskin_name
      @windowskin_name = $game_system.windowskin_name
      self.windowskin = RPG::Cache.windowskin(@windowskin_name)
    end
  end

And I figured out what I need to do. If you window has an 'update' method, make sure it calls 'super' at the end of it. That way it will run Window_Base's 'update' and properly change the windowskin.


RE: Changing Window Styles in Game - JackMonty - 03-11-2013

Hi MechanicalPen!

Thanks for the super fast response!

Now it might just be me being a bit dense - but I still can't get it to work!

I've called "super" in the Window_Windowskin section and it doesn't seem to work...

Which section did you put it in to get it working?

Thanks so much!


RE: Changing Window Styles in Game - MechanicalPen - 03-11-2013

No, you must add 'super' to your message window. Because that is the window not properly updating its windowskin.

Find your "one-letter-at-a-time" script and search for an 'update' method. Add 'super' at the end of it.


RE: Changing Window Styles in Game - JackMonty - 03-19-2013

Hi,

Thanks for your suggestion - I went through and carefully checked all the windows styles - I believe the one that handles the text boxes is the standard "Windows_Message" - they all had a super in the def update sections.

I wonder if I should just add some code in this section:

Code:
#--------------------------------------------------------------------------
  def update_windowskin
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @windowskin_window.active = false
      @command_window.active = true
      @windowskin_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      $data_system.windowskin_name = $game_system.windowskin_name = "Windowskin#{@windowskin_window.index + 1}"
      return
    end
  end
  #--------------------------------------------------------------------------

That way after the new window is updated the update command will be called form here. Do you happen to know the script or syntax for changing just the text box style? If not I'll look it up - thanks for the tips and advise you've provided so far.


RE: Changing Window Styles in Game - MechanicalPen - 03-19-2013

The "Change Windowskin" event just uses "$game_system.windowskin_name = operator[0]" So your code SHOULD work! Let me take a look at that old demo you uploaded, see if I can find the problem using that.

EDIT: Aha! I knew it. Look at the AMS script, it has these declarations.
Code:
@message_box_skin = "Windowskin1"   #Choose the WindowSkin for the Message Box
@name_box_skin = "Windowskin1"       #Choose the WindowSkin for the Name Box

This fix is not going to be as easy as I thought... I don't have time to walk you through it right now, but try adding something like:

Code:
if @message_box_skin != $game_system.windowskin_name
    @message_box_skin = $game_system.windowskin_name
end

To the update section in the AMS script. There might be better ways to solve this though, as I said I don't have time to look for a good solution right now (I'm late for class!) Good luck!


RE: Changing Window Styles in Game - JackMonty - 03-21-2013

Hi,

I tried adding the code you specified to the AMS script under the update section (See below)

Code:
def update

super

if
  @message_box_skin != $game_system.windowskin_name
  @message_box_skin = $game_system.windowskin_name
end


if @fade_in
  self.contents_opacity += 24
  if @input_number_window != nil
    @input_number_window.contents_opacity += 24
  end
  if self.contents_opacity == 255
    @fade_in = false
  end
  return
end
@now_text = nil if @now_text == ""

if @now_text != nil and @mid_stop == false
  if @write_wait > 0
    @write_wait -= 1
    return
  end
  text_not_skip = LETTER_BY_LETTER_MODE
  while true
    @max_x = @x if @max_x < @x
    @max_y = @y if @max_y < @y
    if (c = @now_text.slice!(/./m)) != nil
      if c == "\000"
        c = "\\"
      end
      
      if c == "\001"
        @now_text.sub!(/\[([0123456789ABCDEF#]+)\]/, "")
        temp_color = $1
        color = temp_color.to_i
        leading_x = temp_color.to_s.slice!(/./m)
        if leading_x == "#"
          self.contents.font.color = hex_color(temp_color)
          next
        end
        if color >= 0 and color <= 7
          self.contents.font.color = text_color(color)
        end
        next
      end

      if c == "\002"
        if @gold_window == nil and @popchar <= 0
          @gold_window = Window_Gold.new
          @gold_window.x = 560 - @gold_window.width
          if $game_temp.in_battle
            @gold_window.y = 192
          else
            @gold_window.y = self.y >= 128 ? 32 : 384
          end
          @gold_window.opacity = self.opacity
          @gold_window.back_opacity = self.back_opacity
        end
        c = ""
      end

      if c == "\003"
        @now_text.sub!(/\[([0-9]+)\]/, "")
        speed = $1.to_i
        if speed >= 0 and speed <= 19
          @write_speed = speed
        end
        c = ""
      end

      if c == "\004"
        @now_text.sub!(/\[(.*?)\]/, "")
        buftxt = $1.dup.to_s
        if buftxt.match(/\//) == nil and buftxt != "" then
          $soundname_on_speak = "Audio/SE/" + buftxt
        else
          $soundname_on_speak = buftxt.dup
        end
        c = ""
      elsif c == "\004"
        c = ""
      end
      
      if c == "\005"
        @write_wait += 5
        c = ""
      end
      
      if c == "\006"
        @write_wait += 20
        c = ""
      end
      
      if c == "\016"
        text_not_skip = false
        c = ""
      end
      
      if c == "\017"
        text_not_skip = true
        c = ""
      end
      
      if c == "\020"
        @mid_stop = true
        c = ""
      end
      
      if c == "\021"
        terminate_message
        return
      end
      
      if c == "\023"
        @indent = @x
        c = ""
      end

      if c == "\024"
        @now_text.sub!(/\[([0-9]+)\]/, "")
        @opacity = $1.to_i
        color = self.contents.font.color
        self.contents.font.name = $ams.font_type
        self.contents.font.size = $ams.font_size
        self.contents.font.color = Color.new(color.red, color.green, color.blue, color.alpha * @opacity / 255)
        c = ""
      end

      if c == "\025"
        @now_text.sub!(/\[([0-9]+)\]/, "")
        self.contents.font.size = [[$1.to_i, 6].max, 32].min
        c = ""
      end

      if c == "\026"
        @now_text.sub!(/\[([0-9]+)\]/, "")
        @x += $1.to_i
        c = ""
      end
      
      if c == "\027"
        @now_text.sub!(/\[(.*?)\]/, "")
        @x += ruby_draw_text(self.contents, @x, @y * line_height + (line_height - self.contents.font.size), $1, @opacity)
        if $soundname_on_speak != ""
          Audio.se_play($soundname_on_speak)
        end
      c = ""
      end

      if c == "\030"
        @now_text.sub!(/\[(.*?)\]/, "")
        self.contents.blt(@x , @y * line_height + 8, RPG::Cache.icon($1), Rect.new(0, 0, 24, 24))
        if $soundname_on_speak != ""
          Audio.se_play($soundname_on_speak)
        end
        @x += 24
        c = ""
      end

      if c == "\n"
        @lines += 1
        @y += 1
        @x = 0 + @indent + @face_indent
        if @lines >= $game_temp.choice_start
          @x = 8 + @indent + @face_indent
          @cursor_width = @max_choice_x
        end
        c = ""
      end
      
      if c == "\022"
        @now_text.sub!(/\[([0-9]+)\]/, "")
        @x += gaiji_draw(4 + @x, @y * line_height + (line_height - self.contents.font.size), $1.to_i)
        c = ""
      end
      
      #NEW
      #Dubealex's Text Skip On/OFF Command
       if c == "\100"
          if @alex_skip==false
             @alex_skip=true
          else
            @alex_skip=false
          end
         c = ""
       end  
       #end of new command
                                   
      if c != ""
        self.contents.draw_text(0+@x, 32 * @y, 40, 32, c)
        @x += self.contents.text_size(c).width
        if $soundname_on_speak != "" then
          Audio.se_play($soundname_on_speak)
        end
      end
      
#SKIP_TEXT_CODE

# B = Escape, 0 (On The NumPad), X
# C = Enter, Space Bar and C
# A = Shift, Z

  if Input.press?(Input::C) # <-- Change the value on that line
    if @alex_skip==false      
    text_not_skip = false
    end
      end
    else
      text_not_skip = true
      break
    end
    
    if text_not_skip
      break
    end
  end
  @write_wait += @write_speed
  return
end

if @input_number_window != nil
  @input_number_window.update
  if Input.trigger?(Input::C)
    $game_system.se_play($data_system.decision_se)
    $game_variables[$game_temp.num_input_variable_id] =
      @input_number_window.number
    $game_map.need_refresh = true
    @input_number_window.dispose
    @input_number_window = nil
    terminate_message
  end
  return
end

if @contents_showing
  if $game_temp.choice_max == 0
    self.pause = true
  end
  
  if Input.trigger?(Input::B)
    if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
      $game_system.se_play($data_system.cancel_se)
      $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
      terminate_message
    end
  end
  
  if Input.trigger?(Input::C)
    if $game_temp.choice_max > 0
      $game_system.se_play($data_system.decision_se)
      $game_temp.choice_proc.call(self.index)
    end
    if @mid_stop
      @mid_stop = false
      return
    else
      terminate_message
    end
  end
  return
end

if @fade_out == false and $game_temp.message_text != nil
  @contents_showing = true
  $game_temp.message_window_showing = true
  refresh
  Graphics.frame_reset
  self.visible = true
  self.contents_opacity = 0
  if @input_number_window != nil
    @input_number_window.contents_opacity = 0
  end
  @fade_in = true
  return
end

if self.visible
  @fade_out = true
  self.opacity -= 48
  if self.opacity == 0
    self.visible = false
    @fade_out = false
    $game_temp.message_window_showing = false
  end
  return
end
end



That didn't work and I also added it at the end of the update def too but that didn't work either - the text box just refuses to update! At least now I'm looking in the right place, I thought this was being controlled by the Window_Message script before!

I tired tweaking a few more things in the AMS scrit but still no luck...


RE: Changing Window Styles in Game - MechanicalPen - 03-22-2013

Okay undo that then...

try.... changing
Code:
self.windowskin = RPG::Cache.windowskin($ams.message_box_skin)
to
Code:
self.windowskin = RPG::Cache.windowskin($game_system.windowskin_name)

edit: Also, you may want to change
Code:
self.windowskin = RPG::Cache.windowskin($ams.name_box_skin)
to
Code:
self.windowskin = RPG::Cache.windowskin($game_system.windowskin_name)



RE: Changing Window Styles in Game - JackMonty - 03-22-2013

That WORKED!

Thank you so much for all your help! I would never have spotted this. I just have to test it under various circumstances but it all looks good so far.

I'll make sure to include you in the credits!