Main Menu
  • Welcome to The RPG Maker Resource Kit.

[VXA] Fix Picture to Map

Started by modern algebra, January 07, 2012, 07:08:33 PM

0 Members and 1 Guest are viewing this topic.

modern algebra

Fix Picture to Map
Version: 1.0.2
Author: modern algebra
Date: 8 September, 2012

Version History




  • <Version 1.0.2> 2012.09.08 - Fixed a bug where fixed pictures would reset when transitioning to a new scene
  • <Version 1.0a> 2012.02.24 - Added a feature to identify fixed pictures in their name
  • <Version 1.0> 2012.01.07 - Original Release

Description



This allows you to set the position of a picture by the X and Y position of the map, rather than the screen, so that the picture won't move with you when the screen scrolls. Additionally, the script lets you set the Z value  to show below characters, or even below the tiles or below the parallax.

This script has no effect in battle and pictures there behave normally.

Also note that this script does not accomodate well for looping maps. If the picture is set such that it overlaps the end of the map, it will not work.

Features


  • Allows you to fix a picture to a position on the map, rather than with reference to the screen
  • Can change the z value of pictures, so that they don't have to show above everything. For instance, you can set it so that a picture shows below the parallax, or in between the parallax and the tilemap, or above ground tiles but below star tiles and characters, or above characters with normal priority but below characters with "Above Characters" priority; etc...
  • Useful for parallax mapping, as you can use pictures as additional map layers wherever you need them to be.

Screenshots

Not really screenshot material - all that happens is that you can turn on a switch which makes it so pictures are positioned with reference to the tilemap rather than the screen.

Instructions

Paste this script into its own slot in the Script Editor, above Main but below Materials.

To use this script, you must first set which in-game switches and variables you will use to control the various features of the script. There are two switches and one variable. When you turn the first switch on in-game, then any pictures shown while it is ON will be fixed to the map and will not follow the screen. When the second switch is ON, then that permits you to use grid coordinates when setting the position of pictures that are fixed to the map. The variable determines the vertical position of the picture (ie - what things show above it and what things show below it).

Alternatively, you can identify some pictures as permanently fixed by including the code: [Fixed] in the picture's name. The value of the switch will be irrelevant in that case and the picture will always be fixed.

Please read the instructions in the header of the script very carefully, as it explains this in more detail. If you have any questions, please feel free to ask it in this topic.

Script




#==============================================================================
#    Fix Picture to Map
#    Version: 1.0.2 [VXA]
#    Author: modern algebra (rmrk.net)
#    Date: 8 September, 2012
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Description:
#
#    This allows you to set the position of a picture by the X and Y position
#   of the map, rather than the screen, so that the picture won't move with you
#   when the screen scrolls. Additionally, the script lets you set the Z value
#   to show below characters, or even below the tiles or below the parallax.
#
#    This script has no effect in battle and pictures there behave normally.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Instructions:
#
#    Paste this script into its own slot in the Script Editor, above Main but
#   below Materials.
#
#    To specify that a picture should be fixed to a map and not follow the
#   screen, all you need to do is turn an in-game switch on before showing the
#   picture. To specify which switch, all you need to do is change the value of
#   SWITCH_ID at line 60. Alternatively, you can include the code [Fixed]
#   somewhere in the name of the picture.
#
#    For the fixed pictures, you also have the option of assigning it to grid
#   coordinates instead of pixel coordinates. This means that if you wanted it
#   to show up at (3, 5) in the map, you could set it to that directly instead
#   of (96, 160). You can turn on this feature using another switch, again one
#   which you choose by changing the value of COORDINATES_SWITCH_ID at line 63.
#
#    To specify the layer of the tilemap (what shows above it and what shows
#   below it), all you need to do is change the value of a variable. Which
#   variable is also specifed by you by changing Z_VARIABLE_ID at line 69.
#   The value to which that in-game variable is set at the time a picture is
#   shown determines where the picture will show up. If the variable is set to
#   0 then it will be in its normal place; if set to -1, it will show below
#   the tilemap but above the parallax; if set to -2, it will show below the
#   parallax; if set to 1, it will show above all non-star tiles but star tiles
#   and characters with normal priority; if set to 2, it will show above
#   characters with normal priority but below characters with "Above
#   Characters" priority. If set to any other value, the z value of the picture
#   will be set to that directly.
#==============================================================================

$imported = {} unless $imported
$imported[:MA_FixPictureToMap] = true

#==============================================================================
# *** MA_FixPicture
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This module holds some relevant configuration Data
#==============================================================================

module MA_FixPicture
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  #  Editable Region
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #  SWITCH_ID - set this to the ID of the in-game switch that you want to
  # use to control whether pictures should be fixed.
  SWITCH_ID = 2
  #  COORDINATES_SWITCH_ID - Set this to the ID of the in-game switch that you
  # want to use to control how coordinates are set. If this switch is ON, then
  # for fixed pictures, you can just use the grid x and y coordinates (ie: you
  # would set (1, 4) instead of (32, 128). If you always want this feature to
  # be on when the FPM Switch is on, you can set it to have the same ID.
  COORDINATES_SWITCH_ID = 2
  #  Z_VARIABLE_ID - set this to the ID of the in-game variable that you
  # want to use to control the z-value priority of the picture.
  Z_VARIABLE_ID = 3
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #  End Editable Region
  #////////////////////////////////////////////////////////////////////////////
  class << self
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Public Instance Variables
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    attr_accessor :spriteset_vp1
    attr_accessor :spriteset_vp2
  end
end
#==============================================================================
# ** Game Picture
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new public instance variables - mafpm_vp_id; mafpm_fixed; mafpm_z
#    aliased method - initialize; show; move
#==============================================================================

class Game_Picture
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_accessor :mafpm_vp_id
  attr_accessor :mafpm_fixed
  attr_accessor :mafpm_z
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mafpm_iniz_2fg6 initialize
  def initialize(*args, &block)
    @mafpm_fixed = false
    @mafpm_vp_id = 2
    mafpm_iniz_2fg6(*args, &block) # Call Original Method
    @mafpm_z = self.number
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Show Picture
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mafpm_showpic_3jb7 show
  def show(name, *args, &block)
    # Only fix pictures if in Scene_Map
    if SceneManager.scene_is?(Scene_Map)
      @mafpm_fixed = (MA_FixPicture::SWITCH_ID == true ||
        $game_switches[MA_FixPicture::SWITCH_ID] || !name[/\[FIXED\]/i].nil?)
      z_var = $game_variables[MA_FixPicture::Z_VARIABLE_ID]
      # If 0 or less than 300, then it should belong to the viewport1
      @mafpm_vp_id = (z_var != 0 && z_var < 300) ? 1 : 2
      # Set Z shortcuts
      @mafpm_z = case z_var
      when -1 then -50         # Below tilemap but above parallax
      when -2 then -150        # Below parallax
      when 0 then self.number  # Normal position
      when 1 then 50           # Above tilemap but below normal characters
      when 2 then 150          # Above normal characters but below Above Characters
      else
        @mafpm_z = z_var < 300 ? z_var : z_var - 300 # Directly set to value
      end
    end
    mafpm_showpic_3jb7(name, *args, &block) # Call Original Method
    if @mafpm_fixed && (MA_FixPicture::COORDINATES_SWITCH_ID == true || $game_switches[MA_FixPicture::COORDINATES_SWITCH_ID])
      @x *= 32
      @y *= 32
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Move Picture
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mafpm_movepctr_2js1 move
  def move(*args, &block)
    mafpm_movepctr_2js1(*args, &block)
    if @mafpm_fixed && (MA_FixPicture::COORDINATES_SWITCH_ID == true || $game_switches[MA_FixPicture::COORDINATES_SWITCH_ID])
      @target_x *= 32
      @target_y *= 32
    end
  end
end

#==============================================================================
# ** Sprite Picture
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased methods - update
#==============================================================================

class Sprite_Picture
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Frame Update
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mafpm_updt_5fw1 update
  def update(*args, &block)
    mafpm_updt_5fw1(*args, &block) # Call original method
    # If picture is fixed to map
    if @picture.mafpm_fixed
      # Scroll the picture appropriately
      self.x = @picture.x - ($game_map.display_x * 32)
      self.y = @picture.y - ($game_map.display_y * 32)
    end
    self.z = @picture.mafpm_z # Update Z to the correct Z
    # If the viewport has changed
    if @mafpm_vp_id != @picture.mafpm_vp_id && MA_FixPicture.send(:"spriteset_vp#{@picture.mafpm_vp_id}")
      @mafpm_vp_id = @picture.mafpm_vp_id
      # Change viewport
      self.viewport = MA_FixPicture.send(:"spriteset_vp#{@mafpm_vp_id}")
    end
  end
end

#==============================================================================
# ** Spriteset Map
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased methods - create_viewports; dispose_viewports
#==============================================================================

class Spriteset_Map
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Create Viewports
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mafpm_creatviewpor_3dk8 create_viewports
  def create_viewports(*args, &block)
    mafpm_creatviewpor_3dk8(*args, &block) # Call original method
    # Set the viewports to be globally accessible
    MA_FixPicture.spriteset_vp1 = @viewport1
    MA_FixPicture.spriteset_vp2 = @viewport2
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Dispose Viewports
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mafpm_disposevps_2nr5 dispose_viewports
  def dispose_viewports(*args, &block)
    # Nullify the variables in MA_FixPicture
    MA_FixPicture.spriteset_vp1 = nil
    MA_FixPicture.spriteset_vp2 = nil
    mafpm_disposevps_2nr5(*args, &block) # Call original method
  end
end


Credit




  • modern algebra

Support



Please post in this topic at RMRK for support or to report any errors.

Winterfell

Thanks you for this script ! I have a question about it. The Z_VARIABLE_ID concern all the pictures ? Or it's possible to assign different z-value for different pictures ?

modern algebra

Yeah, it is possible to assign different z-values for every picture. What the Z_VARIABLE_ID does is assign one in-game variable to control the z-value, and whatever the value of that variable when a new picture is displayed will be the z-value of that picture.

In other words, if you set the Z_VARIABLE_ID to 5, for example, and do the following event:

Control Variable: [0005: Picture Z] = 2
Display Picture: 1, "whatever"
Control Variable: [0005: Picture Z] = -1
Display Picture: 2, "whatever"
Control Variable: [0005: Picture Z] = 0
Display Picture: 3, "whatever"

Picture 1 would show above everything but characters set to "Above Characters" priority. Picture 2 would show below the tilemap but above the parallax. Picture 3 would show up in its regular picture space (above everything but the weather).


Also, that feature is independent from the Fix Pictures feature, so you can change the z-values of pictures that follow the screen as well.

Winterfell

Amazing ! This fix a lot of problems and add new features with parallax mapping ! Thanks you for the explanations ^^

yuyu!

Wow, this looks cool! You are the founding father of the VXA scripts in my books!

Terrible history jokes. I'm sorry haha. :)

[Spoiler=My Games and Art]
ℒℴѵℯ❤


My Artwork Thread

The Lhuvia Tales [Current]

Ambassador [Complete]

The Postman [Complete]

The Wyvern [Complete]

Phoenix Wright: Haunted Turnabout [Complete]

Major Arcana [Cancelled]

[/Spoiler]

Balduino

I have a problem, try to realize it with Z_VARIABLE_ID but it me does not work. I continue the steps that you say but it continues without working.
Can upload  a DEMO please?

modern algebra

I will upload a demo once the English version of VXA is released, but in the meantime, perhaps you could tell me what you're having trouble with?

The one comment I will make is that Z_VARIABLE_ID actually refers to an in-game variable ID, so modifying that does not, by itself, change the priority of the picture. Rather, it is the value of the variable it references that you must change.

In other words, let's say you have Z_VARIABLE_ID set to 1. If you want to show a picture below the tilemap but above the parallax, then your event would look like this:

@>Control Variable: Variable 1 = -1
@>Show Picture

Balduino

Resolved! Thanks for the help and patience

Nessiah

Hello MA, is it possible to make some picture numbers unaffected by Picture Stick?

For example, I have waterfalls animated via waters and is on picture stick, but at the same time I'm using a cave/lantern vision type of image and that is affected too :(

Normally, events would've worked but sadly, I found some critical bug in VXA that has...inconsistent loading of events destroying the whole animation.


modern algebra

#9
Hmm, well it's supposed to be the value of the FPM switch at the time the picture is shown which governs.

So, if SWITCH_ID is equal to 34, then the following event:

@>Switch Operation: [0034: Fix Picture] = ON
@>Display Picture: 1, 'Waterfall', Upper Left(32, 64), (100%, 100%), 255, Normal
@>Switch Operation: [0034: Fix Picture] = OFF
@>Display Picture: 2, 'Lantern', Upper Left(0, 0), (100%, 100%), 255, Normal

That ought to make it so that the Waterfall picture is fixed to the map, while the Lantern picture is not. I don't know how you're animating the pictures, but as long as the switch is set correctly whenever a picture is being displayed, then the Lantern picture should not be fixed and the Waterfall picture should be. If that isn't happening then there is an error in the script, so could you upload a new project with the error recreated?

Nessiah

#10
Yeah we did something similar to that, it's a weird fix but it'll be okay I guess?
You see, what I did before is that the lantern is a common event that is called by a switch. That way I don't have to copy paste it in every map. But the situation calls for this <:3c

The waterfalls animate nicely, it's just that the lantern doesn't follow the player anymore because it's "picture stick'd" It'll be nice if images that have [fixed] over them are the only ones who get stick but...yeah...


^^This one works nicely :D


modern algebra

Well, I never thought that to be such a problem, since it is not difficult to flip a switch before showing a picture, considering that pictures can only be shown through eventing in any case. Besides, I don't think it's very clean to require such things.

However, it's not hard to add the requested feature in, so I did and updated the script to 1.0a. Please get the script from the first post. It is supplemental to the default procedure of using a switch, so you don't need to go through your project and change all the Show Picture commands, but going forward, you can just add [Fixed] anywhere in the name of a picture and it will be automatically fixed to the map.

I have not tested it at all, but I think it should be fine.

Nessiah

Thank you very much MA! It works awesomely and makes my eventing life easier ;v;)/


wandererwillow

I know this is two months old but I just found this and am wanting to use this to allow for building placement in a city-building portion of an RPG.  Sadly, I can't seem to find a z-variable that doesn't go over the character, but at the same time doesn't go under the tileset.  I would prefer to not have to fully use events to make this work, as I found a way to keep the player from going where the buildings eventually will be, so I was ecstatic to find this script.  Here's hoping you guys have an answer!

modern algebra

It doesn't work if you set it to 1?

Also, recall that what you set in the script is only the ID of the in-game variable which controls the Z for pictures. Ie, if you have this in the script:


  #  Z_VARIABLE_ID - set this to the ID of the in-game variable that you
  # want to use to control the z-value priority of the picture.
  Z_VARIABLE_ID = 3


Then when you show the picture you need to do:

@>Variable Operation: [0003: Fix Picture Z] = 1
@>Display Picture: 1, 'Houses', Upper Left(32, 64), (100%, 100%), 255, Normal

wandererwillow

#15
If I set it to 1, it seems to only appear if the entire picture would be on screen.  The moment a pixel goes off, it disappears.  I'll try a fully new build, see if that works, and if it doesn't, I'll post a demo and maybe you can see if I'm doing something wrong.

EDIT:  Just tested it again in a fresh build, if any of the picture goes off screen, it disappears completely.  However, my character does still stay above it, so that in and of itself works.  It stays on the map just fine when it's at any other number, but at 1 it just disappears.

modern algebra

Maybe recreate the error in a fresh project and share it so that I can see what you mean. That doesn't happen when I try it out.

wandererwillow

http://www.mediafire.com/?iau73fmhv773c2r

That's the fresh, new project file.  Still happens every time.

The event is nothing more than:
@>Control Switches: [0002] = ON
@>Control Variables: [0003] = 1
@>Show Picture: 1, 'house1', Upper Left (5, 1), (100%,100%), 255, Normal

The script is unmodified, I left it exactly as is.

Hope we can find some sort of answer because I'd love to include this into my game.  Always been a huge fan of city-building elements and this would be perfect to use for that.  Thanks!

modern algebra

Alright, I see what you mean. As soon as I get a chance, I will look into the problem and fix it.

wandererwillow

You're a godsend.  Thank you!

Zylos

#20
Okay, I noticed something very weird happening when calling a menubase script. I recently made a simple map script branching off of the Scene_MenuBase, but found that calling the script while a fixed picture was in use would temporarily reposition the picture to screen coordinates instead (I think it's the screen ones, anyway) for use in the background bitmap. At first I thought it was an error with my script, but I tested it with a few others and found that it did the same thing for other default scripts, such as calling the name input script for example.

I can probably rewrite my script to branch off of the scene_base instead, it's a simple enough script. But I figured I'd point out the unusual glitch first to see if you have any thoughts.


Edit: I take it back, it's still giving me that bug even though I changed it around to being a scene_base script.




Zylos

Okay, I think I found a fix for my particular scenario, but I'm not exactly as script savvy as MA is and have no idea what other consequences there might be. Down in the frame update of Sprite_Picture, I simply disabled it from checking whether it's Scene_Map or not and to display the picture in the selected coordinates regardless. I have no idea why it was put in there in the first place though, hence I'm leary about having changed it despite not seeing any issues yet.

MA, would doing what I did cause any problems that you can think of? Again, I'm not sure of whether it was really necessary to check if it was on Scene_Map or not.




modern algebra

No, it's not a big deal. I had just put it in since I didn't anticipate you would need to fix pictures in other scenes (like in Scene_Battle), and it would be wasteful to do the calculations. I suppose it is not a useful restriction thinking about it now.

Zylos

Fair enough. It's mostly just the strange "split moment" instance where it's out of place during the scene transition and in the background bitmap, but then reverts itself when the scene changes back.




gameon47

Could I use this script for free in a commercial RPG Maker VXA Game what I want to sell?