die mitgelieferten planes können leider nur innerhalb des bereiches dargestellt werden, den das fenster normal abdeckt. das ist selbst dann so, wenn der viewport außerhalb liegt.
die einzige möglichkeit besteht wohl darin, die plane klasse mithilfe von sprites nachzuschreiben.
ich hab das mal gemacht:

Code:
class Plane
  attr_reader :bitmap
  attr_reader :ox
  attr_reader :oy
  attr_reader :z
  attr_reader :zoom_x
  attr_reader :zoom_y
  attr_reader :opacity
  attr_reader :blend_type
  attr_reader :tone
  
  def initialize(viewport=Viewport.new(0,0,480,640))
    @sprites = {}
    @viewport = viewport
    @bitmap = nil
    @z = @ox = @oy = 0
    @zoom_x = @zoom_y = 1.0
    @opacity = 255
    @blend_type = 0
    @tone = Tone.new(0,0,0,0)
    @color = Color.new(0,0,0,0)
  end
  
  def dispose
    @sprites.each{|k,v| v.dispose}
  end
  
  def bitmap=(bit)
    return if @bitmap == bit
    @bitmap = bit
    refresh
  end
  
  def refresh
    bit = @bitmap
    self.dispose
    unless bit.nil?
      for x in 0...((self.width / bit.width * @zoom_x).to_i + 2)
        for y in 0...((self.height / bit.height * @zoom_y).to_i + 2)
          @sprites[[x,y]] = Sprite.new(@viewport)
          @sprites[[x,y]].bitmap = bit
          @sprites[[x,y]].x = x * bit.width * @zoom_x
          @sprites[[x,y]].y = y * bit.height * @zoom_y
          @sprites[[x,y]].zoom_x = @zoom_x
          @sprites[[x,y]].zoom_y = @zoom_y
          @sprites[[x,y]].z = self.z
          @sprites[[x,y]].tone = @tone
          @sprites[[x,y]].blend_type = @blend_type
          @sprites[[x,y]].color = @color
          @sprites[[x,y]].opacity = @opacity
        end
      end
    end
  end
  
  def ox=(n)
    return if @ox == n
    @ox = n
    n = n / @zoom_x
    @sprites.each{|k,v|
    v.ox = n % v.bitmap.width
    }
  end
  
  def oy=(n)
    return if @oy == n
    @oy = n
    n = n / @zoom_y
    @sprites.each{|k,v|
    v.oy = n % v.bitmap.width
    }
  end
  
  def z=(n)
    return if @z == n
    @z = n
    @sprites.each{|k,v|
    v.z = n
    }
  end
  
  def width
    return @viewport.rect.width
  end
  
  def height
    return @viewport.rect.height
  end
  
  def zoom_x=(n)
    return if @zoom_x == n
    @zoom_x = n
    refresh
  end
  
  def zoom_y=(n)
    return if @zoom_y == n
    @zoom_y = n
    refresh
  end
  
  def opacity=(n)
    return if @opacity == n
    @opacity = n
    @sprites.each{|k,v|
    v.opacity = n
    }
  end
  
  def blend_type=(n)
    return if @blend_type == n
    @blend_type = n
    @sprites.each{|k,v|
    v.blend_type = n
    }
  end
  
  def tone=(t)
    return if @tone == t
    @tone = t
    @sprites.each{|k,v|
    v.tone = t
    }
  end
  
  def color=(c)
    return if @color == c
    @color = c
    @sprites.each{|k,v|
    v.color = c
    }
  end
end