Sujet n°9341
Posté par Brendan75 le 6 Mar - 13:09 (2011)
Titre : Lecteur de GIF
Bonjour !


Voici un petit script bioen pratique pour les animations : un lecteur de fichier gif. Ce script existe depuis longtemps dans Essential, voici une adaptation à PSP (et à RMXP en général). Comment l'utiliser ? Il vous faut avant tout ajouter le script et le fichier gif.dll

Code
Code:
#==============================================================================
# ■ GIF
# D'après un script de Pokémon Essentials, adapté par Brendan75
#-----------------------------------------------------------------------------
#   Lecture de Fichier .GIF et animations.
#==============================================================================
class GifSprite < Sprite
 
  #---------------------------------------------------------------------------
  # ● Fonctions DLL
  #---------------------------------------------------------------------------
  GTPF   = Win32API.new("gif.dll", "GifToPngFiles", 'pp', 'l')
  GTPFIM = Win32API.new("gif.dll", "GifToPngFilesInMemory", 'plp', 'l')
  CDS    = Win32API.new("gif.dll", "CopyDataString", 'lpl', 'l')
  FDS    = Win32API.new("gif.dll", "FreeDataString", 'l', '')
 
  #---------------------------------------------------------------------------
  # ● Variables Publiques
  #---------------------------------------------------------------------------
  attr_accessor :gifbitmaps
  attr_accessor :gifdelays

  #---------------------------------------------------------------------------
  # ● Get Data From Result
  #---------------------------------------------------------------------------
  def getDataFromResult(result)
    datasize = CDS.call(result, "", 0)
    ret = nil
    if datasize != 0
      data = "0" * datasize
      CDS.call(result, data, datasize)
      ret = data.unpack("V*")
    end
    FDS.call(result)
    return ret
  end
 
  #---------------------------------------------------------------------------
  # ● Initialize
  #---------------------------------------------------------------------------
  def initialize(file, viewport = nil)
    super(viewport)
    @gifbitmaps   = []
    @gifdelays    = []
    @totalframes  = 0
    @framecount   = 0
    @currentIndex = 0
    setup(file)
    self.bitmap = Bitmap.new(@gifbitmaps[0].width, @gifbitmaps[0].height)
    update
  end
 
  #---------------------------------------------------------------------------
  # ● Setup
  #---------------------------------------------------------------------------
  def setup(file)
    file = canonicalize(file)
    if (filestring = File.open(file, "rb"){|f| f.read(1)})
      filestrName = file
    elsif (filestring =File.open(file + ".gif", "rb"){|f| f.read(1)})
      filestrName = file + ".gif"
    end
    tmpBase = File.basename(file) + "_tmp_"
    filestring = File.open(filestrName, "rb"){|f| f.read } if filestring
    Dir.chdir(ENV["TEMP"]) do
      result = GTPFIM.call(filestring, filestring.length, tmpBase)
      @gifdelays = getDataFromResult(result)
      @totalframes = @gifdelays.pop
      for i in 0.. @gifdelays.length
        @gifdelays[i] = [@gifdelays[i], 1].max
        bmfile = sprintf("%s%d.png", tmpBase, i)
        if FileTest.exist?(bmfile)
          gifbitmap = Bitmap.new(bmfile)
          @gifbitmaps.push(gifbitmap)
          File.delete(bmfile)
        else
          @gifdelays.delete_at(i)
        end
      end
    end
  end
 
  #---------------------------------------------------------------------------
  # ● Update
  #---------------------------------------------------------------------------
  def update
    super
    if @gifbitmaps.length > 0
      @framecount += 2
      for i in 0.. @gifdelays.size-1
        @currentIndex = i if @gifdelays[i] <= @framecount % @totalframes
      end
    end
    self.bitmap.clear
    bitmap = @gifbitmaps[@currentIndex]
    rect = Rect.new(0, 0, bitmap.width, bitmap.height)
    self.bitmap.blt(0, 0, bitmap, rect)
  end
 
  #---------------------------------------------------------------------------
  # ● Each
  #---------------------------------------------------------------------------
  def each
    @gifbitmaps.each {|item| yield item }
  end
end
 
#==============================================================================
# ■ Fonctions Complémentaires
#==============================================================================
def strsplit(str, re)
  ret = []
  tstr = str
  while re =~tstr
  ret[ret.length] = $~.pre_match
  tstr = $~.post_match
  end
  ret[ret.length] = tstr if ret.length
  return ret
end

def canonicalize(c)
  csplit = strsplit(c, /[\/\\]/)
  pos = -1
  ret = []
  retstr = ""
  for x in csplit
    if x == "."
     
    elsif x == ".."
      ret.delete_at(pos) if pos >= 0
      pos -= 1
    else
      ret.push(x)
      pos += 1
    end
  end
  for i in 0...ret.length
    retstr += "/" if i > 0
    retstr += ret[i]
  end
  return retstr
end

Pour créer une image GIF, il suffit de creér un nouveau GifSprite qui se comporte quasiment comme un Sprite normal, à l'exception de tout ce qui concerne les bitmaps bien sûr. Le fichier GIF est le premier attribut d'initialisation.
Code:
@gif = GifSprite.new("fichier.gif")
@gif.x = 25
@gif.z = 10
@gif.opacity = 128
# etc...


Voilà tout, j'espère que ça vous aidera.

Posté par Tinei le 6 Mar - 15:24 (2011)
Oh Cooooooooooooooooooooool !
Merciiiiiiiiiiiiiiii
Bravoooooooooooooooooooooo !
Oh la la depuis le temps que j'attend ça !
Merci infiniment.

Posté par Wildstylez le 6 Mar - 15:41 (2011)
Merci brendan. Par contre pour les combats, si on veut changer les fronts, y'aura toujours le ".png"qui sera compté nan ?

Posté par Brendan75 le 6 Mar - 15:48 (2011)
En effet, mais il suffit de modifier un peu les lignes 200 et suivantes du script "Pokemon".

Posté par Wildstylez le 6 Mar - 16:42 (2011)
Arf, ça ne s'anime pas chez moi. Suis-je le seul ? ( je précise que ce n'est pas un front de battler pendant un combat que j'ai testé, étant encore trop peu expérimenté en scripts, mais un sprite (exemple) qui est censé s'animer dès l'ouverture du menu ).

Posté par Brendan75 le 6 Mar - 17:15 (2011)
Il faut updater les images régulièrement pour voir l'animation. Tu l'as fait ?

Posté par Wildstylez le 6 Mar - 17:17 (2011)
Hum... C'est-à-dire ? ^^'

Posté par Brendan75 le 6 Mar - 17:47 (2011)
bah mettre sprite.update quoi... Si ça ne 'évoque rien, il faut revoir tes cours de RGSS.

Posté par Tinei le 6 Mar - 19:04 (2011)
Wildstylez a écrit:
Merci brendan. Par contre pour les combats, si on veut changer les fronts, y'aura toujours le ".png"qui sera compté nan ?


En effet, ce serais bien, et aussi pour le menu.
Mais je vous laisse avec ça, parce que la programmation, c'est pas mon fort.

Posté par Wildstylez le 6 Mar - 19:14 (2011)
Hormis quelques bugs graphiques ( je ne sais pas si c'est dû au gif ), ça marche bel et bien, merci. Je vais essayer de voir pour les combats maintenant.

Posté par Gryfenfeu le 6 Mar - 20:36 (2011)
Ce script marche t'il avec les sprites animé que Speed a poster dans les ressources ?

Posté par Wildstylez le 6 Mar - 21:26 (2011)
Oui, mais il y a des bugs graphiques en fait. Donc je sais pas si ça vient de moi, des gifs, ou du script.

Posté par Brendan75 le 6 Mar - 22:37 (2011)
Quels bugs graphiques ?

Posté par Oli-link le 7 Mar - 18:03 (2011)
comment faire pour que les front et les backs des pokémons soit en gif?

Posté par Wildstylez le 8 Mar - 13:37 (2011)
Brendan75 a écrit:

Quels bugs graphiques ?

J'ai ça par exemple :


Posté par Brendan75 le 8 Mar - 18:51 (2011)
Je pense qu'il doit s'agir du gif, ici.

Posté par Dark Palkia le 10 Mar - 18:07 (2011)
sa me met syntax error a la ligne 8 :?

Posté par Brendan75 le 10 Mar - 18:09 (2011)
Cette ligne est vide, je ne vois aucune erreur possible, essaies de copier/coller le code à nouveau.

Posté par sassouna le 14 Mar - 18:59 (2011)
Merci beaucoup c'est super par contre t'aurais pas le pack des pokemon de la 5G animé? stp

Posté par Giratinaprimal le 15 Mar - 17:39 (2011)
Où placer le fichier gif.dll ? Il n'est pas détecté et...


RuntimeError
LoadLibrary: gif.dll

Posté par Brendan75 le 16 Mar - 08:16 (2011)
Dans le premier dossier du jeux, là où il y a le rgss, le fichier game, etc.

Posté par Giratinaprimal le 16 Mar - 13:39 (2011)
Même dans le dossier racine du projet, ça plante.
Rmq : j'ai mis ce fichier dans le dossier C:\Windows\System32
sur Windows7.

Posté par sassouna le 19 Mar - 14:23 (2011)
lorsque je fais un combat le pokemon ennemi s'affiche meme pas !

Posté par Brendan75 le 19 Mar - 17:23 (2011)
Comment veux tu que je t'aide, c'est toi qui a fait tes scripts, non ?

Posté par Slash le 21 Mar - 20:23 (2011)
a étudier et a approfondir mais voila un script qui semble intéressant

Posté par marcelinhopb le 15 Mai - 15:53 (2011)
Bonjour est ici en erreur à la ligne 20 je vous demande de m'aider en 
s'il vous plaît.
Je ne suis pas français ni l'anglais, je suis Brésilien, je suis l'aide de Google pour traduire.


J'utilise le 5G PSP DS vous pouvez me dire si elle prend la 
Script?

Posté par Brendan75 le 17 Mai - 06:54 (2011)
Un log complet s'il te plait. ^^'

Posté par Yorick le 14 Aoû - 11:14 (2011)
Je suis désolé pour le gros Néchropost  :(

Mais le fichier Gif.dll n'est plus disponible, donc le lien est mort =S
Je suis vraiment désolé =(

Posté par Brendan75 le 18 Aoû - 14:18 (2011)
J'ai remis un lien.

Posté par Guigui28240 le 28 Aoû - 01:40 (2011)
Désolé si je fais du necroposte mais je voulais savoir où mettre ses sprites animés? Merci

Posté par Brendan75 le 28 Aoû - 08:57 (2011)
Dans un script.

Posté par Guigui28240 le 28 Aoû - 13:03 (2011)
Ok je sais pas comment on fait mais juste comment il faut les nommer ect merci

Posté par Brendan75 le 28 Aoû - 15:49 (2011)
C'est marqué dans le premier post, il faut lire avant de poser des questions...

Posté par Guigui28240 le 28 Aoû - 16:32 (2011)
ok merci je me débrouillerai

Posté par Warp' le 11 Jan - 03:36 (2012)
Je suis désolé de faire du nécropost, mais le lien du DLL est mort.
Ça serait bien si le DLL pouvait être uploadé.
Merci à l'avance.

Posté par Brendan75 le 11 Jan - 07:58 (2012)
C'est bon, lien mis à jour.

Posté par Zohran le 6 Aoû - 12:51 (2012)
Euh, désolé de te réembêté avec cela mais j'ai un soucis, dans un event j'ai crée un gif
donc:

@prof = GifSprite.new("Graphics/Pictures/Prof.gif")
@prof.setup("Graphics/Pictures/Prof.gif")
@prof.x = 90
@prof.y = 45

J'active un interrupteur local A

Dans un autre event en parallèle, dès que cet interrupteur local est activé (donc en condition), j'ai fait appel de script:

@prof.update

... et devine quoi??? Le gif ne s'anime pas, j'y comprend rien??? Une aide svp?
Pourtant l'event de l'update est bien en parallèle c'est à rien y comprendre !

Posté par Moy le 11 Aoû - 17:44 (2012)
Les interrupteurs locaux sont propre à l'évent, donc si tu active un interrupteur local sur un évent, il n'est pas activé sur un autre Clin d'œil foireux

Posté par Lonel le 15 Aoû - 18:15 (2012)
J'ai utilisé le lecteur de gif, et quand j'ai testé, ça a planté. Apparemment, c'est dans le script que ça bug.
Voici ce que ça disant dans le fichier log:
---------- Erreur de script : évènement ----------
----- Type
Errno::ENOENT

----- Message
Section200:58:in `initialize'No such file or directory - GraphicsPicturesintro-prof-érable.gif

----- Position de l'évènement
MAP 1 EVENT 2
SCRIPT
@gif = GifSprite.new("Graphics\Pictures\intro-prof-érable.gif") 
@gif.x = 320 
@gif.z = 240 
@gif_x = 200.0
@gif_y = 200.0
@gif.opacity = 128
@gif.blend_type = 1
@gif.duration = 0
@gif.target_x = @x
@gif.arget_y = @y
@gif.target_zoom_x = @zoom_x
@gif.target_zoom_y = @zoom_y
@gif.target_opacity = @opacity
@gif.tone = Tone.new(0, 0, 0, 0)
@gif.tone_target = Tone.new(0, 0, 0, 0)
@gif.tone_duration = 0
@gif.angle = 0
@gif.rotate_speed = 0


----- Backtrace
Script : Interpreter Bis | Ligne : 444 | Méthode : in `command_355'
Script : GIF | Ligne : 58 | Méthode : in `open'
Script : GIF | Ligne : 58 | Méthode : in `setup'
Script : GIF | Ligne : 48 | Méthode : in `initialize'
Script : Loading | Ligne : 1 | Méthode : in `new'
Script : Loading | Ligne : 1 | Méthode : in `command_355'
Script : Interpreter 2 | Ligne : 215 | Méthode : in `eval'
Script : Interpreter Bis | Ligne : 444 | Méthode : in `command_355'
Script : Interpreter 2 | Ligne : 215 | Méthode : in `execute_command'
Script : Interpreter 1 | Ligne : 199 | Méthode : in `update'
Script : Interpreter 1 | Ligne : 113 | Méthode : in `loop'
Script : Interpreter 1 | Ligne : 204 | Méthode : in `update'
Script : Scene_Map | Ligne : 48 | Méthode : in `alias_update'
Script : Scene_Map | Ligne : 46 | Méthode : in `loop'
Script : Scene_Map | Ligne : 59 | Méthode : in `alias_update'
Script : MAPPANEL | Ligne : 90 | Méthode : in `old_update'
Script : TempsJourNuit | Ligne : 248 | Méthode : in `update_passminimap'
Script : Minimap | Ligne : 44 | Méthode : in `update'
Script : Scene_Map | Ligne : 25 | Méthode : in `old_main'
Script : Scene_Map | Ligne : 19 | Méthode : in `loop'
Script : Scene_Map | Ligne : 30 | Méthode : in `old_main'
Script : TempsJourNuit | Ligne : 237 | Méthode : in `main_passminimap'
Script : Minimap | Ligne : 31 | Méthode : in `main'
Script : Main | Ligne : 57
Esc-ce que c'est moi qui ai fait une erreur dans la commande, où est-ce que c'est dans le script? Parce que mon fichier est bien là où j'ai dit au logiciel de le chercher...

Posté par Maxime le 15 Aoû - 19:19 (2012)
Il te manque le fichier .gif. Clin d'œil foireux

Posté par Lonel le 15 Aoû - 20:19 (2012)
Justement, non! Ce qui est inexplicable, c'est que le fichier est bel et bien là. Je l'ai vérifié, c'est d’ailleurs la première chose que j'ai faite en voyant le rapport d'erreur.

Posté par Guigui28240 le 15 Aoû - 21:42 (2012)
Salut tout d'abord ce qui n'es pas normal c'est que le message dit qu'il manque :
Section200:58:in `initialize'No such file or directory - GraphicsPicturesintro-prof-érable.gif
Apparament il y a un big qui fait que le fichier doit s'appeler GraphicsPicturesintro-prof-érable.gif regarde dans le script de brendan si il ne manque pas des "/" et au pire si tu pourrais donner le nom de ton navigateur sa serait encore mieux

Posté par Lonel le 15 Aoû - 22:09 (2012)
Je crois que j'ai trouvé, mais je ne suis pas sûr. Je remarque que j'ai mis
@gif_x = 200.0
@gif_y = 200.0
au lieux de
@gif.zoom_x = 200.0
@gif.zoom_y = 200.0
C'est peut-être ça, même si je ne vois pas pourquoi il ne trouverais pas le fichier, qui est bien à sa place, à cause de ça.

Posté par Guigui28240 le 17 Aoû - 16:48 (2012)
Quel est ton navigateur web?

Posté par Laito' le 17 Aoû - 21:40 (2012)
Guigui28240 a écrit:
Quel est ton navigateur web?


Quel est l'intérêt de cette question?

On parle de script pas d'internet. Jvois vraiment pas ce que tu veux dire.


encore un qui veut jouer les héros....

Posté par Pαlвσlѕку le 17 Aoû - 23:33 (2012)
L'erreur vient de toi, pas du script.
Tu as écris :
Code:
@gif = GifSprite.new("Graphics\Pictures\intro-prof-érable.gif")

Or c'est / que tu dois mettre et non \. Pour le script, \ = "" donc aucun caractère.

Ainsi, il te suffit de corriger ton code :
Code:
@gif = GifSprite.new("Graphics/Pictures/intro-prof-érable.gif")

Le navigateur n'a rien à voir là-dedans, mais pour information il utilise Mozilla Firefox.

Posté par Guigui28240 le 18 Aoû - 19:09 (2012)
Bah a un moment j'ai eu un script qui marchait pas car j'etais sous chrome et puis en allant avec mozilla Firefox le script fonctionnait bien

Posté par Zohran le 29 Nov - 13:30 (2012)
Bonjour Brendan, cela faisait longtemps, actuellement j'intègre les gifs dans PSP 5G V0.2, ça marche bien, mais j'ai un soucis, un gros, je n'arrive pas à updater correctement le gif. Je m'explique, j'ai beau mettre @gif.update, lorsque dans pokémon statut ou dans un combat lorsque je change de pokémon, le gif reste toujours celui du 1er pokémon, mais il est animé !!!! Bouche extensible Donc cela ne viens pas d'un mauvais update???? Tu pourrais m'aider svp? (en plus c'est le seul bug que j'ai...)

Posté par og_loc-TATOO le 29 Nov - 16:56 (2012)
J'en profite au passage pour dire que le lien est mort ^^

Il faudrait le remettre à jour, j'en ai besoin ^^

Merci d'avance. Gros matou qui ronronne

Posté par Zohran le 29 Nov - 21:48 (2012)
Tu peux récupérer la dll en téléchargeant pokemon essentials Clin d'œil foireux

EDIT: Brendan, laisse tomber, je n'intègrerais pas les gifs, c'est... juste trop instable...

Posté par Master of Dragons le 9 Avr - 23:48 (2013)
Moi ça m'intéresse de récupérer le gif.dll