class PictureSprite < SpriteWrapper def initialize(viewport, picture) super(viewport) @picture = picture @pictureBitmap = nil @customBitmap = nil @customBitmapIsBitmap = true @hue = 0 update end def dispose @pictureBitmap.dispose if @pictureBitmap super end # Doesn't free the bitmap def setCustomBitmap(bitmap) @customBitmap = bitmap @customBitmapIsBitmap = @customBitmap.is_a?(Bitmap) end def update super @pictureBitmap.update if @pictureBitmap # If picture file name is different from current one if @customBitmap && @picture.name == "" self.bitmap = (@customBitmapIsBitmap) ? @customBitmap : @customBitmap.bitmap elsif @picture_name != @picture.name || @picture.hue.to_i != @hue.to_i # Remember file name to instance variables @picture_name = @picture.name @hue = @picture.hue.to_i # If file name is not empty if @picture_name == "" @pictureBitmap.dispose if @pictureBitmap @pictureBitmap = nil self.visible = false return end # Get picture graphic @pictureBitmap.dispose if @pictureBitmap @pictureBitmap = AnimatedBitmap.new(@picture_name, @hue) self.bitmap = (@pictureBitmap) ? @pictureBitmap.bitmap : nil elsif @picture_name == "" # Set sprite to invisible self.visible = false return end setPictureSprite(self, @picture) end end def pbTextBitmap(text, maxwidth = Graphics.width) tmp = Bitmap.new(maxwidth, Graphics.height) pbSetSystemFont(tmp) drawFormattedTextEx(tmp, 0, 0, maxwidth, text, Color.new(248, 248, 248), Color.new(168, 184, 184)) return tmp end #=============================================================================== # EventScene #=============================================================================== class EventScene attr_accessor :onCTrigger, :onBTrigger, :onUpdate def initialize(viewport = nil) @viewport = viewport @onCTrigger = Event.new @onBTrigger = Event.new @onUpdate = Event.new @pictures = [] @picturesprites = [] @usersprites = [] @disposed = false end def dispose return if disposed? for sprite in @picturesprites sprite.dispose end for sprite in @usersprites sprite.dispose end @onCTrigger.clear @onBTrigger.clear @onUpdate.clear @pictures.clear @picturesprites.clear @usersprites.clear @disposed = true end def disposed? return @disposed end def addBitmap(x, y, bitmap) # _bitmap_ can be a Bitmap or an AnimatedBitmap # (update method isn't called if it's animated) # EventScene doesn't take ownership of the passed-in bitmap num = @pictures.length picture = PictureEx.new(num) picture.setXY(0, x, y) picture.setVisible(0, true) @pictures[num] = picture @picturesprites[num] = PictureSprite.new(@viewport, picture) @picturesprites[num].setCustomBitmap(bitmap) return picture end def addLabel(x, y, width, text) addBitmap(x, y, pbTextBitmap(text, width)) end def addImage(x, y, name) num = @pictures.length picture = PictureEx.new(num) picture.name = name picture.setXY(0, x, y) picture.setVisible(0, true) @pictures[num] = picture @picturesprites[num] = PictureSprite.new(@viewport, picture) return picture end def addUserSprite(sprite) @usersprites.push(sprite) end def getPicture(num) return @pictures[num] end def wait(frames) frames.times { update } end def pictureWait(extraframes = 0) loop do hasRunning = false for pic in @pictures hasRunning = true if pic.running? end break if !hasRunning update end extraframes.times { update } end def update return if disposed? Graphics.update Input.update for picture in @pictures picture.update end for sprite in @picturesprites sprite.update end for sprite in @usersprites next if !sprite || sprite.disposed? || !sprite.is_a?(Sprite) sprite.update end @onUpdate.trigger(self) if Input.trigger?(Input::BACK) @onBTrigger.trigger(self) elsif Input.trigger?(Input::USE) @onCTrigger.trigger(self) end end def main while !disposed? update end end end #=============================================================================== # #=============================================================================== def pbEventScreen(cls) pbFadeOutIn { viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) viewport.z = 99999 PBDebug.logonerr { cls.new(viewport).main } viewport.dispose } end