Vai al contenuto

Rilevato Ad-Blocker. Per favore disabilita il tuo adblocker quando navighi su makerando.com - Non c'è nessun annuncio invasivo.

  • Chatbox

    You don't have permission to chat.
    Load More
Ally

Gameplay Dynamic Ligth e Shadows

Recommended Posts

Titolo: Dynamic Ligth e Shadows

Versione: 1.5

Autore/i: Rataime & Trebor777

 

Informazioni:

Crea luci e ombre dinamiche

 

Istruzioni:

Richiede le immagini che sono nella demo.

Copiatelo sopra Main,copiate L'SDK sopra

lo script. Le istruzioni per usarlo sono nello

script.

 

Script::

=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?
      @[email protected]
      @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
      @[email protected]_x
      @[email protected]_y+32*@light_height
      @[email protected]_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)
    @[email protected]_x
    @[email protected]_y+32*@light_height
    @[email protected]_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),@anglemi
n, @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.[img=http://rpgmkr.net/forum/public/style_emoticons/default/sourirex.gif]**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 = [email protected]
    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 @[email protected]
      @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=(@[email protected]_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
Demo:

http://www.mediafire.com/?zdcdjdzdim4

 

Incompatibilita:

Richiede L'SDK

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

You need to be a member in order to leave a comment

Crea un account

Iscriviti per un nuovo account nella nostra comunità. È facile!

Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.

Accedi Ora

  • Contenuti simili

    • Da Ally
      Nome Script: Napoleon's Minimap V1.06a
      Versione: 1.06a
      Autore/i: Napoleon
       
      Informazioni:
      Mini-Map script molto bello e personalizzabile con varie opzioni =)
       
      Screenshots:
       
       
      Istruzioni:
      Istruzioni e script all'interno della demo.
       
      Demo:
      https://www.dropbox.com/s/jm92rbqb5eadryr/Napoleons%20Master%20Demo.zip
    • Da Ally
      Nome Script: Camminata 8 Direzioni
      Versione: N/D
      Autore/i: Raizen884
       
      Informazioni:
      Script che simula le 8 direzioni di camminata.
       
      Istruzioni:
      Inserite lo script sotto Material.
       
      Script:
       
      #=======================================================# Engine 8 direções.# Autor: Raizen884# Mude completamente o seu jogo de 4 direções, para# 8 direções. O script vai adicionar movimentos em 8# direções para o personagem e para todos os eventos# no jogo.#=======================================================class Game_Player < Game_Character def move_by_input return if !movable? || $game_map.interpreter.running? move_diagonal(4, 2) if Input.dir8 == 1 move_straight(2) if Input.dir8 == 2 move_diagonal(6, 2) if Input.dir8 == 3 move_straight(4) if Input.dir8 == 4 move_diagonal(6, 8) if Input.dir8 == 9 move_straight(6) if Input.dir8 == 6 move_diagonal(4, 8) if Input.dir8 == 7 move_straight(8) if Input.dir8 == 8 end def move_diagonal(horz, vert) @followers.move if diagonal_passable?(@x, @y, horz, vert) check_event_trigger_touch(@x+1, @y+1) if horz == 6 and vert == 2 check_event_trigger_touch(@x+1, @y-1) if horz == 6 and vert == 8 check_event_trigger_touch(@x-1, @y-1) if horz == 4 and vert == 8 check_event_trigger_touch(@x-1, @y+1) if horz == 4 and vert == 2 super endendclass Game_Character < Game_CharacterBase def move_toward_character(character) sx = distance_x_from(character.x) sy = distance_y_from(character.y) if sx.abs > sy.abs and sy == 0 move_straight(sx > 0 ? 4 : 6) move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0 elsif sx.abs > sy.abs and sy > 0 if sx > 0 move_diagonal(4, 8) else move_diagonal(6, 8) end elsif sx.abs > sy.abs and sy < 0 if sx > 0 move_diagonal(4, 2) else move_diagonal(6, 2) end end if sx.abs <= sy.abs and sx == 0 move_straight(sy > 0 ? 8 : 2) move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0 elsif sx.abs <= sy.abs and sx > 0 if sy > 0 move_diagonal(4, 8) else move_diagonal(4, 2) end elsif sx.abs <= sy.abs and sx < 0 if sy > 0 move_diagonal(6, 8) else move_diagonal(6, 2) end endend def move_random case rand(2) when 0 move_straight(2 + rand(4) * 2, false) when 1 move_diagonal(2 + rand(4) * 2, 2 + rand(4) * 2) end end def move_away_from_character(character) sx = distance_x_from(character.x) sy = distance_y_from(character.y) if sx.abs > sy.abs and sy == 0 move_straight(sx > 0 ? 6 : 4) move_straight(sy > 0 ? 2 : 8) if !@move_succeed && sy != 0 elsif sx.abs > sy.abs and sy < 0 if sx < 0 move_diagonal(4, 8) else move_diagonal(6, 8) end elsif sx.abs > sy.abs and sy > 0 if sx > 0 move_diagonal(6, 2) else move_diagonal(4, 2) end end if sx.abs <= sy.abs and sx == 0 move_straight(sy > 0 ? 2 : 8) move_straight(sx > 0 ? 6 : 4) if !@move_succeed && sx != 0 elsif sx.abs <= sy.abs and sx < 0 if sy > 0 move_diagonal(4, 2) else move_diagonal(4, 8) end elsif sx.abs <= sy.abs and sx > 0 if sy < 0 move_diagonal(6, 8) else move_diagonal(6, 2) end endendend
    • Da Ally
      Nome Script: Overlay Mapping
      Versione: del 16.04.2012
      Autore/i: Yami
       
      Informazioni:
      Questo script permette di poter utilizzare i vari livelli di parallasse per mappare all'interno del vostro progetto di RPG Maker VX Ace.
       
      Screenshots:

       
      Istruzioni:
      Create una cartella dentro "Graphics" chiamata Overlay (nome progetto/Graphic/Overlay).
      Potete creare fino a 4 tipi di immagini:
      • Ground (parte base della mappa - va SOTTO a tutto)
      • Par (parte alta della mappa - va SOPRA a tutto e copre gli eventi e il personaggio - vedi albero)
      • Light (crea effetti di luce statici)
      • Shadow (crea effetti di ombra statici)
       
      Le immagini della vostra mappa dovranno essere nominate in base alla loro funzione:
      • Il prato è un ground
      • Gli alberi e tutto quello che è sopra al livello dell'eroe è un par
      • Le luci e le ombre sono rispettivamente light e shadow
       
      Esempio:
      Io ho creato un prato con degli alberi come nell'immagine sopra.
      Tutto questo andrà inserito all'interno delle prima mappa del gioco (quindi ID:0001); di conseguenza chiamerò la mia immagine del prato cosi: Ground1_1 (il primo 1 è l'ID della mappa nel quale il prato verrà visualizzato; il secondo 1 è usato se, per esempio, nella stessa mappa volete creare più versioni: ground1_1 versione normale ground1_2 versione distruzione, per esempio); L'immagine deve essere in PNG.
      Gli alberi andranno salvati cosi: Par1_1 (i numeri seguono lo stesso principio spiegato sopra); L'immagine deve essere in PNG.
      Le luci e le ombre (se presenti) andranno salvate con lo stesso principio spiegato sopra (light1_1 e Shadow1_1); L'immagine deve essere in JPG.
       
      (se questo prato dovrà essere messo nell mappa con ID 23 le immagini saranno chiamate ground23_1, par23_1, light23_1 e shadow23_1)
       
      Spero di essere stato chiaro D:
       
      Script:
       
       
      F.A.Q:
      N/D
       
      Demo:
      N/D
       
      Incompatibilità:
      N/D
       
      Note dell'autore:
      N/D
    • Da Ally
      Nome Script: Lune Ultimate Anti-Lag
      Versione: N/D
      Autore/i: Raizen
       
      Informazioni:
      Lo script Anti-Lag ormai è un must have da inserire nei propri progetti.
      Infatti consente di migliorare le prestazioni nonostante i troppi eventi, script, etc...
       
      Istruzioni:
      Inserite lo script sotto Material e configuratelo se necessario...
       
      Script:
       
       
      #=======================================================# Lune Ultimate Anti-Lag# Author: Raizen# Compatible with: RMVXAce# Comunity: centrorpg.com# This script allows a very well balanced anti-lag, in which# considers the own PC of the player, using a smart frame-skipper# to slow lags,#========================================================#To update constantly the event, put a commentary on the first# command of the script written :update:module Anti_conf#==============================================================================# ** Configurations#------------------------------------------------------------------------------# Configure what is necessary for a better performance.#==============================================================================# Choose how the script will act.# <=====Quality============================Performance=====># 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20# Default = 10Fr = 10# Configure the FPS rate (default = 60)Fps = 60# Configure the minimum FPS rate (default = 25)Mini = 25# Quantity of frames the anti-lag will study,# the higher the time, the more precise the script,# but will take longer to load the anti-lagTime = 60end=beginFunctions on this Anti-Lag* Common event positioning bug fixed* Smart Frame Skipper* updates what is only necessary* helps to lower lags from visual system/scripts* Changes its behavior according to the players PC* Increases the RPG Maker priority over other programs=end#=================================================================##=================================================================##==================== Alias methods =============================## command_203 => Game_Interpreter# start => Scene_Map# update => Scene_Map# perform_transfer => Scene_Map#=================================================================##==================== Rewrite methods ===========================## update_events => Game_Map# update_one_event => Spriteset_Map#=================================================================##======================== New methods ===========================## need_to_update? => Game_Event# near_the_screen? => Sprite_Character# call_position_event => Scene_Map# skip_calculate => Scene_Map# update_one_event => Spriteset_Map#=================================================================##=================================================================##==============================================================================#============================ Início do Script! =============================#==============================================================================#==============================================================================# ** Scene_Map#------------------------------------------------------------------------------# Esta classe executa o processamento da tela de mapa.#==============================================================================class Scene_Map < Scene_Basealias lune_skip_start startalias lune_skip_update updatealias lune_perform perform_transfer #-------------------------------------------------------------------------- # * Inicialização do processo #-------------------------------------------------------------------------- def start Graphics.frame_rate = Anti_conf::Fps @update_skip = false @count_up = 0 lune_skip_start end #-------------------------------------------------------------------------- # * Execução da transferência #-------------------------------------------------------------------------- def perform_transfer $get_new_ids = Array.new Graphics.frame_rate = Anti_conf::Fps lune_perform @count_up = 0 @update_skip = false end #-------------------------------------------------------------------------- # * Atualização da tela #-------------------------------------------------------------------------- def update @update_skip ? lune_skip_update : skip_calculate end #-------------------------------------------------------------------------- # * Atualização de um personagem especifico #-------------------------------------------------------------------------- def call_position_event(id) @spriteset.update_one_event(id) end #-------------------------------------------------------------------------- # * Calcula o tempo necessário para rodar o update do Scene_Map #-------------------------------------------------------------------------- def skip_calculate @count_up += 1 return unless @count_up >= Anti_conf::Time auto_skip = Time.now lune_skip_update old_skip = Time.now get_skip = old_skip - auto_skip Graphics.frame_rate -= (get_skip * Graphics.frame_rate * 2 * Anti_conf::Fr - 1).to_i Graphics.frame_rate = [Graphics.frame_rate, Anti_conf::Mini].max @update_skip = true endend#==============================================================================# ** Scene_Base#------------------------------------------------------------------------------# Esta é a superclasse de todas as cenas do jogo.#==============================================================================class Scene_Basealias skipper_main main #-------------------------------------------------------------------------- # * Processamento principal #-------------------------------------------------------------------------- def main @fr_cont = 0 skipper_main end #-------------------------------------------------------------------------- # * Execução da transição #-------------------------------------------------------------------------- def perform_transition Graphics.transition(transition_speed * Graphics.frame_rate / 60) end #-------------------------------------------------------------------------- # * Atualização da tela (básico) #-------------------------------------------------------------------------- def update_basic if @fr_cont >= 60 Graphics.update @fr_cont -= 60 end @fr_cont += Graphics.frame_rate update_all_windows Input.update endend#==============================================================================# ** Aumento da prioridade do rpg maker#------------------------------------------------------------------------------Lune_high = Win32API.new("kernel32", "SetPriorityClass", "pi", "i")Lune_high.call(-1, 0x90)#==============================================================================#==============================================================================# ** Game_Event#------------------------------------------------------------------------------# Esta classe gerencia os eventos. Ela controla funções incluindo a mudança# de páginas de event por condições determinadas, e processos paralelos.# Esta classe é usada internamente pela classe Game_Map.#==============================================================================class Game_Event < Game_Character #-------------------------------------------------------------------------- # * necessário atualizar? #-------------------------------------------------------------------------- def need_to_update? ax = $game_map.adjust_x(@real_<img src='http://rpgmkr.net/forum/public/style_emoticons/<#EMO_DIR#>/sourirex.gif' class='bbc_emoticon' alt='X)' /> - 8 ay = $game_map.adjust_y(@real_y) - 6 ax.between?(-9, 9) && ay.between?(-7, 7) || @list[0].parameters.include?(':update:') endend#==============================================================================# ** Sprite_Character#------------------------------------------------------------------------------# Este sprite é usado para mostrar personagens. Ele observa uma instância# da classe Game_Character e automaticamente muda as condições do sprite.#==============================================================================class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # * Evento próximo a tela? #-------------------------------------------------------------------------- def near_the_screen? ax = $game_map.adjust_x(@character.<img src='http://rpgmkr.net/forum/public/style_emoticons/<#EMO_DIR#>/sourirex.gif' class='bbc_emoticon' alt='X)' /> - 8 ay = $game_map.adjust_y(@character.y) - 6 ax.between?(-11, 11) && ay.between?(-8, 8) endend#==============================================================================# ** Game_Event#------------------------------------------------------------------------------# Esta classe gerencia os eventos. Ela controla funções incluindo a mudança# de páginas de event por condições determinadas, e processos paralelos.# Esta classe é usada internamente pela classe Game_Map.#==============================================================================class Game_Event < Game_Characteralias lune_ant_initialize initialize #-------------------------------------------------------------------------- # * Inicialização do objeto # event : RPG::Event #-------------------------------------------------------------------------- def initialize(*args, &block) lune_ant_initialize(*args, &block) $get_new_ids.push(@event.id) endend#==============================================================================# ** Game_Interpreter#------------------------------------------------------------------------------# Um interpretador para executar os comandos de evento. Esta classe é usada# internamente pelas classes Game_Map, Game_Troop e Game_Event.#==============================================================================class Game_Interpreteralias lune_lag_command_203 command_203 #-------------------------------------------------------------------------- # Definir posição do evento #-------------------------------------------------------------------------- def command_203 lune_lag_command_203 SceneManager.scene.call_position_event($get_new_ids.index(@event_id)) endend#==============================================================================# ** Game_Map#------------------------------------------------------------------------------# Esta classe gerencia o mapa. Inclui funções de rolagem e definição de# passagens. A instância desta classe é referenciada por $game_map.#==============================================================================class Game_Map #-------------------------------------------------------------------------- # * Atualização dos comandos dos eventos #-------------------------------------------------------------------------- def update_events @events.each_value {|event| event.update if event.need_to_update?} @common_events.each {|event| event.update} endend$get_new_ids = Array.new#==============================================================================# ** Spriteset_Map#------------------------------------------------------------------------------# Esta classe reune os sprites da tela de mapa e tilesets. Esta classe é# usada internamente pela classe Scene_Map.#==============================================================================class Spriteset_Map #-------------------------------------------------------------------------- # * Atualização dos personagens #-------------------------------------------------------------------------- def update_characters refresh_characters if @map_id != $game_map.map_id @character_sprites.each {|sprite| sprite.update if sprite.near_the_screen? } end #-------------------------------------------------------------------------- # * Atualização de algum personagem remoto #-------------------------------------------------------------------------- def update_one_event(id) @character_sprites[id].update endend
×