class Sprite_WaterBubble
attr_reader :visible
attr_accessor :event
def initialize(sprite,event,viewport=nil)
@rsprite = sprite
@sprite = nil
@event = event
@viewport = viewport
@wateranim=false
@frame = 0
@frames = 4
@totalFrames = 0
@currentIndex = 0
@disposed = false
@bitmapFile=BitmapCache.load_bitmap("Graphics/Pictures/water")
@water=Bitmap.new(@bitmapFile.width,@bitmapFile.height)
@water.blt(0,0,@bitmapFile,Rect.new(0,0,@bitmapFile.width,@bitmapFile.height))
@cws = @water.height*2
@chs = @water.height*2
@[email protected]/@water.height
@animationFrames=@totalFrames*@frames
@loop_points=[0,@totalFrames]
@actualBitmap=Bitmap.new(@cws,@chs)
@actualBitmap.clear
@actualBitmap.stretch_blt(Rect.new(0,0,@cws,@chs),@water,Rect.new(@currentIndex*(@cws/2),0,@cws/2,@chs/2))
update
end
def dispose
if !@disposed
@actualBitmap.dispose if @actualBitmap && [email protected]?
@sprite.dispose if @sprite
@sprite = nil
@disposed = true
@wateranim=false
end
end
def disposed?; @disposed; end
def createWaterAnim(x2,y2)
return if @wateranim
@sprite=Sprite.new(@viewport)
@sprite.bitmap=@actualBitmap
@sprite.x=x2
@sprite.y=y2
pbDayNightTint(@sprite)
@wateranim=true
end
def updateAnim
return if !@wateranim || @sprite && @sprite.disposed?
@frames=4
@frame+=1
if @frame >=@frames
@currentIndex+=1
@currentIndex=@loop_points[0] if @currentIndex >=@loop_points[1]
@currentIndex=@loop_points[1]-1 if @currentIndex < @loop_points[0]
@frame=0
end
@actualBitmap.clear
@actualBitmap.stretch_blt(Rect.new(0,0,@cws,@chs),@water,Rect.new(@currentIndex*(@cws/2),0,@cws/2,@chs/2))
@sprite.bitmap=@actualBitmap
end
def visible=(value); @visible = value; @sprite.visible = value if @sprite && [email protected]?; end
def jump_sprite
return unless @sprite
x = (@event.real_x - @event.map.display_x + 3) / 4 + (Game_Map::TILEWIDTH / 2)
y = (@event.real_y - @event.map.display_y + 3) / 4 + (Game_Map::TILEHEIGHT)
@sprite.x = x
@sprite.y = y
@sprite.z = @rsprite.z
end
def update
return if disposed? || !$scene || !$scene.is_a?(Scene_Map)
return jump_sprite if event.jumping?
if pbGetTerrainTag(event)!=PBTerrain::Beach ||
event.character_name =="" || event.character_name == "nil" ||
event!=$game_player && pbEventCommentInput(event,0,"NoWater") || event.transparent
# Just-in-time disposal of sprite
if @sprite; @sprite.dispose; @sprite = nil; end
return
end
# Just-in-time creation of sprite
@sprite = Sprite.new(@viewport) if !@sprite
if @sprite
cw = @cws; ch = @chs
updateAnim
@wateranim=false if @sprite && @sprite.disposed?
x = @[email protected]; y = @[email protected]
createWaterAnim(x,y)
@sprite.update if @sprite
@sprite.x = @rsprite.x; @sprite.y = @rsprite.y
@sprite.ox = cw/2; @sprite.oy = ch -4
@sprite.z = @rsprite.z
@sprite.zoom_x = @rsprite.zoom_x; @sprite.zoom_y = @rsprite.zoom_y
@sprite.tone = @rsprite.tone
@sprite.color = @rsprite.color
@sprite.opacity = @rsprite.opacity
end
end
end