Pokémon Script Project Forum Index

Manuel | Search
 Information des admins 
Si vous désirez parler de PSP ou obtenir du soutient là dessus, merci d'aller faire un tour sur https://pokemonworkshop.com/forum/index.php Imbécile heureux

Script de palette V3 amelioré !
Goto page: 1, 2, 3  >
 
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts
Previous topic :: Next topic   
Author Message
Nuri Yuri
Team SDK


Joined: 15 Oct 2008
Posts: 6,383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

PostPosted: Sun 3 Jan - 17:37 (2010)    Post subject: Script de palette V3 amelioré !

Bonjour a tous !!!
Je vais vous partager un script que j'ai créé et que sphinx a amélioré !

I)Introduction


Chez Nintendo quand on met une image(sur ds) on fait des économie au lieu de mettre 3 images qui se ressemble comme deux goute d'eau mais qui ont des couleur différentes on met pas les 3 images ... on met une image et on met 3 palette de couleur.
A quoi ça sert ?
Ça sert tout simplement a économiser du poids car les images seront en 8 bit(pas 24) et les palette de couleur feront en général que 16 couleur de 24 bit donc ca pese deja beaucoup moins lourd (/3)

J'ai donc eu l'idée de crée un système qui peut faire presque la même chose !

II)Le script

Voici le script

Code:
#====================================================================
# Module PNG
#   -création & utilisation de palettes
#====================================================================
# Crédits obligatoires :
#     - Youri (R O.LAB) : Création du script & du concept
#     - Sphinx                 : Optimisation du script
#====================================================================

module PNG
  # PALETTE
  #   Chemin vers le fichier qui correspond à la palette de référence
  PALETTE = "Graphics/Pictures/palette.png"
 
  def self.generatePalette(*names)
    for name in names
      if not FileTest.exists?(name + ".png")
        print "Le fichier #{name}.png n'existe pas." if $DEBUG
        return
      elsif FileTest.exists?(name + "_p.png")
        print "La palette a déjà été générée. Si vous voulez regénérer la palette #{name}_p.png, veuillez d'abord supprimer la palette existante." if $DEBUG
        return
      end
    end
    pColors = []
    pImg = Bitmap.new(PALETTE)
    for x in 0...pImg.width
      c = pImg.get_pixel(x, 0)
      pColors.push(c.to_a)
    end
    pColors.uniq!
    palette = Bitmap.new(pColors.size, names.size)
    for name in names
      img = Bitmap.new(name + ".png")
      colors = []
      for x in 0...img.width
        for y in 0...img.height
          c = img.get_pixel(x, y)
          colors.push(c.to_a)
        end
      end
      colors.uniq!
      for i in 0...colors.size
        palette.set_pixel(i, names.index(name), Color.new(colors[i][0], colors[i][1], colors[i][2], colors[i][3]))
      end
    end
    for x in 0...img.width
      for y in 0...img.height
        c = img.get_pixel(x, y)
        c = pColors[colors.index(c.to_a)]
        c = Color.new(c[0], c[1], c[2], c[3])
        img.set_pixel(x, y, c)
      end
    end
    img.make_png("#{name}", "", 1)
    palette.make_png("#{name}_p", "", 1)
    str = names * "\n\t- "
    print "La palette correspondante aux fichiers suivants :\n\t- #{str}\na bien été créée." if $DEBUG
  end
 
  def self.load(name, x = 320, y = 240, z = 100, opa = 255, zx = 1, zy = 1, pos = 4, idColor = 1)
    return unless FileTest.exists?(name + ".png") and FileTest.exists?(name + "_p.png")
    fr = Graphics.frame_rate
    Graphics.frame_rate = 100000
    Graphics.freeze
    # Création de l'image
    image = Sprite.new
    image.bitmap = Bitmap.new(name + ".png")
    image.x = x
    image.y = y
    image.z = z
    image.opacity = opa
   
    # Position de l'image
    # --------------------------------
    # |     0     |     1     |     2     |
    # --------------------------------
    # |     3     |     4     |     5     |
    # --------------------------------
    # |     6     |     7     |     8     |
    # --------------------------------
    case pos % 9
    when 1
      image.x -= image.bitmap.width * zx / 2
    when 2
      image.x -= image.bitmap.width * zx
    when 3
      image.y -= image.bitmap.height * zy / 2
    when 4
      image.x -= image.bitmap.width * zx / 2
      image.y -= image.bitmap.height * zy / 2
    when 5
      image.x -= image.bitmap.width * zx
      image.y -= image.bitmap.height * zy / 2
    when 6
      image.y -= image.bitmap.height * zy
    when 7
      image.x -= image.bitmap.width * zx / 2
      image.y -= image.bitmap.height * zy
    when 8
      image.x -= image.bitmap.width * zx
      image.y -= image.bitmap.height * zy
    end
   
    ref = Bitmap.new(PALETTE)
    palette = Bitmap.new(name + "_p.png")
    colors = [[], []]
    for x in 0...ref.width
      colors[0].push(ref.get_pixel(x, 0).to_a)
      colors[1].push(palette.get_pixel(x, idColor - 1))
    end
   
    for x in 0...image.bitmap.width
      for y in 0...image.bitmap.height
        c = colors[1][colors[0].index(image.bitmap.get_pixel(x, y).to_a)]
        image.bitmap.set_pixel(x, y, c)
      end
    end
    image.zoom_x = zx
    image.zoom_y = zy
    Graphics.frame_rate = fr
    Graphics.transition(5)
    return image
  end
end

class Array
  def gsub!(old, new)
    self.each_index{ |i|
      self[i] = new if self[i] == old
    }
  end
 
  def to_c
    return if self.size < 3
    return Color.new(self[0], self[1], self[2], (self[3].is_a?(Numeric) ? self[3] : 255))
  end
end

class Color
  def to_a
    return [self.red, self.green, self.blue, self.alpha]
  end
end



Code:
#====================================================================
# Create Bitmap
#     -création de fichiers PNG à partir d'un objet Bitmap
#====================================================================
# Crédits obligatoires :
#     - Vgvgf           :  Création du code
#     - Sphinx          : Adaptation du script à RMXP/PSP
#====================================================================

module Zlib
  class Png_File < GzipWriter
    def make_png(bitmap, mode = 0)
      @bitmap, @mode = bitmap, mode
      self.write(make_header)
      self.write(make_ihdr)
      self.write(make_idat)
      self.write(make_iend)
    end
   
    def make_header
      return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*')
    end
   
    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
   
    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
   
    def make_bitmap_data0
      gz = Zlib::GzipWriter.open('Png2.tmp')
      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('Png2.tmp')
      data = gz.read
      gz.close
      File.delete('Png2.tmp')
      return data
    end
   
    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
   
    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 Bitmap
  def make_png(name, path = "", mode = 0)
    Zlib::Png_File.open('Png.tmp')   { |gz| gz.make_png(self, mode) }
    Zlib::GzipReader.open('Png.tmp') { |gz| $read = gz.read }
    f = File.open(Dir.getwd + "/" + path + name + '.png', 'wb')
    f.write($read)
    f.close
    File.delete('Png.tmp')
  end
end

III)Instructions

Ajoutez ces 2 scripts au dessus de main, et ensuite vous pourrez utiliser les commandes suivantes :
  • Pour créer une palette à partir d'une image :
    Code:
    PNG.generatePalette(name)

    name représente le chemin complet vers le fichier. Le fichier sera écrasé et remplacé par la version aux couleurs de la palette de référence, et un fichier palette nommé name_p sera créé.
    Vous pouvez mettre plusieurs fichiers dans une même commande afin de créer une palette multiligne. Dans ce cas, chaque image correspondra à une ligne dans la palette, seule la dernière image sera remplacée par la base de l'image, et la palette portera le nom de la dernière image suivi de _p.
    La palette de référence est réglable dans la constante PALETTE dont vous pouvez changer la valeur ligne 13. Par défaut, elle vaut :
    Code:
    "Graphics/Pictures/palette.png"

    Voici la palette de référence (22 couleurs) que Sphinx a choisi pour ses tests :


    (zoom x16)

    mais vous pouvez reprendre n'importe quelle autre palette, pourvu qu'il y ait assez de couleurs dessus, que PALETTE soit bien réglé au début du script et que vous conserviez la même.
  • Pour afficher une image :
    Code:
    votreVariableImage = PNG.load(name, x, y, z, opa, zx, zy, pos, idColor)

    où :
    • votreVariableImage : la variable qui contiendra l'image à afficher. La fonction retourne un objet Sprite.
    • name : nom & chemin vers l'image (sans .png à la fin !) - exemple : "Graphics/Pictures/persogars" pour afficher l'image "persogars" du dossier Graphics/Pictures
    • x : position X de l'image (0 => gauche de l'écran)
    • y : position Y de l'image (0 => haut de l'écran)
    • z : priorité de superposition de l'image (plus elle est élevée, plus l'image sera au dessus des autres)
    • opa : opacité de l'image (entre 0 - transparent - et 255 - opaque -)
    • zx : zoom horizontal de l'image (1 = 100%)
    • zy : zoom vertical de l'image (1 = 100%)
    • pos : point d'origine utilisé - 0 : pixel haut gauche | 1 : pixel haut centre | 2 : pixel haut droite | 3 : pixel milieu gauche | 4 : pixel milieu centre | 5 : pixel milieu droite | 6 : pixel bas gauche | 7 : pixel bas centre | 8 : pixel bas droite
    • idColor : 1 pour utiliser la 1° ligne de la palette, 2 pour la 2°, ...


IV)Vidéo

Bientôt ...

V)Credits

Sphinx - Amélioration du script
Vgvgf - Code pour create bitmap
Youri - Idée


Last edited by Nuri Yuri on Fri 8 Jan - 08:06 (2010); edited 7 times in total
Back to top
Facebook Twitter
Publicité






PostPosted: Sun 3 Jan - 17:37 (2010)    Post subject: Publicité

PublicitéSupprimer les publicités ?
Back to top
GT.Onizuka
Membre


Joined: 17 Dec 2009
Posts: 976
Localisation: Tunis, TUNISIE

PostPosted: Sun 3 Jan - 17:47 (2010)    Post subject: Script de palette V3 amelioré !

C'est super bien !
Ca marche en dehors de RPGMAKER càd avec les toshop' et cie.???
Si oui tu connais??? (à propos il y a un memebre (restrictions) qui a un avatar de giratina qui change de couleur.
Back to top
Skype
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Sun 3 Jan - 17:51 (2010)    Post subject: Script de palette V3 amelioré !

>> Ca peut être une bonne idée, Youri. Par contre, pourrais tu expliquer plus en détail comment on crée tes palettes de couleurs ? ^o^" Je n'ai pas bien compris ce point
Back to top
Nuri Yuri
Team SDK


Joined: 15 Oct 2008
Posts: 6,383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

PostPosted: Sun 3 Jan - 17:54 (2010)    Post subject: Script de palette V3 amelioré !

Ouai je vais l'expliquer en détail (ce qui est bette ce que mon script et un peut lent )

On commence avec notre objet :


On sélectionne la première couleur sur l'objet pour la mettre sur notre palette de couleur qui fait (1*16 pix) et ainsi de suite jusqu'à la 16ème couleur ou la dernière (note : prendre la couleur de transparence en dernier)
ce qui nous donne ceci :

Donc maintenant on enregistre la palette de couleur en 1x1
ce qui nous donne ceci :


Puis on modifie les couleur de l'objet avec les couleur donnée dans le tuto plus haut !
On modifier les couleur dans le même ordre qu'elle ont été prise!
ce qui donne ça :
Back to top
Facebook Twitter
Slash
Membre


Joined: 18 Jan 2008
Posts: 2,504
Localisation: MONTSURS (53)

PostPosted: Mon 4 Jan - 18:16 (2010)    Post subject: Script de palette V3 amelioré !

Un script tres original et assez utile ca fait plaisir
en tout cas beau boulot Youri
Back to top
Nuri Yuri
Team SDK


Joined: 15 Oct 2008
Posts: 6,383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

PostPosted: Mon 4 Jan - 19:22 (2010)    Post subject: Script de palette V3 amelioré !

Merci ^^ (je vais peut être mettre un système qui permet d'avoir toute les palette de couleur dans un seule fichier de palette )
Back to top
Facebook Twitter
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 4 Jan - 20:24 (2010)    Post subject: Script de palette V3 amelioré !

>> un convertisseur d'images ne serait pas du luxe ^o^" J'ai +/- compris ton système, mais je pense que je vais réfléchir à un moyen de générer des palettes & les images de base automatiquement Imbécile heureux
Back to top
Brendan75
Ex-staff


Joined: 24 Mar 2008
Posts: 1,827
Localisation: Paris
Masculin

PostPosted: Mon 4 Jan - 20:27 (2010)    Post subject: Script de palette V3 amelioré !

Avec un convertisseur d'images on pourrait utiliser ce script pour le shiney ce qui permeterai d'alléger grandement des dossiers PSP particulièrement lourd...

En tout cas Bravo ! :^^:

Au fait, pour regrouper plusieurs image en une ne suffirait-il pas de mettre les palettes les unes sous les autres et d'ajouter une variable "ligne" dans le script ?
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Mon 4 Jan - 20:30 (2010)    Post subject: Script de palette V3 amelioré !

brendan75 wrote:
Au fait, pour regrouper plusieurs image en une ne suffirait-il pas de mettre les palettes les unes sous les autres et d'ajouter une variable "ligne" dans le script ?


En effet, mais pas seulement. Il faudrait aussi ajouter un découpage de l'image, ce qui n'est pas non plus impossible à faire.
Back to top
Brendan75
Ex-staff


Joined: 24 Mar 2008
Posts: 1,827
Localisation: Paris
Masculin

PostPosted: Mon 4 Jan - 20:34 (2010)    Post subject: Script de palette V3 amelioré !

Je suis pas un pro du script mais si j'ai bien compris c'est la fonction "bitmap.get_pixel(x, y)" qui sert à définir les diférents éléments d'une pallette, le y est fixé à 0 pour l'instant, en le faisant varier selon une variable ça devrait marche je pense, vous en pensez quoi ?
Back to top
Nuri Yuri
Team SDK


Joined: 15 Oct 2008
Posts: 6,383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

PostPosted: Tue 5 Jan - 17:25 (2010)    Post subject: Script de palette V3 amelioré !

Ba cette fonction sert a capturer la couleur du pixel

Sphinx wrote:
>> un convertisseur d'images ne serait pas du luxe ^o^" J'ai +/- compris ton système, mais je pense que je vais réfléchir à un moyen de générer des palettes & les images de base automatiquement Imbécile heureux

J'y travaillerais !
Back to top
Facebook Twitter
Spiky
Membre


Joined: 06 Sep 2008
Posts: 82
Localisation: Utopia Island (Kanto) [Île d'Utopia (Kanto)]
Nintendo Network: SpikyC

PostPosted: Wed 6 Jan - 15:36 (2010)    Post subject: Script de palette V3 amelioré !

Alors ça c'est le script le plus innovateur afin de reproduire le fonctionnement des véritables jeux.
Il ne te reste plus qu'à faire en sorte qu'un pokémon normal prennent la palette 1 et un shiny la 2 automatiquement
et de refaire les scripts pour choisir la ressource graphique et indiquer quel palette va avec.
Bravo et continue comme ça.
Mais j'ai juste deux questions, comment faut-il enregistrer le ficher de palette et où faut-il le placer?
Merci
Back to top
Sphinx
Scribe
Scribe


Joined: 07 Jan 2008
Posts: 9,736
Localisation: Quelque part, dans le monde... Ou peut être sur une autre planète...
ID Steam: FaQuinator

PostPosted: Thu 7 Jan - 23:34 (2010)    Post subject: Script de palette V3 amelioré !

J'ai réussi à reprendre ce script & à l'optimiser un peu afin de générer les palettes & les images de base ainsi que d'afficher les images plus rapidement.

Code:
#====================================================================
# Module PNG
#   -création & utilisation de palettes
#====================================================================
# Crédits obligatoires :
#     - Youri (R.O.LAB) : Création du script & du concept
#     - Sphinx                 : Optimisation du script
#====================================================================

module PNG
  # PALETTE
  #   Chemin vers le fichier qui correspond à la palette de référence
  PALETTE = "Graphics/Pictures/palette.png"
 
  def self.generatePalette(*names)
    for name in names
      if not FileTest.exists?(name + ".png")
        print "Le fichier #{name}.png n'existe pas." if $DEBUG
        return
      elsif FileTest.exists?(name + "_p.png")
        print "La palette a déjà été générée. Si vous voulez regénérer la palette #{name}_p.png, veuillez d'abord supprimer la palette existante." if $DEBUG
        return
      end
    end
    pColors = []
    pImg = Bitmap.new(PALETTE)
    for x in 0...pImg.width
      c = pImg.get_pixel(x, 0)
      pColors.push(c.to_a)
    end
    pColors.uniq!
    palette = Bitmap.new(pColors.size, names.size)
    for name in names
      img = Bitmap.new(name + ".png")
      colors = []
      for x in 0...img.width
        for y in 0...img.height
          c = img.get_pixel(x, y)
          colors.push(c.to_a)
        end
      end
      colors.uniq!
      for i in 0...colors.size
        palette.set_pixel(i, names.index(name), Color.new(colors[i][0], colors[i][1], colors[i][2], colors[i][3]))
      end
    end
    for x in 0...img.width
      for y in 0...img.height
        c = img.get_pixel(x, y)
        c = pColors[colors.index(c.to_a)]
        c = Color.new(c[0], c[1], c[2], c[3])
        img.set_pixel(x, y, c)
      end
    end
    img.make_png("#{name}", "", 1)
    palette.make_png("#{name}_p", "", 1)
    str = names * "\n\t- "
    print "La palette correspondante aux fichiers suivants :\n\t- #{str}\na bien été créée." if $DEBUG
  end
 
  def self.load(name, x = 320, y = 240, z = 100, opa = 255, zx = 1, zy = 1, pos = 4, idColor = 1)
    return unless FileTest.exists?(name + ".png") and FileTest.exists?(name + "_p.png")
    fr = Graphics.frame_rate
    Graphics.frame_rate = 100000
    Graphics.freeze
    # Création de l'image
    image = Sprite.new
    image.bitmap = Bitmap.new(name + ".png")
    image.x = x
    image.y = y
    image.z = z
    image.opacity = opa
   
    # Position de l'image
    # --------------------------------
    # |     0     |     1     |     2     |
    # --------------------------------
    # |     3     |     4     |     5     |
    # --------------------------------
    # |     6     |     7     |     8     |
    # --------------------------------
    case pos % 9
    when 1
      image.x -= image.bitmap.width * zx / 2
    when 2
      image.x -= image.bitmap.width * zx
    when 3
      image.y -= image.bitmap.height * zy / 2
    when 4
      image.x -= image.bitmap.width * zx / 2
      image.y -= image.bitmap.height * zy / 2
    when 5
      image.x -= image.bitmap.width * zx
      image.y -= image.bitmap.height * zy / 2
    when 6
      image.y -= image.bitmap.height * zy
    when 7
      image.x -= image.bitmap.width * zx / 2
      image.y -= image.bitmap.height * zy
    when 8
      image.x -= image.bitmap.width * zx
      image.y -= image.bitmap.height * zy
    end
   
    ref = Bitmap.new(PALETTE)
    palette = Bitmap.new(name + "_p.png")
    colors = [[], []]
    for x in 0...ref.width
      colors[0].push(ref.get_pixel(x, 0).to_a)
      colors[1].push(palette.get_pixel(x, idColor - 1))
    end
   
    for x in 0...image.bitmap.width
      for y in 0...image.bitmap.height
        c = colors[1][colors[0].index(image.bitmap.get_pixel(x, y).to_a)]
        image.bitmap.set_pixel(x, y, c)
      end
    end
    image.zoom_x = zx
    image.zoom_y = zy
    Graphics.frame_rate = fr
    Graphics.transition(5)
    return image
  end
end

class Array
  def gsub!(old, new)
    self.each_index{ |i|
      self[i] = new if self[i] == old
    }
  end
 
  def to_c
    return if self.size < 3
    return Color.new(self[0], self[1], self[2], (self[3].is_a?(Numeric) ? self[3] : 255))
  end
end

class Color
  def to_a
    return [self.red, self.green, self.blue, self.alpha]
  end
end


J'utilise aussi une source que j'ai adapté d'un petit programme trouvé sur le net afin de générer en script des images au format PNG :

Code:
#====================================================================
# Create Bitmap
#     -création de fichiers PNG à partir d'un objet Bitmap
#====================================================================
# Crédits obligatoires :
#     - Vgvgf           :  Création du code
#     - Sphinx          : Adaptation du script à RMXP/PSP
#====================================================================

module Zlib
  class Png_File < GzipWriter
    def make_png(bitmap, mode = 0)
      @bitmap, @mode = bitmap, mode
      self.write(make_header)
      self.write(make_ihdr)
      self.write(make_idat)
      self.write(make_iend)
    end
   
    def make_header
      return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*')
    end
   
    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
   
    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
   
    def make_bitmap_data0
      gz = Zlib::GzipWriter.open('Png2.tmp')
      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('Png2.tmp')
      data = gz.read
      gz.close
      File.delete('Png2.tmp')
      return data
    end
   
    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
   
    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 Bitmap
  def make_png(name, path = "", mode = 0)
    Zlib::Png_File.open('Png.tmp')   { |gz| gz.make_png(self, mode) }
    Zlib::GzipReader.open('Png.tmp') { |gz| $read = gz.read }
    f = File.open(Dir.getwd + "/" + path + name + '.png', 'wb')
    f.write($read)
    f.close
    File.delete('Png.tmp')
  end
end


Ajoutez ces 2 scripts au dessus de main, et ensuite vous pourrez utiliser les commandes suivantes :
  • Pour créer une palette à partir d'une image :
    Code:
    PNG.generatePalette(name)

    name représente le chemin complet vers le fichier. Le fichier sera écrasé et remplacé par la version aux couleurs de la palette de référence, et un fichier palette nommé name_p sera créé.
    Vous pouvez mettre plusieurs fichiers dans une même commande afin de créer une palette multiligne. Dans ce cas, chaque image correspondra à une ligne dans la palette, seule la dernière image sera remplacée par la base de l'image, et la palette portera le nom de la dernière image suivi de _p.
    La palette de référence est réglable dans la constante PALETTE dont vous pouvez changer la valeur ligne 13. Par défaut, elle vaut :
    Code:
    "Graphics/Pictures/palette.png"

    Voici la palette de référence (22 couleurs) que j'ai choisi pour mes tests :


    (zoom x16)

    mais vous pouvez reprendre n'importe quelle autre palette, pourvu qu'il y ait assez de couleurs dessus, que PALETTE soit bien réglé au début du script et que vous conserviez la même.
  • Pour afficher une image :
    Code:
    votreVariableImage = PNG.load(name, x, y, z, opa, zx, zy, pos, idColor)

    où :
    • votreVariableImage : la variable qui contiendra l'image à afficher. La fonction retourne un objet Sprite.
    • name : nom & chemin vers l'image (sans .png à la fin !) - exemple : "Graphics/Pictures/persogars" pour afficher l'image "persogars" du dossier Graphics/Pictures
    • x : position X de l'image (0 => gauche de l'écran)
    • y : position Y de l'image (0 => haut de l'écran)
    • z : priorité de superposition de l'image (plus elle est élevée, plus l'image sera au dessus des autres)
    • opa : opacité de l'image (entre 0 - transparent - et 255 - opaque -)
    • zx : zoom horizontal de l'image (1 = 100%)
    • zy : zoom vertical de l'image (1 = 100%)
    • pos : point d'origine utilisé - 0 : pixel haut gauche | 1 : pixel haut centre | 2 : pixel haut droite | 3 : pixel milieu gauche | 4 : pixel milieu centre | 5 : pixel milieu droite | 6 : pixel bas gauche | 7 : pixel bas centre | 8 : pixel bas droite
    • idColor : 1 pour utiliser la 1° ligne de la palette, 2 pour la 2°, ...


Enjoy it !
Back to top
Nuri Yuri
Team SDK


Joined: 15 Oct 2008
Posts: 6,383
~Entity~
Localisation: Nancy
Non renseigné (Visible...)
ID Steam: Nuri_Yuri

PostPosted: Fri 8 Jan - 07:47 (2010)    Post subject: Script de palette V3 amelioré !

Sphinx wrote:
J'ai réussi à reprendre ce script & à l'optimiser un peu afin de générer les palettes & les images de base ainsi que d'afficher les images plus rapidement.

Enjoy it !

Merci sphinx ^^
Je vais mettre le script dans le premier post.

Edit : pour crée plusieurs palette il faut mettre :
Code:
PNG.generatePalette(name1,name2, ..., nameid) 

Et la dernière image donneras son nom a la palette
ex:
Code:
PNG.generatePalette("012","012 (2)")

sa feras : 012 (2)_p.png
et pour charger il faut mettre :
Code:
$votrevar = PNG.load("012 (2)", 1, 1, 5000, 255, 1, 1, 0, 1) #pour la pallete 1
$votrevar = PNG.load("012 (2)", 1, 1, 5000, 255, 1, 1, 0, 2) #pour la palette 2
Back to top
Facebook Twitter
Lén
Ex-staff


Joined: 11 Jan 2009
Posts: 1,725
Localisation: Aix
Masculin

PostPosted: Fri 8 Jan - 15:36 (2010)    Post subject: Script de palette V3 amelioré !

Mmmm j'ai survolé alors pas taper !

En fait tu nous propose de convertir une image en 8 bit en ayant au préalable enregistré sa palette de couleurs, puis en jeux ca la recolore comme il faut ?
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Pokémon Script Project Forum Index -> Game Making -> Ressources techniques -> Scripts All times are GMT + 1 Hour
Goto page: 1, 2, 3  >
Page 1 of 3

 
Jump to:  

Index | Free forum | Free support forum | Free forums directory | Report a violation | Cookies | Charte | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Thème par Thomas et l'équipe de la refonte PSP 2012 (version 1.0)