The RPG Maker Resource Kit

RMRK RPG Maker Creation => RPG Maker General => General Scripting => Topic started by: CountVlad on May 31, 2010, 10:19:33 PM

Title: [XP] Showing Picture in Menu Background Help!
Post by: CountVlad on May 31, 2010, 10:19:33 PM
Hi,

I've been trying to improve the resolution of menu graphics by telling the windows that make up the menu screens (e.g. save screen, pause menu, inventory, etc.) to be transparent and then using...

    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.windowskin("name of background image stored in windowskin folder")


... in one of the Window scripts to display an image in the background. I found out that I had to put this particular bit of script actually in the Window script instead of the Scene script because otherwise it would be referring to something that doesn't exist within that script.
This, however, causes problems because some Window scripts are used by more than one Scene, which means that if (for example) I have a background tailored to the inventory then if I try to change hotkeys (using BlizzABS), the Inventory background image will be displayed because both scripts use "Window_Item".

Ok, now for the question. Is there a way of putting the above script (along with disposing it when you close the scene) directly into a Scene script and getting it to display a picture in the background?

Screenies:

[spoiler](https://rmrk.net/proxy.php?request=http%3A%2F%2Fwww.rpg-magic.org%2Fimages%2F1.png&hash=efa817ce9dfcad818bdbb1c5c58daeaef68fb9bf)

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fwww.rpg-magic.org%2Fimages%2F2.png&hash=f1f695753b76c85ae81ed99f7ddb68656d60252c)[/spoiler]
Title: Re: [XP] Showing Picture in Menu Background Help!
Post by: modern algebra on May 31, 2010, 10:35:28 PM
There's no reason the code you posted can't be handled in a Scene class. You might want to give it a more descriptive name. Also, remember to dispose both the bitmap and the sprite when you terminate the scene.
Title: Re: [XP] Showing Picture in Menu Background Help!
Post by: CountVlad on May 31, 2010, 10:47:29 PM
I'm not sure I entirely understand what you mean. I'm sorry, I'm kinda new to coding in Ruby.
I take it by giving it a more descriptive name you mean instead of putting "@sprite = " you can put something like "@menu_sprite = "? So I take it that's a kind of variable (like a variable in PHP)?

Tell you what, I'm better at working with examples. Could you possibly demonstrate what I would need to do to the following Scene to make it work if the picture file name is "backpack"?

[spoiler]#==============================================================================
# ** Scene_Item
#------------------------------------------------------------------------------
#  This class performs item screen processing.
#==============================================================================

class Scene_Item
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    # Make help window, item window
    @help_window = Window_Help.new
    @item_window = Window_Item.new
    # Associate help window
    @item_window.help_window = @help_window
    # Make target window (set to invisible / inactive)
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
    # Dispose of windows
    @help_window.dispose
    @item_window.dispose
    @target_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    # Update windows
    @help_window.update
    @item_window.update
    @target_window.update
    # If item window is active: call update_item
    if @item_window.active
      update_item
      return
    end
    # If target window is active: call update_target
    if @target_window.active
      update_target
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when item window is active)
  #--------------------------------------------------------------------------
  def update_item
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to menu screen
      $scene = Scene_Menu.new(0)
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get currently selected data on the item window
      @item = @item_window.item
      # If not a use item
      unless @item.is_a?(RPG::Item)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If it can't be used
      unless $game_party.item_can_use?(@item.id)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # If effect scope is an ally
      if @item.scope >= 3
        # Activate target window
        @item_window.active = false
        @target_window.x = (@item_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        # Set cursor position to effect scope (single / all)
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      # If effect scope is other than an ally
      else
        # If command event ID is valid
        if @item.common_event_id > 0
          # Command event call reservation
          $game_temp.common_event_id = @item.common_event_id
          # Play item use SE
          $game_system.se_play(@item.menu_se)
          # If consumable
          if @item.consumable
            # Decrease used items by 1
            $game_party.lose_item(@item.id, 1)
            # Draw item window item
            @item_window.draw_item(@item_window.index)
          end
          # Switch to map screen
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when target window is active)
  #--------------------------------------------------------------------------
  def update_target
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # If unable to use because items ran out
      unless $game_party.item_can_use?(@item.id)
        # Remake item window contents
        @item_window.refresh
      end
      # Erase target window
      @item_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # If items are used up
      if $game_party.item_number(@item.id) == 0
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # If target is all
      if @target_window.index == -1
        # Apply item effects to entire party
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
      # If single target
      if @target_window.index >= 0
        # Apply item use effects to target actor
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
      # If an item was used
      if used
        # Play item use SE
        $game_system.se_play(@item.menu_se)
        # If consumable
        if @item.consumable
          # Decrease used items by 1
          $game_party.lose_item(@item.id, 1)
          # Redraw item window item
          @item_window.draw_item(@item_window.index)
        end
        # Remake target window contents
        @target_window.refresh
        # If all party members are dead
        if $game_party.all_dead?
          # Switch to game over screen
          $scene = Scene_Gameover.new
          return
        end
        # If common event ID is valid
        if @item.common_event_id > 0
          # Common event call reservation
          $game_temp.common_event_id = @item.common_event_id
          # Switch to map screen
          $scene = Scene_Map.new
          return
        end
      end
      # If item wasn't used
      unless used
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end
[/spoiler]

EDIT: Never mind, I worked out a way around the problem.