Sujet n°5252
Posté par Angi-MK le 25 Oct - 06:52 (2009)
Titre : [Script] Lecteur de GIF
Je ne comprends pas bien la technique, mais dans essential ils arrivent à afficher des gifs avec une DLL (http://www.sendspace.com/file/vex1u8) et ce code.

a qui veut tenter de déchiffrer cette chose... Coupable
Code:
module GifLibrary
  @@loadlib=Win32API.new("Kernel32.dll","LoadLibrary",'p','')
  if FileTest.exist?("gif.dll")
   PngDll=@@loadlib.call("gif.dll")
   GifToPngFiles=Win32API.new("gif.dll","GifToPngFiles",'pp','l')
   GifToPngFilesInMemory=Win32API.new("gif.dll","GifToPngFilesInMemory",'plp','l')
   CopyDataString=Win32API.new("gif.dll","CopyDataString",'lpl','l')
   FreeDataString=Win32API.new("gif.dll","FreeDataString",'l','')
  else
   PngDll=nil
  end
  def self.getDataFromResult(result)
   datasize=CopyDataString.call(result,"",0)
   ret=nil
   if datasize!=0
    data="0"*datasize
    CopyDataString.call(result,data,datasize)
    ret=data.unpack("V*")
   end
   FreeDataString.call(result)
   return ret
  end
end

class GifSprite
 # Creates a sprite from a GIF file with the specified
 # optional viewport.  Can also load non-animated bitmaps.
 def initialize(file,viewport=nil)
  @gifbitmaps=[]
  @gifdelays=[]
  @totalframes=0
  @framecount=0
  @sprite=Sprite.new(viewport)
  bitmap=nil
  filestring=pbGetFileString(file)
  filestring=pbGetFileString(file+".gif") if !filestring
  filestring=pbGetFileString(file+".png") if !filestring
  filestring=pbGetFileString(file+".jpg") if !filestring
  filestring=pbGetFileString(file+".bmp") if !filestring
  if filestring && filestring[0]!=0x47
   begin
    bitmap=BitmapCache.load_bitmap(file)
   rescue
    bitmap=nil
   end
  end
  if bitmap
   # Have a regular non-animated bitmap
   @totalframes=1
   @framecount=0
   @gifbitmaps=[bitmap]
   @gifdelays=[1]
   @sprite.bitmap=@gifbitmaps[0]
  else
   if filestring && GifLibrary::PngDll
    result=GifLibrary::GifToPngFilesInMemory.call(filestring,filestring.length,File.basename(file))
   else
    result=0
   end
   if result>0
    @gifdelays=GifLibrary.getDataFromResult(result)
    @totalframes=@gifdelays.pop
    for i in 0... @gifdelays.length
     @gifdelays[i]=[@gifdelays[i],1].max
     bmfile=sprintf("%s%d.png",File.basename(file),i);
     if FileTest.exist?(bmfile)
       @gifbitmaps.push(Bitmap.new(bmfile))
       File.delete(bmfile)
     else
       @gifbitmaps.push(Bitmap.new(1,1))
     end
     @sprite.bitmap=@gifbitmaps[0]
    end
   end
  end
 end
 def bitmap
  @totalframes<=0 ? nil : @gifbitmaps[0]
 end
 def totalframes
  @totalframes
 end
 def currentframe
  @totalframes<=0 ? 0 : @framecount%@totalframes
 end
 def disposed?
  @sprite.disposed?
 end
 def viewport
  @sprite.viewport
 end
 def width
  @gifbitmaps.length==0 ? 0 : @gifbitmaps[0].width
 end
 def height
  @gifbitmaps.length==0 ? 0 : @gifbitmaps[0].height
 end
 # This function must be called in order to animate
 # the GIF image.
 def update
  @sprite.update
  if @gifbitmaps.length>0
   @framecount+=2
   frame=@totalframes<=0 ? 0 : @framecount%@totalframes
   frametoshow=0
   for i in 0... @gifdelays.length
    frametoshow=i if @gifdelays[i]<=frame
   end
   @sprite.bitmap=@gifbitmaps[frametoshow]
  end
 end
 def dispose
  @sprite.dispose
  for i in @gifbitmaps
   i.dispose
  end
 end
 def flash(*arg); sprite.flash(*arg); end
 %w[
   x y z ox oy visible zoom_x zoom_y
   angle mirror bush_depth opacity blend_type
   color tone
 ].each do |s|
  eval <<-__END__
   def #{s}; @sprite.#{s}; end
   def #{s}=(value); @sprite.#{s}=value; end
  __END__
 end
end

Posté par Rbzproject le 25 Oct - 10:55 (2009)
Ah,non essential n'utilise pas de GIF,pour faire une image animé, il prenne
une image comme celle-ci :
Spoiler

puis ils s'utilise un code pour découper l'image,enfin je crois. :D

Posté par Angi-MK le 25 Oct - 22:41 (2009)
Non non, les gifs marchent, testé et fonctionnel (sur essential)

Posté par Rbzproject le 26 Oct - 00:11 (2009)
Whaow ils sont de la chance.XD
Beh tu fais image par image c'est pareils.^^ par exemple=montrer img1,effacer img1 et montrer img2
non sérieux j'en sais rien pour le script la, dsl.

Posté par Nuri Yuri le 26 Oct - 13:42 (2009)
Et on met quel code pour afficher  le fichier Gif ?
On fait comme RMXP ?

Posté par Angi-MK le 26 Oct - 16:15 (2009)
Ouais, afficher image mais a la place d'un PNG, tu choisi ton gif.
Et ça marche nickel, je vous fais un exemple ce soir.

Posté par PiVa le 26 Oct - 16:52 (2009)
Oh, hâte de voir ça.

Posté par Dark Palkia le 26 Oct - 22:38 (2009)
sa marche sur RMXP sans PSP ?!?

Posté par Angi-MK le 27 Oct - 04:57 (2009)


provenant de :


ps: ne me demandez pas pourquoi le sol change de couleur... ?!

Posté par PiVa le 27 Oct - 09:36 (2009)
Le sol change de couleur car dans les fichiers gifs c'est pas la même palette de couleur ! Et donc je pense que ça influence tous la map active quand le gif est présent.

Je ne suis pas sûr mais je pense que c'est ça.
Ouvre un Gif, avec Paint, ouvre un sprite pokémon (par exemple ça pourrait être autre chose), copie colle le sprite pokémon dans la fenêtre paint du gif, normalement, j'ai pas tester, les couleurs vont automatiquement changer.

Edit : Bein enfaite non, ce que je viens de dire ne donne pas le résultat que je veux, pourtant j'ai déjà eu des trucs semblable avec paint quand on copie colle d'un autre format vers un gif, tant pis.

Une chose est sûr c'est le gif qui fais changer la couleur du sol.

Posté par Angi-MK le 27 Oct - 14:33 (2009)
une autre chose est sûr, le lecteur marche.