Partagez
Aller en bas
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

[en cours] Hero Creator

le Ven 10 Oct 2008 - 8:53
Nous avons un projet: Hero Creator

faciliter la vie de ceux qui veulent personnaliser leur jeu... et combler les lacunes de rmvx...
Nous allons permettre la création de A a Z d'un héro, au cours de la partie !

Comment procéder:
  1. partir de ressources découpées, rangées dans des dossiers selon leur type: yeux, corps, cheveux...
  2. lister ces ressources dans rmvx via des tableaux
  3. afficher ces ressources, gerant leur superposition, pour assembler un charset
  4. enregistrer cette images sous forme png, dotée de la gestion alpha (transparence)
  5. une fois ce systeme mis en place, il nous sera très facile de faire la meme chose pour des facesets, battlers...


idées en plus:
  1. un systeme de choix de la luminosité/contraste/teinte
  2. un éditeur de caractérisitiques/compétences
  3. un zone de saisie du nom...
  4. optimisation...


Voila pour les grandes lignes...

Notez:
  1. que ce projet doit rester secret, pour eviter toutes questions inutiles
  2. chacun du groupe scripteur peut aider, intervenir, demander des explications
  3. le but de ces projets est non seulement de scripter, aider, mais aussi d'apprendre


Laché vo com, comme on dit !

amicalement, berka
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 9:03
double post volontaire pour vous annoncer que j'ai déja commencé la programmation du listing des ressources:
le tout bien expliqué Laughing
un conseil lisez le sur rmvx !


Code:
Root = "./creator/" #définition de l'emplacement des ressources ./ est le dossier du projet
class Game_Listing #définition de la classe
  attr_accessor :corps; :yeux; :bas; :haut; :accessoires #stockage des variables d'instance pour plus tard
  def initialize #méthode initialize
    d_corps = Dir.open(Root + "corps") rescue d_corps = Dir::mkdir(Root + "corps", 0777) #ouverture du dossier corps, le créer si il n'existe pas
    d_corps = d_corps.sort - [".", ".."] rescue nil # rangement des fichiers de A a Z on enleve tous les fichiers situés dans le dossier racine du projet
    @corps = []; @corps[0] = []; @corps[1] = [] # initialisation des tableaux a double entree:  @corps[1] contiendra les éléments féminins  @corps[0] le reste
    # on  prend chaque éléement du tableau d_corps, on verifie que c'est un fichier png. si son nom comporte "f-" comme feminin, on le place dans @corps[1] sinon...
    d_corps.each { |fichier| if File.ftype(Root+"corps/"+fichier) == "file"; fichier.include?("f-") ? @corps[1].push(fichier) : @corps[0].push(fichier) if fichier.include?(".png")end}
    #pareil pour les yeux
    d_yeux = Dir.open(Root + "yeux") rescue d_yeux = Dir::mkdir(Root + "yeux", 0777)
    d_yeux = d_yeux.sort - [".", ".."] rescue nil
    @yeux = []; @yeux[0] = []; @yeux[1] = []
    d_yeux.each { |fichier| if File.ftype(Root+"yeux/"+fichier) == "file"; fichier.include?("f-") ? @yeux[1].push(fichier) : @yeux[0].push(fichier) if fichier.include?(".png")end}
   
    d_bas = Dir.open(Root + "bas") rescue d_bas = Dir::mkdir(Root + "bas", 0777)
    d_bas = d_bas.sort - [".", ".."] rescue nil
    @bas = []; @bas[0] = []; @bas[1] = []
    d_bas.each { |fichier| if File.ftype(Root+"bas/"+fichier) == "file"; fichier.include?("f-") ? @bas[1].push(fichier) : @bas[0].push(fichier) if fichier.include?(".png")end}
   
    d_haut = Dir.open(Root + "haut") rescue d_haut = Dir::mkdir(Root + "haut", 0777)
    d_haut = d_haut.sort - [".", ".."] rescue nil
    @haut = []; @haut[0] = []; @haut[1] = []
    d_haut.each { |fichier| if File.ftype(Root+"haut/"+fichier) == "file"; fichier.include?("f-") ? @haut[1].push(fichier) : @haut[0].push(fichier) if fichier.include?(".png")end}
   
    d_accessoires = Dir.open(Root + "accessoires") rescue d_accessoires = Dir::mkdir(Root + "accessoires", 0777)
    d_accessoires = d_accessoires.sort - [".", ".."] rescue nil
    @accessoires = []; @accessoires[0] = []; @accessoires[1] = []
    d_accessoires.each { |fichier| if File.ftype(Root+"accessoires/"+fichier) == "file"; fichier.include?("f-") ? @accessoires[1].push(fichier) : @accessoires[0].push(fichier) if fichier.include?(".png")end}
   
  end
end
listing = Game_Listing.new #on appelle la classe de listing

je ne connais pas trop votre niveau en ruby !
si vous avez des questions, n'hésitez pas, on est la pour apprendre, a me demander des cours (vers 2-3h du mat' ) sur la chatbox !
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 10:15
Berka j'ai une question : on vire tous les scripts déjà présents ou tu veux en garder quelques uns qui serait utiles ?
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 11:03
en fait on cree un méga script qui se rajoutera à un projet. Le joueur pourra en début de jeu creer son propre perso !
avatar
Korndor
Fondatourson !

Fondatourson !
Nombre de messages : 4959
Age : 104
Localisation : Erem Vehyx
Avertissements : Avertissements infinis |-)
Distinction : Champion de boxe et au lit ! :O [Wax]
Être Mythique [Mister]
Papi Korndor qui a l'ostéoporose [Skillo]
Soldat Ikéa [Coco']
Un bonhomme, un vrai ! [Neresis]
Vieillard acariâtre [Didier Gustin]
Date d'inscription : 16/12/2007
http://www.rpgmakervx-fr.com/

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 11:12
Mais un script de ce genre n'existe-t-il pas déjà sur RRR?
Il me semble en avoir déjà vu un scratch
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 11:19
il en existait un pour xp.
pour vx, celui dont tu parles ne permet pas la creation de chara, mais juste de hero !
et puis ca peut etre un bon entrainement !
avatar
Korndor
Fondatourson !

Fondatourson !
Nombre de messages : 4959
Age : 104
Localisation : Erem Vehyx
Avertissements : Avertissements infinis |-)
Distinction : Champion de boxe et au lit ! :O [Wax]
Être Mythique [Mister]
Papi Korndor qui a l'ostéoporose [Skillo]
Soldat Ikéa [Coco']
Un bonhomme, un vrai ! [Neresis]
Vieillard acariâtre [Didier Gustin]
Date d'inscription : 16/12/2007
http://www.rpgmakervx-fr.com/

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 11:29
Oki ^^
Je m'informais juste Smile
Il faudrait juste essayer de trouver du monde motivé maintenant ^^
Bonne chance à vous tous! Wink
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 12:34
Merci Tret' ^^. Il est vrai que ça me permettra d'augmenter grandement mes capacités en script. Mais je sais pas si M.D pensait à ça comme projet.

Sinon pourquoi ne pas faire une version Hero maker comme logiciel ( sous forme de projet). Et après remodelé les scripts pour les intégrés à un jeu quelconque pour permettre la création de héros en début de partie. Et puis j'avais émis l'idée de faire une version anglaise mais ça c'est à voir.

Il faudrait aussi qu'un graphiste est accès à ce sous-forum pour nous aider non ?
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 10 Oct 2008 - 21:27
[code="Aray"]Sinon pourquoi ne pas faire une version Hero maker comme logiciel [/code]
pas trop compris... peut etre que c'est l'heure matinale ^^

pour ce qui est du graphiste, on pourra le faire un fois les bases posées, le noyau du systeme fini... dans la section recrutement
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Dim 12 Oct 2008 - 9:13
alors violà une petite modélation de ma part du script Scene_Title :
La méthode create_window_command :

Code:
def create_command_window
    s1 = Vocab::new_game
    s2 = Vocab::continue
    s3 = Vocab::shutdown
    s4 = "Hero_creator"
    @command_window = Window_Command.new(172, [s1, s2, s3,s4])
    @command_window.x = (544 - @command_window.width) / 2
    @command_window.y = 288
    if @continue_enabled                    # If continue is enabled
      @command_window.index = 1            # Move cursor over command
    else                                    # If disabled
      @command_window.draw_item(1, false)  # Make command semi-transparent
    end
    @command_window.openness = 0
    @command_window.open
  end

la méthode update :
Code:
def update
    super
    @command_window.update
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0    #New game
        command_new_game
      when 1    # Continue
        command_continue
      when 2    # Shutdown
        command_shutdown
      when 3
        $scene = Scene_Hero_Maker.new
      end
    end
  end

et voilà la classe Scene_Hero_Creator

Code:
class Scene_Hero_Creator
 
  def initialize(actor_index = 0)
    @actor_index = actor_index
    create_command_window
  end
 
  def create_command_window
    @command_window = Window_Command.new ( 150 ["Charaset","Faceset"])
  end
 
  def update
    super
    @command_window.update
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0 
    $scene = Scene_Chara.new
      when 1 
      $scene = Scene_Face.new
    end
  end
end
end

il doit surement y avoir des erreurs étant donné que j'ai pas pris le temps de tester.

Sinon berka je suis chaud pour un petit cours sur les scripts sur la CB donc dis moi ton heure et je tacherais d'y être.
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Dim 12 Oct 2008 - 9:29
pffiou ! voila, j'ai fini le systeme en lui meme...
listing des ressources
choix des ressources
visualisation en direct
et enregistrement du bitmap en fichier bmp...
Aray: en fait la scene creator est beaucoup plus complexe: mais vraiment merci de t'etre impliqué !
voici le script entier: je suis desolé, masi je n'ai pas eu le courage de commenter... mais je le ferai demain ! pour les questions >> CB

Game_Listing:
Spoiler:
Code:
Root = "./creator/"
class Game_Listing
  def initialize
    d_corps = Dir.open(Root + "corps") rescue d_corps = Dir::mkdir(Root + "corps", 0777)
    d_corps = d_corps.sort - [".", ".."] rescue nil
    @corps = []; @corps[0] = []; @corps[1] = []
    d_corps.each { |fichier| if File.ftype(Root+"corps/"+fichier) == "file"; fichier.include?("f-") ? @corps[1].push(fichier) : @corps[0].push(fichier) if fichier.include?(".png")end}
 
    d_yeux = Dir.open(Root + "yeux") rescue d_yeux = Dir::mkdir(Root + "yeux", 0777)
    d_yeux = d_yeux.sort - [".", ".."] rescue nil
    @yeux = []; @yeux[0] = []; @yeux[1] = []
    d_yeux.each { |fichier| if File.ftype(Root+"yeux/"+fichier) == "file"; fichier.include?("f-") ? @yeux[1].push(fichier) : @yeux[0].push(fichier) if fichier.include?(".png")end}
   
    d_bas = Dir.open(Root + "bas") rescue d_bas = Dir::mkdir(Root + "bas", 0777)
    d_bas = d_bas.sort - [".", ".."] rescue nil
    @bas = []; @bas[0] = []; @bas[1] = []
    d_bas.each { |fichier| if File.ftype(Root+"bas/"+fichier) == "file"; fichier.include?("f-") ? @bas[1].push(fichier) : @bas[0].push(fichier) if fichier.include?(".png")end}
   
    d_haut = Dir.open(Root + "haut") rescue d_haut = Dir::mkdir(Root + "haut", 0777)
    d_haut = d_haut.sort - [".", ".."] rescue nil
    @haut = []; @haut[0] = []; @haut[1] = []
    d_haut.each { |fichier| if File.ftype(Root+"haut/"+fichier) == "file"; fichier.include?("f-") ? @haut[1].push(fichier) : @haut[0].push(fichier) if fichier.include?(".png")end}
   
    d_objets = Dir.open(Root + "objets") rescue d_objets = Dir::mkdir(Root + "objets", 0777)
    d_objets = d_objets.sort - [".", ".."] rescue nil
    @objets = []; @objets[0] = []; @objets[1] = []
    d_objets.each { |fichier| if File.ftype(Root+"objets/"+fichier) == "file"; fichier.include?("f-") ? @objets[1].push(fichier) : @objets[0].push(fichier) if fichier.include?(".png")end}
 
    d_tete = Dir.open(Root + "tete") rescue d_tete = Dir::mkdir(Root + "tete", 0777)
    d_tete = d_tete.sort - [".", ".."] rescue nil
    @tete = []; @tete[0] = []; @tete[1] = []
    d_tete.each { |fichier| if File.ftype(Root+"tete/"+fichier) == "file"; fichier.include?("f-") ? @tete[1].push(fichier) : @tete[0].push(fichier) if fichier.include?(".png")end}
   
  end
  def type(type)
    case type
    when "Corps"; return @corps
    when "Tete"; return @tete
    when "Bas"; return @bas
    when "Haut"; return @haut
    when "Yeux"; return @yeux
    when "Objets"; return @objets
    end
    end
end
Scene_Creator:
Spoiler:
Code:
class Scene_Creator
  attr_accessor :categories
  def initialize
    $charset = []
    $sexe = 0
    @ok = false
    @cat = ["Corps", "Yeux", "Tete", "Haut", "Bas", "Objets"]
    @listing = Game_Listing.new
    @categories = Window_Command.new(394,@cat, 6, 0)
    @categories.index = 0;  @categories.active = false
    @categories.y = 416-@categories.height; @categories.x = 150
    @help_window = Window_Help.new
    @choix = Window_Command.new(150,["Choisir", 'Retirer', 'Suivant', 'Quitter'])
    @choix.height = 104; @choix.y = 416 - @choix.height
    @choix.active = true
    @listes = Window_Command.new(150,@listing.type(@cat[@categories.index])[$sexe])
    @listes.y = 56; @listes.height = 256; @listes.active = false
    @vue = Window_Vue.new
  end
  def main
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      break if $scene != self
    end
    Graphics.freeze
    @help_window.dispose
    @vue.calque.dispose rescue nil
    @vue.dispose;@choix.dispose;@listes.dispose;@categories.dispose
  end
  def update
    @listes.update
    @help_window.update
    @categories.update
    @choix.update
    (@listes.dispose;@listes=Window_Command.new(150,@listing.type(@cat[@categories.index])[$sexe]);@listes.y=56;@listes.height=256;@listes.active=false) if @categories.active
    @vue.refresh(@cat[@categories.index]+"/"+@listing.type(@cat[@categories.index])[$sexe][@listes.index]) rescue nil if @listes.active
    if Input.trigger?(Input::C)
      (@listes.y=56;@listes.height=256;@listes.active = true;@categories.active=false;return) if @categories.active
      (($charset.push(Cache.creator(@cat[@categories.index]+"/"+@listing.type(@cat[@categories.index])[$sexe][@listes.index]));@categories.active=true;@categories.index+=1 rescue nil;return)rescue nil) if @listes.active && !@ok
      if @choix.active
        case @choix.index
        when 0; @categories.active=true;@choix.active=false; ok = false
        when 1; @choix.active=false;@listes.dispose;@listes=Window_Command.new(150,$charset);@listes.y=56;@listes.height=256; @ok = true; return
        when 3; creation
        end
      end
    end
    if Input.trigger?(Input::B)
      (@categories.active=true;@listes.active=false;@choix.active=false;return) if @listes.active
      (@choix.active=true;@categories.active=false;@listes.active=false rescue nil;return) if @categories.active
      $scene = Scene_Map.new if @choix.active
    end
  end
  def creation
    @a = Bitmap.new(128,192)
    @a.rect.set(299,128,128,192)
    $charset.each { |element| @a.stretch_blt(Rect.new(0,0, 128,192), element, element.rect, 255)}
    capture(@a, "hero.bmp")
    $scene = Scene_Map.new
  end
end

class Window_Vue < Window_Base
  attr_accessor :calque
  def initialize
    super(150, 56, 394, 304)
    @calque = Sprite.new
    refresh
  end
  def refresh(fichier = "")
    self.contents.clear
    (@calque.bitmap = Cache.creator(fichier)
    @calque.z = 1000 * ($scene.categories.index+1)
    @calque.x,@calque.y = 299, 128)rescue nil
    if !$charset.empty?
      $charset.each { |element|
      self.contents.stretch_blt(Rect.new((self.width-element.width)/2, (self.height-element.height)/2, 128,192), element, element.rect, 255)}
    end
  end
end
module Cache
  def self.creator(filename)
    load_bitmap("./creator/", filename)
  end
end
et le systeme d'enregistrement en bmp, pas de moi (mais de vgvgf, le scripteur le plus baleze de tous les temps !)
Spoiler:
Code:
def capture(bmp, filename, background_color = nil, prevent_hang_up = true)
    filename += '.bmp' if File.extname(filename) != '.bmp'
    if !background_color.nil?
      temp_bmp = bmp.clone
      rect = Rect.new(0, 0, temp_bmp.width, temp_bmp.height)
      bmp = Bitmap.new(temp_bmp.width, temp_bmp.height)
      bmp.fill_rect(rect, background_color)
      bmp.stretch_blt(rect, temp_bmp, rect)
      temp_bmp.dispose
    end
    file = File.open(filename, 'wb')
    file.write('BM')
    file.write([54 + (bmp.width * bmp.height * 24) / 8].pack('L'))
    file.write('ABMP')
    file.write([54].pack('L'))
    file.write([40].pack('L'))
    file.write([bmp.width].pack('L'))
    file.write([bmp.height].pack('L'))
    file.write([1].pack('L')[0, 2])
    file.write([24].pack('L')[0, 2])
    file.write([0, 0, 0, 0, 0, 0].pack('L6'))
    null_spaces = 0
    if bmp.width / 4 != bmp.width / 4.0
      if (bmp.width + 1) / 4 == (bmp.width + 1) / 4.0
        null_spaces = 1
      elsif (bmp.width + 2) / 4 == (bmp.width + 2) / 4.0
        null_spaces = 2
      elsif (bmp.width + 3) / 4 == (bmp.width + 3) / 4.0
        null_spaces = 3
      end
    end
    for y in (-bmp.height + 1)..0
      line = ''
      for x in 0...bmp.width
        color = bmp.get_pixel(x, y.abs)
        line += [color.blue.to_i].pack('L')[0, 1]
        line += [color.green.to_i].pack('L')[0, 1]
        line += [color.red.to_i].pack('L')[0, 1]
      end
      file.write(line)
    end
    file.close
  end
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Dim 12 Oct 2008 - 9:34
Ah oui en effet j'étais lui du compte . Bon je vais essayer de décrypter tout ça ...

Sinon bah je vais essayer de faire quelque chose d'utile moi...
avatar
Mist'
Administrateur

Administrateur
Nombre de messages : 3287
Age : 25
Localisation : France // Auvergne // Cantal
Capacités : expert
Distinction : Ours Barbu é_è [/Shamu']
Date d'inscription : 22/12/2007
http://www.rpgmakervx-fr.com

Re: [en cours] Hero Creator

le Mer 15 Oct 2008 - 4:00
J'suis ok ^^
Moi, j'veux participer, par contre, j'ai plus le net, donc, j'arives pendant les vacs.

_________________
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Mer 15 Oct 2008 - 6:39
Si quelqu'un pouvais trouver un pack de charas découpés, ce serait parfait !
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Mer 15 Oct 2008 - 6:41
Je peux même te le faire si tu veux. Par contre ça va prendre du temps. Je dirais deux trois jours. Si tu peux attendre jusque là.
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Mer 15 Oct 2008 - 6:45
parfait !
si t'as de quoi faire des facesets et de battlers ^^
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Mer 15 Oct 2008 - 6:47
Pour les facesets je peux essayer de reprendre ceux de Facemaker XP pour le début. Après le reste faudra demander à un graphistes. Sinon pour les battlers j'aurais une petite surprise pour le fofo dans pas longtemps donc patience
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Jeu 16 Oct 2008 - 10:05
Voilà pour les characters hommes

Si il y a le moindre souci dis le moi

Je te fais le pack pour les faceset

Edit: en fait non je comprends pas comment exporter les données de facemaker XP ...
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 17 Oct 2008 - 7:50
Quelques screenshots:

Menu principal:


Creation du charset:


Et voila:


et le chara créé:
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Ven 17 Oct 2008 - 7:52
Ca avance c'est bien ça. Berka tu as déjà fait la partie du script pour la classe du héros. Sinon j'aimerais essayé avec ton aide bien sur Wink
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 17 Oct 2008 - 7:56
Ouais désolé je l'ai fait... Embarassed

Tiens je vais commenter le script du menu principal pour que tu puisses modifier des trucs si tu veux...
edit:

Code:
class Scene_Creator
  def initialize(act=0) # initialisation avec l'ID du hero a modifier, id  = 0 par default
      @actor=$game_party.members[act] # on assigne à @actor toutes les données du hero
      @n_sexe=0 # on definit le sexe par default
      @cat=["Nom","Sexe","Classe","Character","Battler","Faceset","Commencer", "Quitter"] # liste des commandes du menu
      @ouinon=["Oui","Non"]      # liste des commandes du menu de validation
      @mascfem=["Homme","Femme"]      # liste des commandes du menu de sexe
      @class=[]  # initialisation des commandes du menu des classes
      for i in 1...$data_classes.size do # pour chaque classe de 1 a la derniere
        @class.push($data_classes[i].name) # on ajoute son nom au tableau de commandes du menu
      end
      @categories=Window_Command.new(150,@cat)
      @categories.x=(544-@categories.width)/2  # on centre la fenetre sur les x
      @categories.y=(416-@categories.height)/2 # on centre la fenetre sur les y
      @sexe=Window_Command.new(150,@mascfem)
      @sexe.x=(544-@sexe.width)/2 # on centre la fenetre sur les x
      @sexe.y=(@categories.y+24) # on met le premier choix ("Homme") en face du choix sexe du menu principal
      @sexe.visible=false # on la laisse invisible et inactive
      @sexe.active=false
      @classes=Window_Command.new(150,@class)   
      @classes.x=(544-@classes.width)/2
      @classes.y=(@categories.y+2*24)  # on met le premier choix ("Paladin") en face du choix classe du menu principal
      @classes.visible=false # on la laisse invisible et inactive
      @classes.active=false
      @classes.height=200
      @valid=Window_Command.new(150,@ouinon)
      @valid.x=(544-@valid.width)/2 
      @valid.y=(@categories.y+7*24)
      @valid.visible=false # on la laisse invisible et inactive
      @valid.active=false
  end
  def main
    Graphics.transition
    loop { # boucle de mise a jour
      Graphics.update # mis a jour des graphismes
      Input.update # des touches
      update # et appel de la methode d'update
      break if $scene!=self #q uitter la boucle si la variable est differente de Scene_Creator
    }
    Graphics.freeze # gel des graphismes
    @categories.dispose # liberation des fenetres ouvertes
    @sexe.dispose
    @classes.dispose
    @valid.dispose
  end
  def update
    @categories.update # màj des fenetres
    @valid.update 
    @sexe.update 
    @classes.update 
    # animations des fenetre:
    if @sexe.active # si elle est active
      @categories.active=false # on desactive le menu principal
      if @categories.x>(@sexe.x-@categories.width) # decale le menu principal à gauche
        @categories.x-=3 # de 3 px par 3 px
      else
        @sexe.visible=true # apres on affiche la fenetre fille
      end
    end
    if @classes.active # meme principe
      @categories.active=false
      if @categories.x>(@classes.x-@categories.width)
        @categories.x-=3
      else
        @classes.visible=true
      end
    end
    if @valid.active
      @categories.active=false
      if @categories.x>(@valid.x-@categories.width)
        @categories.x-=3
      else
        @valid.visible=true
      end
    end 
    if @categories.active # si le menu principal est actif
      @valid.visible=false  # on rend invisible et inactive les autres fenetres
      @valid.active=false 
      @sexe.active=false
      @sexe.visible=false
      @classes.active=false
      @classes.visible=false
      if @categories.x<(544-@categories.width)/2 # et on ramene le menu principal pour la centrer
        @categories.x+=3 # de 3 px par 3 px
      end
    end
    if Input.trigger?(Input::C) # si la touche Space est pressée
      if @categories.active # si la fenetre du menu principal est active
        case @categories.index # on compare son index
        when 0 # si son index == 0, c'est le premier choix
          $game_temp.name_actor_id=1 # on stocke "en memoire" l'id du hero dans le script game_temp
          $game_temp.name_max_char=10 # on stocke aussi le nombre max de caracteres du nom
          $game_temp.background_bitmap = nil # on ne met pas de fond pour la prochaine scene, celle du nom
          $creator=true # on intialise une variable qui servira a tester d'ou a été appelée la scene du nom
          $scene=Scene_Name.new # et on appelle la scene du nom
        when 1
          @sexe.active=true    # si choix 2, on affiche et active la fenetre du sexe
        when 2
          @classes.active=true  # ...
        when 3 # on appelle la scene de creation du chara
          $scene=Scene_Character.new(@actor,@n_sexe) # on passe en parametre les données de actor ainsi que le sexe choisi
        when 4
          p 'pas disponible' # ... tududuuu ^^
        when 5
          p 'pas disponible'
        when 6
          commencer # pour finaliser le mode de creation du hero avant de retourner sur la map, on va lui attribuer toutes les modifs
        when 7
          @valid.active=true # on affiche et active la fenetre de validation de quitter
        end
        return
      end
      if @sexe.active # si la fenetre sexe est active
        case @sexe.index
        when 0
          @n_sexe=0 # le sexe est 0 si c'est un homme
          @categories.active=true
          @sexe.active=false # et on ferme la fenetre
        when 1
          @n_sexe=1 # sinon 1 pour une femme
          @categories.active=true
          @sexe.active=false # et on ferme la fenetre
        end
        return
      end 
      if @classes.active # si la fenetre des classes est active
        @actor.class_id=@classes.index+1 # la classe du hero est egale a l'index (le choix) + 1, car l'index est defini a 0 et la classe a 1
        @categories.active=true
        @classes.active=false # et on ferme la fenetre
        return
      end
      if @valid.active # si la fenetre de validation est active
        case @valid.index
        when 0
          exit # fin du rgss player
        when 1
          @categories.active=true
          @valid.active=false # ou on ferme la fenetre si non
        end
        return
      end
    end
    if Input.trigger?(Input::B) # si la touche X est pressée
      if @categories.active # bon ca devrait etre comprehensible
        @valid.active=true
        @categories.active=false
        @categories.index=7 # on positionne le curseur sur le 6 eme choix
      end
      if @sexe.active
        @categories.active=true
        @sexe.active=false
      end
      if @classes.active
        @categories.active=true
        @classes.active=false
      end
      if @valid.active
        @categories.active=true;
        @valid.active=false
      end
    end
  end
  def commencer
    $game_player.refresh("$#{@actor.name}.png") # on appelle la methode (modifiee ^^) refresh du Game_player, pour changer l'apparence du hero
    $scene=Scene_Map.new # et on retourne sur la map
  end
end

class Scene_Name # modifs de la Scene_Name
  def return_scene # gestion du retour a la scene precedente
    # methode de condition revient a:
    # if $creator == true; $scene=Scene_Creator.new; else; $scene=Scene_Map.new; end
    $creator ? $scene=Scene_Creator.new : $scene=Scene_Map.new  # si creator est vrai, la scene precedente etait la Scene_Creator
    $creator = false # pour eviter une boucle, bug ...
  end
end

class  Game_Player # modifs de Game_Player
  def refresh(chara=nil) # rajout d'un parametre, contenant le nom du chara a modifier
    if $game_party.members.size == 0
      @character_name = ""
      @character_index = 0
    else
      actor = $game_party.members[0]
    # if $creator != nil ; @character_name = chara; else; @character_name = actor.character_name; end     
      !chara.nil? ? @character_name = chara : @character_name = actor.character_name # si chara contient un nom valide, alors on attribue ce charset au hero
      @character_index = actor.character_index
    end
  end
end
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Ven 17 Oct 2008 - 14:25
Merci Berka j'épluche ça tout de suite.

Edit : Heeeeuuuuuuuuu oué c'est génial tout ça . Non sérieusement j'ai compris la logique en général mais je manque encore de ... vocabulaire on va dire.
Si j'ai bien compris il manque l'accès au Facemaker et Battlermaker non ?
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Ven 17 Oct 2008 - 21:14
en effet, etant donné que je n'ai pas les ressources, et que c'est en gros le meme principe que pour le chara... je me suis dis que ce n'etait pas urgent...

veux tu que je te commente le script de creation du chara ? et celui du listing des resources ?
avatar
Arayashiki
Démonophile sadique
Démonophile sadique
Nombre de messages : 656
Age : 28
Localisation : Trois lettres me demangent. Oserai-je ?
Capacités : bon
Avertissements : Avertissements infinis |-)
Distinction : FUCKING nouveau dieu du mal. Gros connard en chef.
Date d'inscription : 17/08/2008

Re: [en cours] Hero Creator

le Sam 18 Oct 2008 - 0:49
Si tu as le courage je veux bien.
avatar
Berka
Administrateur

Administrateur
Nombre de messages : 1832
Age : 27
Localisation : Paris
Capacités : expert
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: [en cours] Hero Creator

le Sam 18 Oct 2008 - 5:03
tout bien commenté... si tu as des questions >> CB
Code:
class Scene_Character
  attr_accessor :categories # on definit une variable de methode accessible
  def initialize(actor,sexe=0) # on passe l'actor a modifier en parametre, et le sexe , par defaut masculin
    Graphics.frame_rate = 100 # on accelere un peu le refraichissement des graphismes, pour eviter le lag
    @actor=actor # on rend la variable accessible dans toute la classe
    @sexe=sexe  # pareil
    $charset=[] # on initialise un tableau qui contiendra les bitmaps des differents elements
    @cat=["Corps","Yeux","Tete","Habit","Objets","Cape","Ailes"] # liste des commandes du choix des elements
    @listing=Game_Listing.new # on lance le listing des fichiers
    @categories=Window_Command.new(394,@cat,4) # on cree la fenetre des categories d'elements, avec 4 elements par ligne
    @categories.index=0;@categories.active=false # on les desactive et on place le cuseur a 0 au debut
    @categories.height=104 # on assigne une hauteur fixe
    @categories.y=416-@categories.height;@categories.x=150 # on positionne le tout
    @help=Window_Help.new # on appelle la fenetre help, permettant d'afficher des informations
    @choix=Window_Command.new(150,["Choisir",'Retirer','Suivant','Quitter']) # ...
    @choix.height=104;@choix.y=416-@choix.height
    @choix.active=true
    # on cree la fenetre listant les ressources, se referer a la def type de Game_Listing:
    # @listing.type(@cat[@categories.index]) est un tableau a deux dimensions contenant les ressources du choix de la fenetre @cat
    # @cat[@categories.index] renvoie "Corps" si @categories.index == 0
    # on selectionne la dimension avec sexe :
    @listes=Window_Command.new(150,@listing.type(@cat[@categories.index])[@sexe])
    @listes.y=56;@listes.height=256;@listes.active = false
    @vue=Window_Vue.new # creation de la fenetre d'appercu
  end
  def main
    Graphics.transition # transition graphique
    loop do # boucle de mise a jour
      Graphics.update # màj graphique
      Input.update # màj des touches
      update # appel de la def update
      break if $scene!=self # on sort de la boucle si $scene != Scene_Character
    end
    Graphics.freeze # gel graphique
    Graphics.frame_rate = 60 # on remet le rafraichissement a sa valeur normale
    @help.dispose
    # on a passé calque comme "methode" de @vue avec attr_accessor :calque voir la class Window_Vue
    @vue.calque.dispose rescue nil # pour eviter les erreurs si pas créé ou deja libéré
    @vue.dispose
    @choix.dispose
    @listes.dispose
    @categories.dispose
    @a.dispose rescue nil # pour eviter les erreurs si pas créé ou deja libéré
  end
  def update
    infos # on met a jour les informations de la window_help, via un appel de methode infos
    @listes.update
    @help.update
    @categories.update
    @choix.update
    @vue.refresh # on rafraichit la fenetre d'appercu
    if @categories.active # si la fenetre @categories est active...
        @listes.dispose # on supprime la fenetre liste
        @listes=Window_Command.new(150,@listing.type(@cat[@categories.index])[@sexe])# on la recree avec un nouveau contenu de ressources. si erreur (rescue), alors faire:
        @listes.y=56 # et on repositionne...
        @listes.height=256 # ...
        @listes.active=false
    end
    if @listes.active && @choix.index==0 # si @listes est active et le curseur indique ajouter
      @vue.refresh(@cat[@categories.index]+"/"+@listing.type(@cat[@categories.index])[@sexe][@listes.index]) rescue nil # on donne un apercu de la ressource située sous le curseur de @listes
    end
    if Input.trigger?(Input::C) # si espace
      if @categories.active # si @categories etait active
        @listes.active=true # on active @listes
        @categories.active=false # mais pas @categories
        return
      end
      if @listes.active 
        case @choix.index # on compare l'index, le choix
          when 0
            # soit on ajoute au tableau $charset, un bitmap, chargé du cache, dont le repertoire est:
            #@cat[@categories.index]+"/"+ => si @categories.index == 0 => "Corps" on ajoute un slash: "/" => "Corps/"
            # @listing.type(@cat[@categories.index])[@sexe] meme chose qu'a la ligne 18
            # @listing.type(@cat[@categories.index])[@sexe][@listes.index]) on selectionne l'element du rang @listes.index dans le tableau @listing(...)
            $charset.push(Cache.creator(@cat[@categories.index]+"/"+@listing.type(@cat[@categories.index])[@sexe][@listes.index])) rescue nil 
          when 1
            # soit on enleve l'element bitmap  de $charset à l'emplacement @listes.index en evitant une erreur ^^
            $charset.delete_at(@listes.index)rescue nil
            @listes.dispose # et on recree la fenetre @listes
            @listes=Window_Command.new(150,$charset.size)
            @listes.y=56
            @listes.height=256
            return
        end
        @categories.active=true # puis on retourne a la fenetre @categories
        @categories.index+=1 rescue nil # on evite une erreur, si l'index est plus grand que le nombre de choix
        return
      end
      if @choix.active
        case @choix.index
        when 0
          @categories.active=true # on active la fenetre @categories
          @choix.active=false
        when 1
          @choix.active=false
          @listes.dispose # et on recree la fenetre @listes
          @listes=Window_Command.new(150,$charset) # avec comme choix, les bitmaps de $charset
          @listes.y=56
          @listes.height=256
          return
        when 2
          creation # appel de la methode de creation du chara
        # $scene = Scene_Facemaker.new # on vera pour la suite ^^
        when 3
          creation # appel de la methode de creation du chara
          $scene=Scene_Creator.new # retour a la scene_creator, le menu principal
        end
      end
    end
    if Input.trigger?(Input::B)
      if @listes.active # si @liste active
        @categories.active=true # on retourne a @categories
        @listes.active=false
        @choix.active=false
        return
      end
      if @categories.active
        @choix.active=true # ...
        @categories.active=false
        @listes.active=false rescue nil
        return
      end
      if @choix.active # on retourne au menu principal
        $scene=Scene_Creator.new
      end
    end
  end
  def infos
    case @choix.index # en fonction de l'emplacement du curseur sur @choix
      when 0;@help.set_text("Ajouter un élément #{@cat[@categories.index]}") # on affiche dans la fenetre help...
      when 1;@help.set_text("Ajouter un élément #{@cat[@categories.index]}")
      when 2;@help.set_text("Gestion des couleurs")
      when 3;@help.set_text("Retour au Menu de Création")
    end
  end
  def creation
    @a=Sprite.new # on cree un sprite
    @a.bitmap=Bitmap.new(Larg_Chara,Haut_Chara) # on assigne a ce sprite un bitmap aux dimensions du chara
    @a.bitmap.rect.set(316,128,Larg_Chara,Haut_Chara) # on selectionne une aire de ce bitmap celles du chara a générer
    $charset.each { # pour chaque element de $chara
    |element| # que l'on nomme element
    @a.bitmap.stretch_blt(Rect.new(0,0,Larg_Chara,Haut_Chara),element,element.rect,255) # on fusionne le bitmap element avec le bitmap @a.bitmap
    } # fin de la boucle
    @a.bitmap.make_png("$#{@actor.name}", "Graphics/characters/") # appel de la def make_png de la classe bitmap, rajoutée  dans les Modules
    # avec comme parametres le nom du fichier : "$"+"nom du hero" a mettre dans le dossier "Graphics/characters/"
  end
end

class Window_Vue < Window_Base
  attr_accessor :calque  # on definit une variable de methode accessible
  def initialize
    super(150,56,394,256)
    @calque=Sprite.new # on cree un sprite
    refresh
  end
  def refresh(fichier="")
    self.contents.clear # suppression de tous les elements de la fenetre
    (@calque.bitmap=Cache.creator(fichier) # on cree un bitmap d'appercu sur @calque
    @calque.z=1000*($scene.categories.index+1)
    @calque.x,@calque.y=315,136)rescue nil # on evite les erreurs si le nom du fichier est invalide
    if !$charset.empty? # si le tableau $charset n'est pas vide
      $charset.each{|element| # pour chaque element de $charset
      self.contents.stretch_blt(Rect.new((self.width-element.width)/2,(self.height-element.height)/2,Larg_Chara,Haut_Chara),element,element.rect,255) #on dessine l'element dans la fenetre
      } # fin de la boucle
    end
  end
end
Contenu sponsorisé

Re: [en cours] Hero Creator

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum