AccueilPortailCalendrierFAQRechercherMembresGroupesS'enregistrerConnexion

Partagez | 
 

 [Question bête] XP et les vifs [Résolu]

Aller en bas 
AuteurMessage
Seri
Modérateur
Modérateur
avatar

Masculin
Nombre de messages : 558
Age : 29
Projet(s) en cours : Oliver
Niveau Rpg Maker : Se débrouille
Jeux Préférés : FF9,FF12, Chrono Cross
Date d'inscription : 10/07/2012

MessageSujet: [Question bête] XP et les vifs [Résolu]   Mer 11 Sep 2013, 15:26

Bonjour bonjour !

J'ai une question bête pour vous utilisateurs assidus de RMXP!
Je suis en train de réaliser une animation sous forme de .gif avec Gimp. C'est pas très difficile, et on peut placer plus facilement ses images pour voir le résultat final. Seulement voilà, tant qu'à faire, pour éviter d'avoir à copier mes 30 frames en 30 images et ensuite les importer, j'aimerais fortement savoir s'il existe un quelconque artifice permettant à RMXP de lire et jouer les fichiers .GIF (en l'occurrence par dessus une image BG si possible.

Merci bien,

~Seri


Dernière édition par Seri le Mer 06 Nov 2013, 23:31, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Invité
Invité
avatar


MessageSujet: Re: [Question bête] XP et les vifs [Résolu]   Mer 11 Sep 2013, 18:48

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
Il y a ce script qui fonctionne avec cette dll: mediafire.com ?ljpcp231lhag94n

Et ça fonctionne comme ceci:
Code:
@gif = GifSprite.new("fichier.gif")
@gif.x = 25
@gif.z = 10
@gif.opacity = 128
# etc...
Crédits à Brendan75. (:

Mais sinon, il y a plein de programmes pour extraire chaque image d'un gif animé. C'est moins lourd. Si tu préfères cette méthode, mais que tu ne trouves pas, MP moi, je te le fais!
Revenir en haut Aller en bas
Seri
Modérateur
Modérateur
avatar

Masculin
Nombre de messages : 558
Age : 29
Projet(s) en cours : Oliver
Niveau Rpg Maker : Se débrouille
Jeux Préférés : FF9,FF12, Chrono Cross
Date d'inscription : 10/07/2012

MessageSujet: Re: [Question bête] XP et les vifs [Résolu]   Mer 11 Sep 2013, 19:20

Merci bien, je testerai. Le problème de l'extraction des images d'un gif c'est que si ton gif est constitué d'une centaines d'images tu dois te taper autant de "Afficher une image". Et c'est franchement lourd pour quelque chose de pas franchement capital... C'est ce que j'aurais fait sur 2k3, mais puisque ce projet sera bien mieux en 640x480, je prends XP.

~Seri
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Invité
Invité
avatar


MessageSujet: Re: [Question bête] XP et les vifs [Résolu]   Mer 11 Sep 2013, 20:20

Oh, avec une boucle en script, ça se fait vite.
Et de rien, ça me fait plaisir d'aider dès que je peux.
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: [Question bête] XP et les vifs [Résolu]   

Revenir en haut Aller en bas
 
[Question bête] XP et les vifs [Résolu]
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» le tchat question
» j'ai deux question qui m'intrigue
» question par un nul du GPS
» Question basique
» La question du graphiste geek soucieux de ses lombaires

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Fusion :: ZONE D'ENTRAIDE :: Questions sur Events & Rpg Maker-
Sauter vers: