Hi, I have a problem that apparently no one can solve...
I use character larger than 32x32...
When using tileset with ☆, this happens:
http://imgur.com/C5gb52BAnd this, my tileset setting:
http://imgur.com/8rkvJ3aand terrain tag:
http://imgur.com/57LZcESThe terrain tag is 6 beacuse I use this script:
##-----------------------------------------------------------------------------
# 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 = 6
##------
## 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 = false
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
But the problem is not solved...
I also tried to use this script:
=begin
#==============================================================================
# OZ OverTiles
#==============================================================================
Solves the problem when using character overworld sprites bigger than 32x32.
CHANGELOG
1.00 Initial release.
1.01 Performance increase, fixed an issue with the process_data method.
1.02 Fixed a bug with looping maps.
=end
class Game_CharacterBase
def simple_screen_y
($game_map.adjust_y(@real_y) * 32) + 32
#((@real_y - $game_map.display_y) * 32) + 32
end
def screen_z
simple_screen_y.to_i + (@priority_type * 100)+100
end
end
#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
# This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# * Create Tilemap
#--------------------------------------------------------------------------
alias ozot_create_tilemap create_tilemap
def create_tilemap
ozot_create_tilemap
process_mapdata
@spr_over = Spriteset_OverMap.new(@over_data,@tilemap.bitmaps,@viewport1)
end
#~ #--------------------------------------------------------------------------
#~ # * Create Airship Shadow Sprite (you can try and mess up with this, I don't want to :V
#~ #--------------------------------------------------------------------------
#~ def create_shadow
#~ @shadow_sprite = Sprite.new(@viewport1)
#~ @shadow_sprite.bitmap = Cache.system("Shadow")
#~ @shadow_sprite.ox = @shadow_sprite.bitmap.width / 2
#~ @shadow_sprite.oy = @shadow_sprite.bitmap.height
#~ @shadow_sprite.z = 180
#~ end
#--------------------------------------------------------------------------
# * Free
#--------------------------------------------------------------------------
alias ozot_dispose dispose
def dispose
ozot_dispose
@spr_over.dispose
end
#--------------------------------------------------------------------------
# * Update Tilemap
#--------------------------------------------------------------------------
alias ozot_update_tilemap update_tilemap
def update_tilemap
ozot_update_tilemap
refresh_sprover if refresh_sprover?
#@spr_over.refresh
@spr_over.update
end
def refresh_sprover?
return @gm_bck != $game_map.data
end
def refresh_sprover
process_mapdata
@spr_over.map_data = @over_data
@spr_over.bitmaps = @tilemap.bitmaps
@spr_over.refresh
end
def process_mapdata
@gm_bck = $game_map.data
@over_data = $game_map.data.dup
@over_data.xsize.times{|x|
@over_data.ysize.times{|y|
flag = $game_map.tileset.flags[$game_map.data[x, y, 2]]
# [?]: No effect on passage
if (flag & 0x10 == 0) && ($game_map.data[x, y, 2] != 0)
@over_data[x, y, 2] = 0
#elsif (flag & 0x10 != 0) && ($game_map.data[x, y, 2] != 0)
# $game_map.data[x, y, 2] = 0
#p @over_data[x, y, 2]
end
}
}
end
end
class Spriteset_OverMap
attr_accessor :bitmaps
def initialize(map_data,bitmaps,viewport)
@map_data = map_data
@bitmaps = bitmaps
@vport = viewport
#create sprites
create_sprites
refresh
end
def map_data=(n)
@map_data = n
end
def vport=(n)
@vport=n
@sprites.each{|s| s.viewport=@vport}
end
def vport
@vport
end
def create_sprites
h_size = (Graphics.height/32) + 2
@sprites = Array.new(h_size) {|i|
s = Sprite.new(@vport); s.y = (i*32)
s.bitmap = Bitmap.new(Graphics.width+64,32)
s.ox = s.oy = 32 ; s.z = s.y.to_i+200
s
}
end
def update
#update sprites, refresh if necessary
update_sprites
refresh if need_refresh?
end
def update_sprites
dx= $game_map.display_x * 32
dx= dx>0 ? dx%32 : dx%-32
dy= $game_map.display_y * 32
dy= dy>0 ? dy%32 : dy%-32
@sprites.each_with_index{|s,i|
s.x = -dx
s.y = (i*32)-dy
s.z = s.y.to_i+200
s.update
}
end
def refresh
@actual_ox = ($game_map.display_x)
@actual_oy = ($game_map.display_y)
@map_data
@sprites.size.times{|y|
yy=@actual_oy+y-1
yy=(yy%$game_map.height)
next if (yy==-1)
t = (Graphics.width+64)/32
@sprites[y].bitmap.clear
t.times{|x|
xx = @actual_ox+x-1
xx=(xx%$game_map.width)
id = @map_data[xx,yy,2]
next if id==nil
#blit each tile
i=id/256
ii=id%256
b=@bitmaps[i+5]
off= ii>127 ? 256 : 0
r=Rect.new( (ii%8*32)+off, ((ii/8)%16)*32, 32,32)
@sprites[y].bitmap.blt(x*32,0,b,r)
}
}
end
def need_refresh?
(@actual_ox != $game_map.display_x) || (@actual_oy != $game_map.display_y)
end
def dispose
#dispose all sprites
@sprites.each{|s| s.dispose; s=nil}
end
end
Does anyone know how to fix it?