Advertisement
Guest User

Dynamic lights english partial translation

a guest
Apr 23rd, 2017
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 11.67 KB | None | 0 0
  1. # Lumières Dynamiques Version 3o
  2. # A script imagined and written by Fabien - fabien_35@hotmail.com
  3. # The complete manual, the code update and free help of the author an on The Factory forum : adress
  4. # Aim : Deal with lights which are not only white over the dark of the night
  5. #       but that are really pushing away the darkness to reveal true colors.
  6. #       This is what we'll call light in this scirpt : a hole in the layer hiding the map.
  7. #       However let's be clear :
  8. #            - Immobile lights are easily done without scripts (see tutorial on The Factory)
  9. #            - One single moving light is easily done without scripts (see tutorial on The Factory)
  10. #            - However several lights relativeley moving from each other, accouting for collisions, is impossible without a script like this one.
  11. #            => The aim of this code is the animation of several lights "at once".
  12. #-----------------------------------------
  13. # Use : Parallel Event, script : ecran_nuit to initialize. For example ecran_nuit(150,0,0,15) for slightly blue darkness
  14. # then lum(name,id) as many times as you want lights,
  15. # with "name" the file name of the light picture and "id" the id of event bearing the light.
  16. # The script has much more functionalities : visit his topic on Factory to see them.
  17.  
  18. #=====Interface functions : =========================================================
  19. #-----Initialization function of the script. Creates darkness. Arguments are the color component of the darkness and transparency-------------
  20. def ecran_nuit(op=150,r=0,v=0,b=0) # (ooacité de la nuit, rouge, vert,bleu)
  21.   $lum.img.dispose if $lum.is_a?(Lumières_dynamiques) # effacage des lum précédentes.
  22.   $lum=Lumières_dynamiques.new(255-r,255-v,255-b,op) # création de l'unique instance du script
  23. end
  24. #-------Main interface function. Creates a light following an event.-------------------------------------
  25. def lum(nom,id=0,op=255,dx=0,dy=0,x=nil,y=nil,zx=1,zy=1)      
  26.   $lum.lums[id]=Lum.new(nom,id,op,x,y,dx,dy,zx,zy,nil)
  27. end #The characteristics of the lum are stored within a structure
  28. #-------set-up unmovable decoration lights------------------------
  29. def lumF(nom,id,op=255,dx=0,dy=0,x=nil,y=nil,zx=1,zy=1)  
  30.   $lum.coller_le_trou(true,nom,x,y,op,dx,dy,id,zx,zy) # installe la lumière
  31. end
  32. #-------lumF_tile creates lumF on all identifcal tiles from one given in an example ----------
  33. def lum_tile(nom,x_tile,y_tile,i_tile,op=255,dx=0,dy=0)
  34.     cherche_tile(x_tile,y_tile,i_tile).each{|tile|  # collecte les tiles identiques
  35.     $lum.coller_le_trou(true,nom,tile[0]*32+dx,tile[1]*32+dy,op)} # y installe des lumières        
  36.   end
  37. #--------antilum keeps rectanglular areas in the darkness-----------------------
  38. def antilum(x1,y1,x2,y2)
  39.   x1*=32
  40.   y1*=32
  41.   x2=(x2+1)*32
  42.   y2=(y2+1)*32
  43.   $lum.antilums.push(Rect.new(x1,y1,(x2-x1).abs,(y2-y1).abs))
  44. end
  45. #------stick a lumF on all the map----------------------------------
  46. def lumFCarte(nom,op=255)
  47.   $lum.coller_le_trou(true,nom,$game_map.width*16,$game_map.height*16,255,0,0,1)
  48. end
  49. #--set-up specials anti-darkness lums. For areas that cannot be lightened.
  50. def proteger(nom,id=0,op=255,dx=0,dy=0,x=nil,y=nil,zx=1,zy=1)   # peu utile en pratique
  51.   $lum.proctections.push([nom,x,y,id,op,dx,dy,zx,zy])
  52. end
  53. #------same thing for all occurrences of one tile.This one os useful-----------------
  54. def proteger_tiles(nom,x_tile,y_tile,i_tile,op=255,dx=0,dy=0,zx=1,zy=1)
  55.   $game_map.cherche_tile(x_tile,y_tile,i_tile).each{|tile|  # collecte les tiles identiques
  56.   $lum.proctections.push([nom,tile[0]*32,tile[1]*32,id,op,dx,dy,zx,zy]) }# y installe des protections
  57. end
  58. #----end of interface functions-----------------------------------------------------------------
  59.  
  60.  
  61. #---Class storing all information about lights  ( allow a more intuitive access)-----------------
  62. Lum = Struct.new( "Lum", :nom, :id, :op, :x, :y, :dx, :dy, :zx, :zy, :stock)
  63. #---------------------------------------------------------------------
  64. #--- Main class, stocks Lum and display everything. -----------
  65. class Lumières_dynamiques
  66.   attr_accessor :lums ,:img ,:id_map ,:antilums ,:proctections ,:repertoire
  67. #---------------------------------------------------------------------  
  68.   def initialize(r,v,b,op) # création des variables du script
  69.     @fixes=false # mode fixe ? oui ou non, non par defaut
  70.     @lums=Hash.new #Stocke les caractéristiques des lums
  71.     @antilums=[]
  72.     @reparations=[] #stocke les réparations à faire à la prochaine frame
  73.     @proctections=[]
  74.     @id_map=$game_map.map_id # mémorisation de l'id map ( pour gerer les téléportations)
  75.     @periode=1 # economie de puissance ( perte de fluidité)
  76.     @img=Sprite.new # l'unique spritedu script, qui portera tout
  77.     @img.bitmap=Bitmap.new(640,480) # on commence en mode non fixe, donc taille ecran
  78.     @img.blend_type=2 # pour pouvoir assombrir l'ecran et faire des trous
  79.     @img.z=10 # avec ça des sprites de z<10 seront obscurcis
  80.     @img.opacity=op # opacité de la nuit ( et plus généralement, de ce que masque la carte)
  81.     @fond=Color.new(r,v,b,255) #stockage de la couleur de la nuit.
  82.     @repertoire="Pictures/lumieres"#répertoire dans Graphics/ ou seront prise les images.
  83.     maj # on appelle la fct de mise à jour pour que tout s'affiche direct
  84.   end
  85. #------# permet de basculer du mode non-fixe vers le mode fixe -------------
  86.   def inifixes
  87.     if not @fixes # si on à pas déjà basculé en fixe
  88.       #on va créer et remplir de la couleur de fond un bitmap de la taille de la carte
  89.       @bmp=Bitmap.new($game_map.width*32,$game_map.height*32)      
  90.       @bmp.fill_rect(@bmp.rect,@fond) # bmp sera notre rèference, on y collera les lums fixes
  91.       @img.bitmap=Bitmap.new($game_map.width*32,$game_map.height*32)
  92.       @img.bitmap.fill_rect(@img.bitmap.rect,@fond) # on met le bitmap affiché au bon format
  93.       @fixes=true # on memorise qu'on est passé en mode fixe
  94.     end
  95.   end
  96. #----- fonction centrale. Est appellée à chaque frame via Spritesetmap ci-dessous------------------
  97.   def maj
  98.     if @fixes # si on est en mode avec lumières fixes
  99.       @img.ox=$game_map.display_x/4 # déplacer l'image avec la carte
  100.       @img.oy=$game_map.display_y/4
  101.     end
  102.     @img.visible=true
  103.     return if Graphics.frame_count%@periode != 0 or @id_map != $game_map.map_id # gain de fps
  104.     reparer  # on rebouche les trous qui ont été fait à la frame d'avant
  105.     trouer # on fait les trous requis pour cette frame (les lums)
  106.     proteger # application de l'option de protection "antilum"
  107.   end  
  108. #------rebouche les trous qui ont été fait à la frame d'avant-----------------------------------------------------
  109. def reparer
  110.   if not @fixes
  111.     @img.bitmap.fill_rect(@img.bitmap.rect,@fond)
  112.     @reparations=[]
  113.   else
  114.     @reparations.each{|reparation|
  115.     @img.bitmap.blt(reparation.x,reparation.y,@bmp,reparation) }  
  116.     @reparations=[]
  117.   end
  118. end
  119. #--------commande les trous requis à chaque frame-------------------------------------------------------------
  120. def trouer
  121.   @lums.each_value{|lum|
  122.     coller_le_trou(false,
  123.       lum.nom,lum.x,lum.y,lum.op,lum.dx,lum.dy,lum.id,lum.zx,lum.zy) }
  124. end
  125. #--------les antilums protègent certaines zone en effacant les lumières
  126. def proteger  
  127.   @antilums.each{|antilum|
  128.     x=antilum.x-(@fixes ? 0 : $game_map.display_x/4)
  129.     y=antilum.y-(@fixes ? 0 : $game_map.display_y/4)
  130.     @img.bitmap.fill_rect(Rect.new(x,y,antilum.width,antilum.height),@fond) }
  131.   @proctections.each{|proctection|
  132.     nom,x,y,id,op,dx,dy,zx,zy=proctection
  133.     coller_le_trou(false,nom,x,y,op,dx,dy,id,zx,zy) }
  134. end
  135. #--------- calcule les coordonées du trou à partir de son id ou lum.x et y
  136. def calculer_coords(x,y,id,dx,dy,image,tx,ty,fixe=false)
  137.   if x==nil # si aucun x n'a été entré, on fixe la lum sur l'event id
  138.     return [$game_map.display_x/4,$game_map.display_y/4] if id.is_a?(String)      
  139.     id==0 ? ev=$game_player : ev=$game_map.events[id]
  140.     x=ev.screen_x #donc on calcule le x/map de cet event
  141.     y=ev.screen_y
  142.     x+=dx # ajustement précis des coordonées par un petit facteur optionnel
  143.     y+=dy
  144.     return [nil,nil] if (x-tx/2>640 or y-ty/2>480 or x+tx/2<0 or y+ty/2<0) and not fixe
  145.     x-=tx/2 # centrage de l'image sur les coords
  146.     y-=ty/2
  147.   else
  148.     if not id.is_a?(String) # si l'id est une String, x est une coord/map en pixel
  149.       x-=$game_map.display_x/4 # on les convertis en /ecran
  150.       y-=$game_map.display_y/4      
  151.     end # sinon si id est une string, c'est une coord/ecran en pixel  
  152.     x+=dx # ajustement précis des coordonées par un petit facteur optionnel
  153.     y+=dy
  154.     return [nil,nil] if (x>640 or y>480 or x+tx<0 or y+ty<0) and not fixe
  155.   end  
  156.   x+=$game_map.display_x/4 if @fixes # conversion en coords /MAP
  157.   y+=$game_map.display_y/4 if @fixes # mais seulement pour le mode avec lums fixes
  158.   return [x,y] #les coord renvoyées sont par rapport à la MAP ( et en pixels)
  159. end
  160. #--------fct qui fait vraiment le trou-------------------------------------------------------------
  161. def coller_le_trou(fixe,image,x,y,op=255,dx=0,dy=0,id=0,zx=1,zy=1)
  162.   inifixes if fixe
  163.   image=RPG::Cache.load_bitmap("Graphics/"+@repertoire+"/",image) if image.is_a?(String) # charge de l'image à partir du nom de fichier  
  164.   tx,ty=image.width*zx,image.height*zy #simple mémo de la taille de l'image    
  165.   x,y=calculer_coords(x,y,id,dx,dy,image,tx,ty,fixe)
  166.   return if x==nil
  167.   op>255 ? op=255 : (op<0 ? op=0 : nil )      
  168.   #maintenant on passe au collage lui-même.  
  169.   @img.bitmap.stretch_blt(Rect.new(x,y, tx,ty), image,image.rect,op)
  170.   if fixe # sauvegarde du trou dans @bmp (si c'est une lumière fixe)
  171.           @bmp.stretch_blt(Rect.new(x,y,tx,ty), image,image.rect,op)
  172.   else # sinon sauvegarde de la zone trouée, pour effacer le trou plus tard
  173.     @reparations.push(Rect.new(x,y,tx,ty))
  174.   end
  175. end
  176. #---------------------------------------------------------------------
  177. end# fin la classe Lumières_dynamiques
  178. #---------------------------------------------------------------------
  179. #---------------------------------------------------------------------
  180. class Spriteset_Map # modif pour que le script soit mise à jour automatiquement
  181.   alias lum_update update # court circuit de l'update. On la renomme en lum_update
  182.   def update # redefinition de update
  183.     lum_update   # fonction update normale de Spriteset_Map    
  184.     if $lum.is_a?(Lumières_dynamiques) and not $lum.img.disposed?  
  185.       $lum.maj   # maj si le script est en route    
  186.       if $lum.id_map != $game_map.map_id# quitter le script si on a changé de carte
  187.         $lum.img.dispose
  188.         $lum=nil
  189.       end
  190.     end
  191.   end
  192. #------------------------------------------------------
  193.   alias lum_dispose dispose
  194.     def dispose
  195.     lum_dispose
  196.      $lum.img.visible = $scene.is_a?(Scene_Map) if $lum.is_a?(Lumières_dynamiques) and not $lum.img.disposed?  
  197.    end
  198. end# fin la classe Spriteset_Map
  199. #---------------------------------------------------------------------
  200. #---------------------------------------------------------------------
  201.  
  202.   def cherche_tile(x,y,i)  #fct pour chercher les tiles identiques
  203.     tile_cible=$game_map.data[x, y, i] # on definit le carreau cherché
  204.     # maintenant on va le chercher
  205.     results=[]  #définition d'une var pr stocker les résultats
  206.     for x in 0...$game_map.data.xsize # pour chaque case de la carte
  207.       for y in 0...$game_map.data.ysize
  208.         for i in [2, 1, 0] # dans chaque couche
  209.           results.push([x,y,i]) if $game_map.data[x, y, i]==tile_cible # si tile est le même que l'exemple, on le stocke
  210.         end
  211.       end
  212.     end
  213.     return results # en renvoie les bons tiles
  214.   end
  215. #---------------------------------------------------------------------
  216. #---------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement