Jump to content
UncannyBoots

Changing z value of player so that sprite doesn't overlay adjacent events

Recommended Posts

I asked in my status about this but the solution is beyond whatever minimal scripting ability I have. I was going to link the status update here but it doesn't seem like I can lol but it's easy to find by clicking onto my profile. The status update is " Wish I knew how to change the z value of the player or of events. Anyone have any ideas?"

 

I was just going to let it go but then I remembered that there has already been made a similar script that fixes the way star tiles work with large sprites:

##-----------------------------------------------------------------------------
#  Large Sprite ☆ Display Fix v1.3
#  Created by Neon Black at request of seita
#  v1.4 - 12.18.14 - Added position tuning
#  v1.3 - 1.12.14  - Viewport/position issue fixes
#  v1.1 - 8.18.13  - Fixed an odd lag issue
#  v1.0 - 8.17.13  - Main script completed
#  For both commercial and non-commercial use as long as credit is given to
#  Neon Black and any additional authors.  Licensed under Creative Commons
#  CC BY 4.0 - http://creativecommons.org/licenses/by/4.0/
##-----------------------------------------------------------------------------
 
##------
## By default, this script only affects the player.  To allow it to affect
## an event page as well, add a comment with the tag <large sprite> to the page
## of the event you would like to have affected by this.
 
class Sprite_Character < Sprite_Base
  ##------
  ## The ID of the terrain used to display the large character above ☆ tiles.
  ## If the player is below this tile (y position), the sprite will appear
  ## above all tiles and events from that y position up.  If the player is on
  ## the same tile or above (y position) the event will appear BELOW ☆ tiles
  ## from that position up.
  ##------
  UpperTerrain = 1
 
  ##------
  ## This value is the pixel tuning used to check the location.  This is
  ## because characters tagged with a '!' in their name are drawn lower than
  ## normal characters and are considered to be lower than these.  This causes
  ## the script to think they are on the tile below where they really are and
  ## draw them above tiles they should appear under.
  ##------
  Tuning = -1
 
  alias :cp_011214_update_bitmap :update_bitmap
  def update_bitmap(*args)
    if graphic_changed? && @set_upper_area_sprite
      @force_no_gfx_change = true
    else
      @force_no_gfx_change = false
    end
    cp_011214_update_bitmap(*args)
  end
 
  ## Alias the update method to add in the new graphic check.
  alias :cp_073013_update_pos :update_position
  def update_position(*args)
    cp_073013_update_pos(*args)
    check_encompassed_area if sprite_is_onscreen?
  end
 
  ## Alias the dispose to dispose the upper sprite.
  alias :cp_073013_dispose :dispose
  def dispose(*args)
    @upper_area_sprite.dispose if @upper_area_sprite
    cp_073013_dispose(*args)
  end
 
#~   ## Alias the graphic changed method to allow the sprite to revent to what it
#~   ## was during the last frame.  This allows the check to work again.
#~   alias :cp_073013_graphic_changed? :graphic_changed?
#~   def graphic_changed?(*args)
#~     cp_073013_graphic_changed?(*args) || @set_upper_area_sprite
#~   end
 
  ## Check if the sprite is onscreen.  Reduces redundant drawing.
  def sprite_is_onscreen?
    return false if @character.is_a?(Game_Vehicle) || @character.is_a?(Game_Follower)
    return false unless @character.is_a?(Game_Player) || @character.large_sprite
    return false if @character.screen_z >= 200
    top_left, bot_right = get_edge_corner_dis
    return false if top_left[0] > Graphics.width
    return false if top_left[1] > Graphics.height
    return false if bot_right[0] < 0
    return false if bot_right[1] < 0
    return true
  end
 
  ## Get the top left and bottom right positions.
  def get_edge_corner_dis
    top_left = [self.x - self.ox, self.y - self.oy]
    bot_right = [top_left[0] + self.width, top_left[1] + self.height]
    return [top_left, bot_right]
  end
 
  ## Long method that checks each position and draws the upper sprite.
  def check_encompassed_area
    if @set_upper_area_sprite && !@force_no_gfx_change
      old_src = self.src_rect.clone
      self.bitmap = @old_bitmap
      self.src_rect = old_src
    end
    @set_upper_area_sprite = false
    top_left, bot_right = get_edge_corner_dis
    last_x, last_y, copy_region = nil, nil, 0
    map_xd, map_yd = $game_map.display_x * 32, $game_map.display_y * 32
    total_height = (self.height + @character.jump_height).round
    self.width.times do |x|
      xp = map_xd.to_i + top_left[0] + x
      unless xp / 32 == last_x
        last_x = xp / 32
        last_y, copy_region = nil, 0
        total_height.times do |y|
          yp = map_yd.to_i + bot_right[1] + @character.jump_height - y + Tuning
          next if yp.to_i / 32 == last_y
          last_y = yp.to_i / 32
          if last_y == (@character.screen_y + @character.jump_height + Tuning +
                        map_yd).to_i / 32
            break if $game_map.terrain_tag(last_x, last_y) == UpperTerrain
            next
          end
          next if $game_map.terrain_tag(last_x, last_y) != UpperTerrain
          copy_region = [self.height, total_height - y + 1].min
          set_upper_sprite
          break
        end
      end
      next if copy_region == 0
      rect = Rect.new(src_rect.x + x, src_rect.y, 1, copy_region)
      @upper_area_sprite.bitmap.blt(x, 0, self.bitmap, rect)
      self.bitmap.clear_rect(rect)
    end
    if !@set_upper_area_sprite && @upper_area_sprite
      @upper_area_sprite.visible = false
    end
  end
 
  ## Creates the upper sprite that's a copy of the current sprite.
  def set_upper_sprite
    return if @set_upper_area_sprite
    @upper_area_sprite ||= Sprite.new
    @upper_area_sprite.bitmap = Bitmap.new(self.width, self.height)
    props = ["x", "y", "ox", "oy", "zoom_x", "zoom_y", "angle", "mirror",
             "bush_depth", "opacity", "blend_type", "color", "tone", "visible",
             "viewport"]
    props.each do |meth|
      @upper_area_sprite.method("#{meth}=").call(self.method(meth).call)
    end
    @upper_area_sprite.z = 200
    @set_upper_area_sprite = true
    @old_bitmap, old_src_rect = self.bitmap, self.src_rect.clone
    self.bitmap = Bitmap.new(@old_bitmap.width, @old_bitmap.height)
    self.bitmap.blt(0, 0, @old_bitmap, @old_bitmap.rect)
    self.src_rect = old_src_rect
  end
end
 
class Game_Event < Game_Character
  attr_reader :large_sprite
 
  alias :cp_081713_setup_page_settings :setup_page_settings
  def setup_page_settings(*args)
    cp_081713_setup_page_settings(*args)
    get_large_sprite_conditions
  end
 
  def get_large_sprite_conditions
    @large_sprite = true
    return if @list.nil? || @list.empty?
    @list.each do |line|
      next unless line.code == 108 || line.code == 408
      case line.parameters[0]
      when /<large sprite>/i
        @large_sprite = true
      end
    end
  end

    end

 

I was wondering, then, if this could be a basis for a new script that fixes large sprites going over adjacent events?

Keep in mind that I am no programmer. If I was I probably wouldn't have been so drawn to using RPG Maker :P

 

Edited by UncannyBoots

Share this post


Link to post
Share on other sites

Sorry I couldn't help you much on the status. Speaking of, here is a link to it! It seems you can link to a status by clicking the date on the feed or something.

 

Anyway, I think I was going to mention something about something like this in the status, but I didn't want to make things too complicated. Basically, there is another way to get around the limits about how z values work. It's pretty much just as if not more of a pain in the neck to do, but it's an option! And that option is basically creating sprites for different parts of the big sprite that are touching different tiles. That's basically what that script does, only I think it creates sprite copies of the tiles the big sprite is touching so some can go over the big sprite's head, where as what you want is more to split the big sprite up into different sprites with different z value.

 

Closest thing I did to that kind of thing was a script to add a silhouette if a sprite is behind a tile (so if an item or monster ends up behind treetops or something it can sill be seen). It felt like a hella complicated script at the time, and I was assuming one tile wide sprites since that means figuring out what tiles the character is touching is pretty simple. For big sprites, I feel like it would be a lot more complicated.

Share this post


Link to post
Share on other sites
15 hours ago, Kayzee said:

Sorry I couldn't help you much on the status. Speaking of, here is a link to it! It seems you can link to a status by clicking the date on the feed or something.

 

Anyway, I think I was going to mention something about something like this in the status, but I didn't want to make things too complicated. Basically, there is another way to get around the limits about how z values work. It's pretty much just as if not more of a pain in the neck to do, but it's an option! And that option is basically creating sprites for different parts of the big sprite that are touching different tiles. That's basically what that script does, only I think it creates sprite copies of the tiles the big sprite is touching so some can go over the big sprite's head, where as what you want is more to split the big sprite up into different sprites with different z value.

 

Closest thing I did to that kind of thing was a script to add a silhouette if a sprite is behind a tile (so if an item or monster ends up behind treetops or something it can sill be seen). It felt like a hella complicated script at the time, and I was assuming one tile wide sprites since that means figuring out what tiles the character is touching is pretty simple. For big sprites, I feel like it would be a lot more complicated.

 

You were a help, if you didn't help me I never would have realized that changing the z value would make it so that the large sprite's head would also go under the event. It seems obvious now but yeah I totally didn't realize that at the time.

While this issue isn't some game breaking issue, it is very immersion breaking. I don't want to give away too much about my game (I dunno if I will release my game under this name "Uncannyboots" or not) but my character rides a motorcycle, and when he pulls up next to another character, the front wheel of the bike goes over the waist area of the event graphic. It looks really bad and unprofessional. I could definitely come back to this issue further down the line but I thought I'd ask just in case someone knew how to write the script. Your theory is definitely a good starting point, so thank you!

Edited by UncannyBoots

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×