collapse collapse

 Community


 User Info




Willkommen Gast. Bitte einloggen oder registrieren.

 Partnerseiten

rpgvx.net

Das Forum ist offline

Autor Thema: Dynamic Lights & Shadows  (Gelesen 766 mal)

Offline GR-FoxDie

  • Event-Jongleur
  • **
  • Beiträge: 52
    • --¯=+Anti Borns Armee+=¯--
Dynamic Lights & Shadows
« am: Januar 21, 2008, 18:28:06 »
Dynamic Lights & Shadows
 Version: 1.5
 
 Features
 Basically the same as Rataime's Shadow script. But!
 
     * Shadows overlay, the system know when to display the shadow or not
     * Possibility to control the source: turn the light on/off, change its direction, make it move
     * Height of objects is handled, no more 1 event per tile for the shadow of a pillar
     * Auto-Screen tint according to the number of lights off
 
 Credits by Trebor777

Spoiler for Hiden:
=begin
 ==============================================================================
  ** Dynamic Light & Shadows
 ------------------------------------------------------------------------------
  Trebor777
  Version 1.5
  16/11/2007
  Version 1.5 is based on Rataime's shadows script,Rewrote the code structure
  and Added extra features
 
 ==============================================================================
 Instructions
 ==============================================================================
 To create a source light:
 Write a comment on 2 lines
   Light
   arg1|arg2|arg3|arg4|arg5
 
 arg1, is the minimum angle.
 arg2, is the maximum angle
 arg3, the distance in pixel covered by the light
 arg4, the height, in tiles where the light is.
 arg5, the direction of the light, use the same numbers as RMXP is using:
 up: 8, right: 6, down: 2, left: 4
 It will turn the event automatically to this direction and
 draw the light according to it, using its min and max angle.
 
 The 0 is always on the left of the direction.
 example,
 the light "look at" the right, so its direction is 6.
 the min angle is 0, so it'll start from the tile above to whatever
  the max angle is, in a clockwise way.
 
 So if you need to create a light, who covers only a cone of 60?, facing to the
 right, at a height of 1 tile, covering a radius of 150pixels:
     Light
     60|120|150|1|6
    
    
 I might do in the future, a simpler version for that.
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
 To have an event with a shadow:
 Write a comment on 2 lines
   Shadow
   arg1
 
 arg1, is the maximum height of the object, so if you have a pillar on your map
 covering several tiles in height, just create a shadow event at its base,
 and give the height of that pillar as arg1.
 
 For characters, just use a height of 0.
 
 To turn off/on a light:
 Use a script call:
 a simple "self.off=true" (to turn off) or "self.off=false" to turn on is needed.
 What is important is where you use this script call:
 
 If the event switching the light is not the same as the source, you need use the
 "call script" command inside the "set move route" command
   (of course, don't forget to say on which event it applies)
 instead of the default "call script" command found on page3.
 
 ==============================================================================
 Configuration
 ==============================================================================
 ==============================================================================
  You probably won't need to touch this : it's the 'map' of how to display the
  shadow depending on the event's direction and his relative position to the
  source. a minus means the shadow is mirrored. It seems complex, and it is.
  Complain to Enterbrain (why didn't they use something clockwise or counter-
  clockwise ? I suspect it's because of the rm2k legacy. More explanations
  below.
 =============================================================================
 =end
 SDK.log('DL&S', "trebor777", 1, "16.11.07")
 if SDK.state('DL&S')
 
 SHADOWS_DIRECTION_ARRAY = Array.new
 SHADOWS_DIRECTION_ARRAY[2] = [ -3, 4, -2, 1 ]
 SHADOWS_DIRECTION_ARRAY[4] = [ 4, -2, 1, -3 ]
 SHADOWS_DIRECTION_ARRAY[6] = [ 1, -3, 4, -2 ]
 SHADOWS_DIRECTION_ARRAY[8] = [ -2, 1, -3, 4 ]
 
 #==============================================================================
 # An important option : if you set it to true, the shadows will get longer if
 # you are far from the source. Nice, but induces lag : it will eat your CPU,
 # and quite possibly your first born if you try that on a big map.
 #==============================================================================
 SHADOW_GETS_LONGER = true
 
 #==============================================================================
 # Misc options
 # If an event has its opacity below SHADOWS_OPACITY_THRESHOLD, no shadow will
 # be displayed.
 # Set SHADOWS_CATERPILLAR_COMPATIBLE to true if you uses the caterpillar script
 #==============================================================================
 SHADOWS_OPACITY_THRESHOLD = 254
 SHADOWS_CATERPILLAR_COMPATIBLE = true
 
 #==============================================================================
 # Class Light
 #==============================================================================
 class Light
   @@lights=[]
   attr_reader :character, :parameters
   #--------------------------------------------------------------------------
   def initialize(viewport,character, param)
     @character = character
     @viewport = viewport
     unless param.nil?
       @parameters = param[0].split('|')
       @anglemin =  @parameters.first.to_i
       @anglemax = @parameters[1].to_i
       @distancemax = @parameters[2].to_i
       @light_height = @parameters[3].to_i
       @base_face_at = @parameters.last.to_i
       @character.direction=@base_face_at
       test = @@lights.find_all{|l| l.character==@character and l.parameters==@parameters}
       if test.size==0
         draw_lights
         update
         @@lights.push(self)
       end
     end
   end
   #--------------------------------------------------------------------------
   def Light.set
     return @@lights
   end
   #--------------------------------------------------------------------------
   def Light.off_size
     result=0
     @@lights.each do |light|
       result+=1 if light.character.off
     end
     return result
   end
   #--------------------------------------------------------------------------
   def dispose
     @s_light.dispose
     @@lights.delete(self)
   end
   #--------------------------------------------------------------------------
   def update
     unless @s_light.nil?
       @s_light.visible=!@character.off
       @s_light.angle=0 if @character.direction==2
       @s_light.angle=-90 if @character.direction==4
       @s_light.angle=180 if @character.direction==8
       @s_light.angle=90 if @character.direction==6
       @s_light.x=@character.screen_x
       @s_light.y=@character.screen_y+32*@light_height
       @s_light.z=@character.screen_z
     end
   end
   #--------------------------------------------------------------------------
   def draw_lights
 
     return if @@lights.include?(self) or (@@lights.find_all{|l| l.character==@character and l.parameters==@parameters}).size>0
    
     radius = @distancemax
     @s_light=Sprite.new(@viewport)
     @s_light.x=@character.screen_x
     @s_light.y=@character.screen_y+32*@light_height
     @s_light.z=@character.screen_z
     @s_light.bitmap=Bitmap.new(radius*2,radius*2)
     @s_light.opacity=90
     @s_light.ox+=radius
     @s_light.oy+=radius
     @s_light.angle=0 if @base_face_at==2
     @s_light.angle=270 if @base_face_at==4
     @s_light.angle=180 if @base_face_at==8
     @s_light.angle=90 if @base_face_at==6
     @s_light.bitmap.draw_pie(radius,radius,radius,Color.new(255,255,100,90),@anglemin, @anglemax)
   end
 end
 #==============================================================================
 # Class shadow
 #==============================================================================
 class Shadow
   attr_accessor :character
   attr_reader :distance, :distancemax, :overlayed
   @@shadows=[]
   #--------------------------------------------------------------------------
   def initialize(viewport,character, param,light)
     @character = character
     @viewport = viewport
     unless param.nil?
       @parameters = param[0].split('|')
       @shadow_max_height = @parameters[1].to_i
       @anglemin=light.parameters[0].to_f
       @anglemax=light.parameters[1].to_f
       @distancemax=light.parameters[2].to_f
       @light_height= light.parameters[3].to_i
       @source = light
       @s_shadow = RPG::Sprite.new(@viewport)
       @s_shadow.color = Color.new(0, 0, 0)
       update
     end
     @@shadows.push(self)
   end
   #--------------------------------------------------------------------------
   def Shadow.set
     return @@shadows
   end
   #--------------------------------------------------------------------------
   def sprite
     return @s_shadow
   end
   #--------------------------------------------------------------------------
   def dispose
     @s_shadow.dispose
     @@shadows.delete(self)
   end
   #--------------------------------------------------------------------------
   def in_light_range?
     return (@distance<=@distancemax)
   end
   #--------------------------------------------------------------------------
   def overlayed?
     @overlayed =  false
     @@shadows.each do |i|
       s = i.sprite
       next if s.nil? or i == self or @character.tile_id!=0 or s.disposed?
       if (@s_shadow.z)>s.z and @s_shadow.angle.between?(s.angle-1.5,s.angle+1.5)\
        and ((@character.x-i.character.x)**2 + (@character.y-i.character.y)**2)**0.5<=s.zoom_y \
        and s.z>=0
         @s_shadow.visible=false
         @overlayed = true
       end
       return if !@s_shadow.visible
     end
    
     return @overlayed
   end
   #--------------------------------------------------------------------------
   def update
     # set shadow visibility according to the light state
     @s_shadow.visible = !@source.character.off
     if @character.transparent or @character.opacity <= SHADOWS_OPACITY_THRESHOLD
       @s_shadow.visible = false
       return
     end
     if @old_amin.nil? and @old_amax.nil? and @old_dir.nil?
       @old_amin= @anglemin
       @old_amax= @anglemax
       @old_dir = @source.character.direction
     end
     # adapt the angle according to the source direction
     case @source.character.direction
       when 2
         @anglemin= @old_amin+180
         @anglemax= @old_amax+180
       when 4
         @anglemin= @old_amin+90
         @anglemax= @old_amax+90
       when 8
         @anglemin= @old_amin
         @anglemax= @old_amax
       when 6
         @anglemin= @old_amin+270
         @anglemax= @old_amax+270
       end
     if @old_dir!=@source.character.direction
       @old_dir = @source.character.direction
     end
     # simplify the angles if more than 360 or less than 0
     @anglemin%=360;@anglemax%=360
    
     tile_height= @shadow_max_height
     @deltax=(@source.character.real_x-@character.real_x)/4
     @deltay= ((@source.character.real_y+@light_height*128)-(@character.real_y+tile_height*128))/4
     @distance = (((@deltax ** 2) + (@deltay ** 2))** 0.5)
     if @distancemax !=0 and @distance>@distancemax
       @s_shadow.visible = false
       return
     end
    
     @s_shadow.angle = 57.3*Math.atan2(@deltax, @deltay )
     @angle_trigo= (@s_shadow.angle+90) % 360
    
     #test if there is a shadow above it, from something close,and then
     # don't display its shadow
     return if overlayed?
    
     if @anglemin !=0 or @anglemax !=0
       if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and \
           @anglemin<@anglemax
         @s_shadow.visible = false
         return
       elsif (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and \
              @anglemin>@anglemax
         @s_shadow.visible = false
         return
       end    
     end
     @s_shadow.update
     if @tile_id != @character.tile_id or
        @character_name != @character.character_name or
        @character_hue != @character.character_hue
        @tile_id = @character.tile_id
       @character_name = @character.character_name
       @character_hue = @character.character_hue
       if @tile_id >= 384
         @s_shadow.bitmap = RPG::Cache.tile($game_map.tileset_name,
         @tile_id, @character.character_hue)
         @s_shadow.src_rect.set(0, 0, 32, 32)
         @s_shadow.ox = 16
         @s_shadow.oy = 32
       else
         @s_shadow.bitmap = RPG::Cache.character(@character.character_name,
           @character.character_hue)
         @cw = @s_shadow.bitmap.width / 4
         @ch = @s_shadow.bitmap.height / 4
         @s_shadow.ox = @cw / 2
         @s_shadow.oy = @ch
       end
     end
     @s_shadow.x = @character.screen_x
     @s_shadow.y = @character.screen_y-8
     @s_shadow.z = @character.screen_z(@ch)-1
    
     if @tile_id!=0 # if the sprite graphic is from the tileset
       # set the Z-Index using the tileset priority settings
       @s_shadow.z = ($game_map.priorities[@tile_id])*32
       # convert the shadow angle, into 8-directions (0-7)
       direction_shadow=((@s_shadow.angle/45+45/2.0+90).round)%8
       # for the middle-Top and top layers,
       for i in [1, 2]
         # get the tile from the converted angle
         tile_around=[$game_map.data[@character.x,@character.y-1,i],
         $game_map.data[@character.x-1,@character.y-1,i],
         $game_map.data[@character.x-1,@character.y,i],
         $game_map.data[@character.x-1,@character.y+1,i],  
         $game_map.data[@character.x,@character.y+1,i],
         $game_map.data[@character.x+1,@character.y+1,i],
         $game_map.data[@character.x+1,@character.y,i],
         $game_map.data[@character.x+1,@character.y-1,i]]
         # if the tile is the empty one go to the next layer
         next if tile_around[direction_shadow]==0
         # else, lower the Z-index if the tile around is "above" or at the same
         # priority of our tile
         @s_shadow.z-=32 if $game_map.priorities[tile_around[direction_shadow]]>=$game_map.priorities[@tile_id]
       end
     end
     if @tile_id == 0
       sx = @character.pattern * @cw
       quarter = ((@angle_trigo/90+0.5).floor)%4
      
       # The quarter is the position of the event relative to the source.
       # Imagine the source is the o point (0,0). Trace the 2 lines
       # y=x and y=-x : you get something like a big X
       # On the right, quarter=0. Up, quarter = 1, and so on
       # Take the @character.direction row (2,4,6,8), and the quarter
       # column (0,1,2,3) (remember, it starts at 0), and you'll get
       # a number between 1 and 4. It correspond to the row of the charset
       # the shadow will be, and mirrored if negative.
       # Yes, it isn't obvious, but I didn't find any simple operation to
       # get those.
       magic = SHADOWS_DIRECTION_ARRAY[@character.direction][quarter]
       magic = -magic
       if magic < 0
         @s_shadow.mirror = true
         magic = -magic
       else
         @s_shadow.mirror = false
       end
       sy = (magic-1)*@ch
       @s_shadow.src_rect.set(sx, sy, @cw, @ch)
     end
     # This is the formula of the opacity in function of the distance
     # ** 2 means square
     @s_shadow.opacity = 1200/((@distance ** 2)/ 1000 + 6)
     # This is the formula of the size in function of the distance
     # The 0.75 is here so you have a size of 1:1 when next to the source.
     @s_shadow.zoom_y=0.75*(@shadow_max_height+1) + (@distance) / 256 if SHADOW_GETS_LONGER
   end
 end
 #==============================================================================
 # ** Zlib    
 #==============================================================================
 
 module Zlib
   #==========================================================================
 ==
   # ** Png_File    
   #==========================================================================
 ==
 
   class Png_File < GzipWriter
     #--------------------------------------------------------------------------
     # * Make PNG
     #--------------------------------------------------------------------------
     def make_png(bitmap, mode = 0)
       # Save Bitmap & Mode
       @bitmap, @mode = bitmap, mode
       # Create & Save PNG
       self.write(make_header)
       self.write(make_ihdr)
       self.write(make_idat)
       self.write(make_iend)
     end
     #--------------------------------------------------------------------------
     # * Make Header
     #--------------------------------------------------------------------------
     def make_header
       return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*')
     end
     #--------------------------------------------------------------------------
     # * Make IHDR
     #--------------------------------------------------------------------------
     def make_ihdr
       ih_size               = [13].pack("N")
       ih_sign               = 'IHDR'
       ih_width              = [@bitmap.width].pack('N')
       ih_height             = [@bitmap.height].pack('N')
       ih_bit_depth          = [8].pack('C')
       ih_color_type         = [6].pack('C')
       ih_compression_method = [0].pack('C')
       ih_filter_method      = [0].pack('C')
       ih_interlace_method   = [0].pack('C')
       string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
                ih_compression_method + ih_filter_method + ih_interlace_method
       ih_crc = [Zlib.crc32(string)].pack('N')
       return ih_size + string + ih_crc
     end
     #--------------------------------------------------------------------------
     # * Make IDAT
     #--------------------------------------------------------------------------
     def make_idat
       header  = "\x49\x44\x41\x54"
       data    = @mode == 0 ? make_bitmap_data0 : make_bitmap_data1
       data    = Zlib::Deflate.deflate(data, 8)
       crc     = [Zlib.crc32(header + data)].pack('N')
       size    = [data.length].pack('N')
       return size + header + data + crc
     end
     #--------------------------------------------------------------------------
     # * Make Bitmap Data 0
     #--------------------------------------------------------------------------
     def make_bitmap_data0
       gz = Zlib::GzipWriter.open('hoge.gz')
       t_Fx = 0
       w = @bitmap.width
       h = @bitmap.height
       data = []
       for y in 0...h
         data.push(0)
         for x in 0...w
           t_Fx += 1
           if t_Fx % 10000 == 0
             Graphics.update
           end
           if t_Fx % 100000 == 0
             s = data.pack("C*")
             gz.write(s)
             data.clear
           end
           color = @bitmap.get_pixel(x, y)
           red = color.red
           green = color.green
           blue = color.blue
           alpha = color.alpha
           data.push(red)
           data.push(green)
           data.push(blue)
           data.push(alpha)
         end
       end
       s = data.pack("C*")
       gz.write(s)
       gz.close  
       data.clear
       gz = Zlib::GzipReader.open('hoge.gz')
       data = gz.read
       gz.close
       File.delete('hoge.gz')
       return data
     end
     #--------------------------------------------------------------------------
     # * Make Bitmap Data Mode 1
     #--------------------------------------------------------------------------
     def make_bitmap_data1
       w = @bitmap.width
       h = @bitmap.height
       data = []
       for y in 0...h
         data.push(0)
         for x in 0...w
           color = @bitmap.get_pixel(x, y)
           red = color.red
           green = color.green
           blue = color.blue
           alpha = color.alpha
           data.push(red)
           data.push(green)
           data.push(blue)
           data.push(alpha)
         end
       end
       return data.pack("C*")
     end
     #--------------------------------------------------------------------------
     # * Make IEND
     #--------------------------------------------------------------------------
     def make_iend
       ie_size = [0].pack('N')
       ie_sign = 'IEND'
       ie_crc  = [Zlib.crc32(ie_sign)].pack('N')
       return ie_size + ie_sign + ie_crc
     end
   end
 end
 #==============================================================================
 # Class Game Event
 #==============================================================================
 class Game_Event
   alias treb_mobile_source_game_event_initialize initialize
   attr_accessor :off, :direction
   def initialize(*args)
     # create the off attribute, only used for the lights
     @off = false
     treb_mobile_source_game_event_initialize(*args)
   end
 end
 #==============================================================================
 # class Spriteset Map
 #==============================================================================
 class Spriteset_Map
   alias trebor777_DLS_spriteset_map_init_characters init_characters
   alias trebor777_DLS_spriteset_map_update_character_sprites update_character_sprites
   alias trebor777_DLS_spriteset_map_dispose dispose
   #--------------------------------------------------------------------------
   def init_characters
     trebor777_DLS_spriteset_map_init_characters
     # create the lights and shadows arrays
     @lights = []
     @shadows = []
     @viewport1.visible=false
     @viewport2.visible=false
     @viewport3.visible=false
     for i in $game_map.events.keys.sort
       # Search for light trigger
       light_param = SDK.event_comment_input($game_map.events[i], 1, "Light")
       # if not found go to the next iteration
       next if light_param.nil?
       # else add it to the Lights Hash, and create a new light
       @lights.push( Light.new(@viewport1,$game_map.events[i],light_param) )
       # create the shadow for the player.
       @shadows.push( Shadow.new(@viewport1,$game_player, ['0'], @lights.last) )
     end
     for i in $game_map.events.keys.sort
       for light in @lights
         # Search for shadow trigger
         shadow_param = SDK.event_comment_input($game_map.events[i], 1, "Shadow")
         next if shadow_param.nil?
         @shadows.push( Shadow.new(@viewport1,$game_map.events[i], shadow_param, light) )
       end
     end
     @viewport1.visible=true
     @viewport2.visible=true
     @viewport3.visible=true
   end
   #--------------------------------------------------------------------------
   def update_character_sprites
     trebor777_DLS_spriteset_map_update_character_sprites
     lights_off = 0
     # Update the lights
     for light in @lights
       light.update
       # count the number of lights off
       lights_off+=1 if light.character.off
     end
     # Update the Shadows
     for shade in @shadows
       shade.update
     end
     if @lights.size>0
       # updating screen tinting according to the number of lights on
       value=((lights_off.to_f/@lights.size)*(-180)).round
       $game_screen.start_tone_change(Tone.new(value,value,value,value), 1)
     else
       $game_screen.start_tone_change(Tone.new(0,0,0,0), 1)
     end
   end
  #--------------------------------------------------------------------------
   def dispose
     for light in @lights
       light.dispose
     end
     # Update the Shadows
     for shade in @shadows
       shade.dispose
     end
     @lights = []
     @shadows = []
   end
 end
 #==============================================================================
 # Class Bitmap
 #==============================================================================
 class Bitmap
   #--------------------------------------------------------------------------
   def draw_line(x1, y1, x2, y2, width = 1, color = Color.new(255, 255, 255))
     # Return if width is less than or 0
     return if width <= 0
     # Reverse all parameters sent if 2 x is less than the first x
     x1, x2, y1, y2 = x2, x1, y2, y1 if x2 < x1    
     # Get S (1/2 width)
     s = width / 2.0
     # If X Coordinates are equal
     if x1 == x2
       # Draw Vertical line
       fill_rect(x1 - s, [y1, y2].min, width, (y2 - y1).abs, color)
     # If Y Coordinates are equal
     elsif y1 == y2
       # Draw Horizontal line
       fill_rect(x1, y1 - s, x2 - x1, width, color)
     end
     # Get Length
     length = x2 - x1 < (y2 - y1).abs ? (y2 - y1).abs : x2 - x1
     # Get Increments
     x_increment, y_increment = (x2 - x1) / length.to_f, (y2 - y1) / length.to_f
     # Get Current X and Y
     x, y = x1, y1
     # While Current X is less than end X
     while x < x2
       # Draw Box of width width and width height
       fill_rect(x-s, y-s, width, width, color)
       # Increment X and Y
       x += x_increment
       y += y_increment
     end
   end
   #--------------------------------------------------------------------------
   # Draw pie, take quite a long time as it draws each line.
   #--------------------------------------------------------------------------
   def draw_pie(x,y,radius,color = Color.new(255, 255, 255, 255),start_angle=0,end_angle=360)
     end_angle+=360 if end_angle
     name_string="#{radius}_#{start_angle}_#{end_angle}"
     #filename="Graphics/Pictures/#{name_string}.png"
     if FileTest.exist?("Graphics/Pictures/#{name_string}.png")
       temp = RPG::Cache.picture(name_string)
       blt(0,0,temp,temp.rect)
     else
       Graphics.transition
       t = Progress_Bar.new(160,240,320,20,end_angle-start_angle+2 )
       for i in start_angle...end_angle
         t.current_step+=1
         t.update
         Graphics.update
         for j in 0..2
           x_=(Math::cos((i+j/2.0)*Math::PI/180)*radius).round+x
           y_=(Math::sin((i+j/2.0)*Math::PI/180)*radius).round+y
           draw_line(x, y, x_, y_, 2,color)
         end
       end
       t.current_step+=1
       t.update
       Graphics.update
       make_png(name_string, 'Graphics/Pictures/')
       t.current_step+=1
       t.update
       Graphics.update
       t.dispose
     end
   end
   def make_png(name = 'like', path = '', mode = 0)
     Dir.make_dir(path) if path != '' and !FileTest.directory?(path)
     Zlib::Png_File.open('temp.gz')   { |gz| gz.make_png(self, mode) }
     Zlib::GzipReader.open('temp.gz') { |gz| $read = gz.read }
     f = File.open(path + name + '.png', 'wb')
     f.write($read)
     f.close
     File.delete('temp.gz')
   end
 end
 
 class Progress_Bar < Sprite
   #--------------------------------------------------------------------------
   # * Public Instance Variables
   #--------------------------------------------------------------------------
   attr_accessor :current_step   # The Current Step
   attr_accessor :steps          # The max amount of steps
   #----------------------------------------------------------------------------
   # * Initialize Object
   #----------------------------------------------------------------------------
   def initialize(x,y,width,height=16,steps=100,start=0)
     super()
     @steps = steps
     self.x = x
     self.y = y
     @current_step= start
     @width = width
     @height = height
     @w = 9
     @nb_bars = @width/@w
     @c1 = Color.new(46,211,49,255)
     @c2 = Color.new(46,211,49,227)
     @c3 = Color.new(46,211,49,202)
     @c4 = Color.new(46,211,49,177)
     @c5 = Color.new(46,211,49,152)
     @c6 = Color.new(46,211,49,127)
     @stretch_c = (@height-4)/16.0
     self.bitmap = Bitmap.new(@width, @height)
     self.bitmap.clear
     self.bitmap.fill_rect(0, 0, @width, @height, Color.new(59,59,59,167))
     draw
   end
   #----------------------------------------------------------------------------
   # * Draw Bar
   #----------------------------------------------------------------------------
   def draw
     self.bitmap.fill_rect(1, 1, @width-2, @height-2, Color.new(59,59,59,0))
     for i in 0...((@current_step/@steps.to_f)*@nb_bars).round
       self.bitmap.fill_rect(i*@w+1,2,@w-2,@height-4,@c6)
       self.bitmap.fill_rect(i*@w+1,3*@stretch_c,@w-2,@height-6*@stretch_c,@c5)
       self.bitmap.fill_rect(i*@w+1,4*@stretch_c,@w-2,@height-8*@stretch_c,@c4)
       self.bitmap.fill_rect(i*@w+1,5*@stretch_c,@w-2,@height-10*@stretch_c,@c3)
       self.bitmap.fill_rect(i*@w+1,6*@stretch_c,@w-2,@height-12*@stretch_c,@c2)
       self.bitmap.fill_rect(i*@w+1,7*@stretch_c,@w-2,@height-14*@stretch_c,@c1)
     end
     @old = @current_step
   end
   #----------------------------------------------------------------------------
   # * Update
   #----------------------------------------------------------------------------
   def update
     draw if @current_step != @old
   end
 end
 #SDK test
 end
« Letzte Änderung: Januar 21, 2008, 20:11:43 von GR-FoxDie »


Neustes Projekt von Red und Mir
Renascor Adoria II - Das Urteil der Finsternis (RMXP)

 


 Bild des Monats

rooftop party

Views: 3151
By: papilion

 Umfrage

  • Wer soll das BdM gewinnen?
  • Dot Kandidat 1
  • 3 (25%)
  • Dot Kandidat 2
  • 1 (8%)
  • Dot Kandidat 3
  • 2 (16%)
  • Dot Kandidat 4
  • 0 (0%)
  • Dot Kandidat 5
  • 6 (50%)
  • Stimmen insgesamt: 12
  • View Topic

 Schnellsuche





SimplePortal 2.3.3 © 2008-2010, SimplePortal