Sujet n°10141
Posté par Zbooby le 6 Aoû - 17:49 (2011)
Titre : [Aide] Création de script
Bonjour


Je voudrais créer un script permettant de faire apparaître les chara des pokémon de l'équipe, ceux-ci ne se déplaceront pas, ils ne seront que des images.
donc je essayer de crée ce script moi même, car j'éssais d'apprendre en même temps.
je cherche quand même de l'aide car tout seul, ce n'est pas facil ^^.
je ne vous demande pas de me faire le script, mais juste de me mettre sur la piste, je posterais l'avancer du script, et j'éspère que vous serrez la pour corriger mes erreurs.
PS: je ne suis pas scripteur, je débute, alors ne riez pas des erreurs que je peu faire ^^.
Merci d'avance !

Posté par Nuri Yuri le 6 Aoû - 17:52 (2011)
RPG::Cache.character(nom,0)
Après tu découpe ce que tu as besoins.
@sprite.bitmap.blt(0,0,chara,Rect.new(0,0,32,32))

Posté par Zbooby le 6 Aoû - 18:01 (2011)
Yuri-塗 ゆり a écrit:
RPG::Cache.character(nom,0)
Après tu découpe ce que tu as besoins.
@sprite.bitmap.blt(0,0,chara,Rect.new(0,0,32,32))




 RPG::Cache.character(nom,0) c'est donc pour afficher le chara ? Mais comment dire afficher le chara qui a pour nom l'id du premier poké de l'équipe ?


EDIT: Je commence comme sa ?


  1. class New_Interface < Window_Base  
  2.   include POKEMON_S 

Posté par Nuri Yuri le 6 Aoû - 18:04 (2011)
C'est pour récupérer son bitmap seulement
Pour le premier Pokémon de l'équipe :
if $pokemon_party.actors[0]
str=sprintf("%03d.png",$pokemon_party.actors[0].id)
else
str="000.png"
end

Posté par Sphinx le 6 Aoû - 18:18 (2011)
Clin d'œil foireux Il va falloir cerner très précisément ce que tu souhaites faire avant de te lancer dans le codage

Il faut également savoir que pour afficher une image à l'écran, tu as besoin d'un Sprite pour la contenir :
Code:
mon_sprite = Sprite.new

Maintenant tu pourras mettre ton image dans le sprite, pour qu'elle s'affiche :
Code:
mon_sprite.bitmap = RPG::Cache.character("nom_de_ton_fichier.png", 0)

Et comme l'explique Yuri, si tu laisses ca comme ca, ton chara va s'afficher en entier. Il faut donc découper le bitmap avant de la charger dans ton sprite :
Code:
mon_bitmap = RPG::Cache.character("nom_de_ton_fichier.png", 0)
mon_bitmap.blt(0, 0, mon_bitmap, Rect.new(0, 0, 32, 32))
mon_sprite.bitmap = mon_bitmap


Expliquons l'avant dernière ligne :
bitmap.blt est la méthode qui permet de découper ton image. Cette méthode prend plusieurs arguments : les deux premiers arguments sont l’abscisse x et l'ordonnée y où l'image découpée sera affichée. 0, 0 indique donc que la partie découpée de ton image sera placée en haut à gauche du sprite (le sprite a ses propres coordonnées x et y qui permet de le placer par rapport à l'écran de jeu).
L'argument suivant est l'objet bitmap qui est à découper. Ici c'est le chara qu'on découpe. Le dernier argument est une instance de l'objet Rect. Rect.new sert à la créer, et cette méthode a besoin des coordonnées x et y du coin haut/gauche du rectangle par rapport au bitmap (0, 0 représente le coin haut/gauche de l'image) ainsi que de la largeur (3° argument) et de la hauteur (dernier argument) de ce rectangle. Dans la ligne ci dessus, on récupère donc l'image qui se trouve dans un rectangle de 32 pixels de largeur et de 32 pixels de hauteur à partir du coin en haut à gauche, et on la colle dans la variable mon_bitmap.
Enfin, je charge le bitmap final dans le sprite.

Posté par Zbooby le 6 Aoû - 18:39 (2011)
En fait je veux afficher les chara des 6 premier Pokémon de l'équipe.
il faut donc que je récupère les id des 6 Pokémon de l'équipe, et que je dise afficher image "au_nom_de_l'id_du_pokémon"
je crois qu'il faut utiliser to_s pour afficher une 'image portant comme nom un chiffre, c'est bien sa ?

Posté par Sphinx le 6 Aoû - 18:41 (2011)
Clin d'œil foireux si tu utilises la fonction
Code:
sprintf(FORMAT, NOMBRE)

tu obtiens une chaine de caractères. Donc plus besoin de convertir en String ^^

Après, oui si tu veux afficher les 6 pokémons de l'équipe, va falloir récupérer les 6 IDs t'as pas d'autres options Imbécile heureux

Posté par Zbooby le 6 Aoû - 18:44 (2011)
Comment récuperer ces id pour s'en servir pour afficher une image ?

Posté par Sphinx le 6 Aoû - 18:46 (2011)
Pour afficher une image quelconque, t'as juste besoin de son nom. C'est aussi valable pour les charas Clin d'œil foireux

Ca dépend donc du nom que tu donnes à tes images.

Posté par Zbooby le 6 Aoû - 18:50 (2011)
ben vu le nombre de pokémon je peu pas définir le chara pour chaque pokémon, le script serais trés long.
Donc je pensais récuperer les id des 6 pokémon de l'equipe, pour nous en reservir pour afficher les chara, du genre pour le premier pokémon:
afficher image (id_du_premier_pokémon_de_l'équipe)
pour le deuxieme : afficher image(id_du_2eme_poké_de_l'équipe)
etc


Vu que les chara porte pour nom l'id du pokémon.

Posté par Sphinx le 6 Aoû - 19:03 (2011)
Clin d'œil foireux si le chara porte l'ID du pokémon sur 3 chiffres ('001.png' pour BULBIZARRE), tu peux le déterminer en faisant :
Code:
nom_chara = "#{sprintf('%03d', $pokemon_party.actors[index].id)}.png"

(où index représente l'index du pokémon dans l'équipe)

^^ La syntaxe
Code:
"#{...}"

permet de récupérer le résultat de ce qui est entre #{ et } (ce qui remplacerait ici "...") et de l'insérer à la place dans une chaine de caractère (délimitée par ""). Dans la ligne au dessus, je récupère l'ID sur 3 chiffres avec cette commande :
Code:
sprintf('%03d', $pokemon_party.actors[index].id)

et je l'insère juste avant ".png" dans la chaine de caractères.

Ceci dit d'autres syntaxes marchent aussi, comme par exemple :
Code:
sprintf('%03d', $pokemon_party.actors[index].id) + ".png"

mais personnellement je préfère la syntaxe du haut, entre autre parce que tu n'auras pas besoin de te soucier de convertir tes variables, ou les résultats de tes fonctions en chaines de caractères pour les insérer dans ta chaine Clin d'œil foireux

Posté par Zbooby le 6 Aoû - 19:21 (2011)
Donc je commence comme sa ?


class New_Interface < Window_Base  
  include POKEMON_S


nom_chara_1 = "#{sprintf('%03d', $pokemon_party.actors[0].id)}.png"
nom_chara_2 = "#{sprintf('%03d', $pokemon_party.actors[1].id)}.png"
nom_chara_3 = "#{sprintf('%03d', $pokemon_party.actors[2].id)}.png"
nom_chara_4 = "#{sprintf('%03d', $pokemon_party.actors[3].id)}.png"
nom_chara_5 = "#{sprintf('%03d', $pokemon_party.actors[4].id)}.png"
nom_chara_6 = "#{sprintf('%03d', $pokemon_party.actors[5].id)}.png"


ensuite pour afficher les image ?


Si j'ai fais nimporte quoi rigolé pas :/ je débute.


Ps: Dans ces ligne, qu'est ce qui signifie que le nom du chara porte 3 chiffre ? c'est le '%03d' ?

Posté par Sphinx le 6 Aoû - 19:30 (2011)
Zbooby a écrit:
Donc je commence comme sa ?

Code:
nom_chara_1 = "#{sprintf('%03d', $pokemon_party.actors[0].id)}.png"
nom_chara_2 = "#{sprintf('%03d', $pokemon_party.actors[1].id)}.png"
nom_chara_3 = "#{sprintf('%03d', $pokemon_party.actors[2].id)}.png"
nom_chara_4 = "#{sprintf('%03d', $pokemon_party.actors[3].id)}.png"
nom_chara_5 = "#{sprintf('%03d', $pokemon_party.actors[4].id)}.png"
nom_chara_6 = "#{sprintf('%03d', $pokemon_party.actors[5].id)}.png"


ensuite pour afficher les image ?

Clin d'œil foireux Relis les messages précédents, Yuri et moi te l'expliquons en détail

Zbooby a écrit:
Ps: Dans ces ligne, qu'est ce qui signifie que le nom du chara porte 3 chiffre ? c'est le '%03d' ?

Tout à fait. Le d indique qu'on va transformer un entier. Le 3 indique qu'on le veut sur 3 caractères, et le 0 qui le précède représente le caractère de remplissage (1 sera donc converti en 001)

Posté par Zbooby le 6 Aoû - 20:17 (2011)
Quelque chose comme sa ?


Citation:
class New_Interface < Window_Base  
  include POKEMON_S


nom_chara_1 = "#{sprintf('%03d', $pokemon_party.actors[0].id)}.png"
nom_chara_2 = "#{sprintf('%03d', $pokemon_party.actors[1].id)}.png"
nom_chara_3 = "#{sprintf('%03d', $pokemon_party.actors[2].id)}.png"
nom_chara_4 = "#{sprintf('%03d', $pokemon_party.actors[3].id)}.png"
nom_chara_5 = "#{sprintf('%03d', $pokemon_party.actors[4].id)}.png"
nom_chara_6 = "#{sprintf('%03d', $pokemon_party.actors[5].id)}.png"


Sprite_chara = Sprite.new
Sprite_chara.bitmap = RPG::Cache.character("Characters/nom_chara_1.png", 0)
Chara_bitmap = RPG::Cache.character("Characters/nom_chara_1.png", 0)  
Chara_bitmap.blt(0, 0, Chara_bitmap, Rect.new(x, y, 32, 32))  
Chara_sprite.bitmap = Chara_bitmap 


Sprite_chara_1 = Sprite.new
Sprite_chara_1.bitmap = RPG::Cache.character("Characters/nom_chara_2.png", 0)
Chara_bitmap_1 = RPG::Cache.character("Characters/nom_chara_2.png", 0)  
Chara_bitmap_1.blt(0, 0, Chara_bitmap_1, Rect.new(x, y, 32, 32))  
Chara_sprite_1.bitmap = Chara_bitmap_1


Sprite_chara_2 = Sprite.new
Sprite_chara_2.bitmap = RPG::Cache.character("Characters/nom_chara_3.png", 0)
Chara_bitmap_2 = RPG::Cache.character("Characters/nom_chara_3.png", 0)  
Chara_bitmap_2.blt(0, 0, Chara_bitmap_2, Rect.new(x, y, 32, 32))  
Chara_sprite_2.bitmap = Chara_bitmap_2


Sprite_chara_3 = Sprite.new
Sprite_chara_3.bitmap = RPG::Cache.character("Characters/nom_chara_4.png", 0)
Chara_bitmap_3 = RPG::Cache.character("Characters/nom_chara_4.png", 0)  
Chara_bitmap_3.blt(0, 0, Chara_bitmap_3, Rect.new(x, y, 32, 32))  
Chara_sprite_3.bitmap = Chara_bitmap_3


Sprite_chara_4 = Sprite.new
Sprite_chara_4.bitmap = RPG::Cache.character("Characters/nom_chara_5.png", 0)
Chara_bitmap_4 = RPG::Cache.character("Characters/nom_chara_5.png", 0)  
Chara_bitmap_4.blt(0, 0, Chara_bitmap_4, Rect.new(x, y, 32, 32))  
Chara_sprite_4.bitmap = Chara_bitmap_4


Sprite_chara_5 = Sprite.new
Sprite_chara_5.bitmap = RPG::Cache.character("Characters/nom_chara_6.png", 0)
Chara_bitmap_5 = RPG::Cache.character("Characters/nom_chara_6.png", 0)  
Chara_bitmap_5.blt(0, 0, Chara_bitmap_5, Rect.new(x, y, 32, 32))  
Chara_sprite_5.bitmap = Chara_bitmap_5



Posté par Sphinx le 7 Aoû - 10:24 (2011)
Clin d'œil foireux tu auras une belle erreur de syntaxe là

=> une classe se ferme par un end. En outre, la partie de code qui crée les sprites devrait être dans une méthode. La méthode initialize sert de constructeur. C'est la méthode qui est automatiquement appelée quand tu fais :
Code:
New_Interface.new


Une méthode est une fonction qui se trouve à l'intérieur d'une classe. Une fonction s'ouvre par le mot clé def suivi du nom de la fonction (ici initialize), et se termine par end.

Posté par Zbooby le 7 Aoû - 11:07 (2011)
Donc au début je met : 


class New_Interface < Window_Base   
  include POKEMON_S 


def initialize New_Interface.new


et à la fin end.


Dsl je n'ai pas beaucoup compris ^^


Je crois que les script ne sont pas pour moi :/ je vais faire une demande dans offre et demande.
Mais je vais continuer d'essayer de le faire.


EDIT: 


j'ai essayé sa (pour essayer d'afficher au moins le premier pokémon de l'équipe):


 
Citation:
class Affichage_Poké < Window_Base   
  include POKEMON_S  
    
  def initialize
    
chara_poké = Sprite.new 
chara_poké = RPG::Cache.character("#{sprintf('%03d', $pokemon_party.actors[0].id)}.png", 0)  
chara_poké.blt(13, 13, chara_poké, Rect.new(0, 0, 32, 32))  
chara_poké.bitmap = chara_poké 


end
end








Sa ne bug pas, mais ça ne m'affiche rien non plus ^^

Posté par Nuri Yuri le 7 Aoû - 13:19 (2011)
La syntaxe c'est
Code:

module Nom_Module
  class Nom_Class
    def nom_methode
      def nom_methode_dan_nom_methode
     
      end
    end
  end

  class Nom_Classe2 < Nom_Class
 
  end
  class Nom_Classe3
    include PSP
  end
  def self.nom_methode
    if @o
   
    end
  end
  def Nom_Module.nom_methode2
    @a=0
    loop do
      @a+=1
      break if @a==5
    end
  end
end
class Nom_Classe4
  def initialize #si tu veux initialiser
    @p=0
  end
end
def Nom_Module.nom_methode3

end

Pour l'utilisation de ta classe :
Code:

@interface=New_Interface.new

Posté par Zbooby le 7 Aoû - 13:25 (2011)
Wooh la sa fait trop d'un coup ^^


Je n'ai pas tout compris ^^
Enfin j'ai compris que la syntaxe devais être comme sa, mais ou dois-je ajouter mes ligne ?

Posté par Nuri Yuri le 7 Aoû - 13:33 (2011)
C'est comment les script doivent être écris, avec ces utilisation possible.
Ton script doit être comme ça :
Code:
class New_Interface
  include POKEMON_S
  def initialize
    tmp_coord=[32,0,64,0,96,0,128,0,160,0,192,0]
    @sprites=[]
    for i in 0...6
      @sprites[i]=Sprite.new
      @sprites[i].bitmap=Bitmap.new(32,32)
      @sprites[i].x=tmp_coor[i*2]
      @sprites[i].y=tmp_coor[i*2+1]
      @sprites[i].z=1000
    end
    @rect=Rect.new(0,0,32,32)
  end
  def refresh
    for i in 0...6
      @sprites[i].bitmap.clear
      if $pokemon_party.actors[i]
        bmp=RPG::Cache.characters(sprintf("pkmn_%03d.png",$pokemon_party.actors[i].id),0)
        @sprites[i].bitmap.blt(0,0,bmp,@rect)
      end
    end
  end
end


Après tu fais :
@interface=New_Interface.new
et à chaque mise à jour :
@interface.refresh

Posté par Zbooby le 7 Aoû - 13:50 (2011)
ou est ce que je dois mettre sa ?
Citation:

Après tu fais :
@interface=New_Interface.new
et à chaque mise à jour :
@interface.refresh






Peu tu m'expliquer stp un peu ton script, histoire que j'apprenne un peu ^^.
Merci d'avance.

Posté par Nuri Yuri le 7 Aoû - 14:05 (2011)
Tu dois le mettre où tu veux afficher ton interface, par exemple dans l'écran titre je veux afficher l'interface du choix j'ai mis ça dans la méthode prepare_screen_menu : @interface_title=load_data("Data/Int/title2.int") après dans la méthode de mise à jour je met à jour mon interface. (je te dis pas comment ça marche sur PSP v2 car les interfaces dessus c'est un univers complètement différent.)

Dans la classe qu'il te faut tu met @interface=New_Interface.new dans la méthode main,
et @interface.refresh dans la méthode update. (si il y en a une.)

Posté par Zbooby le 14 Aoû - 22:09 (2011)
salut yuri, bon ben j'ai un bug avec ton script, voilà:


sa plante lorsque je lance le jeu: 


Spoiler

 
 


Voici le log: 


Citation:
---------- Erreur de script : Affichage_equipe ---------- 
----- Version du logiciel : PSP DS v0.4 
----- Type 
NameError 


----- Message 
undefined local variable or method `tmp_coor' for #<New_Interface:0x97849b0 @sprites=[#<Sprite:0x971ff70>]> 


----- Position dans Affichage_equipe 
Ligne 9 


----- Backtrace 
Script : Affichage_equipe | Ligne : 9 | Méthode : in `initialize' 
Script : Affichage_equipe | Ligne : 6 | Méthode : in `each' 
Script : Affichage_equipe | Ligne : 6 | Méthode : in `initialize' 
Script : Scene_Map | Ligne : 31 | Méthode : in `new' 
Script : Scene_Map | Ligne : 31 | Méthode : in `main' 
Script : Main | Ligne : 58 





Voici le script: 

|+Agrandir|-Réduire|version texte|copier le code|imprimer|?

  1. class New_Interface    
  2.   
  3.   include POKEMON_S     
  4.   
  5.   def initialize  
  6.   
  7.     tmp_coord=[32,0,64,0,96,0,128,0,160,0,192,0]    
  8.   
  9.     @sprites=[]    
  10.   
  11.     for i in 0...6    
  12.   
  13.       @sprites=Sprite.new    
  14.   
  15.       @sprites.bitmap=Bitmap.new(32,32)    
  16.   
  17.       @sprites.x=tmp_coor    
  18.   
  19.       @sprites.y=tmp_coor    
  20.   
  21.       @sprites.z=20001    
  22.   
  23.     end    
  24.   
  25.     @rect=Rect.new(0,0,32,32)    
  26.   
  27.   end    
  28.   
  29.   def refresh  
  30.   
  31.     for i in 0...6    
  32.   
  33.       @sprites.bitmap.clear    
  34.   
  35.       if $pokemon_party.actors    
  36.   
  37.         bmp=RPG::Cache.characters(sprintf("pkmn_%03d.png",$pokemon_party.actors.id),0)    
  38.   
  39.         @sprites.bitmap.blt(32,32,bmp,@rect)    
  40.   
  41.       end    
  42.   
  43.     end    
  44.   
  45.   end    
  46.   
  47. end  






Et voici la ligne qui bug: 

|+Agrandir|-Réduire|version texte|copier le code|imprimer|?

  1. @sprites.x=tmp_coor 




EDIT: j'ai trouvé pourquoi sa plante, en faite tu avais mis coor au lieu de coord.


Bref mtn sa bug à la ligne: bmp=RPG::Cache.characters(sprintf("pkmn_%03d.png",$pokemon_party.actors[i].id),0)


Et voici le log: 
 
Citation:
---------- Erreur de script : Affichage_equipe ----------
----- Version du logiciel : PSP DS v0.4
----- Type
NoMethodError


----- Message
- ARGS - ["pkmn_004.png", 0]
undefined method `characters' for RPG::Cache:Module


----- Position dans Affichage_equipe
Ligne 19


----- Backtrace
Script : Affichage_equipe | Ligne : 19 | Méthode : in `refresh'
Script : Affichage_equipe | Ligne : 16 | Méthode : in `each'
Script : Affichage_equipe | Ligne : 16 | Méthode : in `refresh'
Script : Scene_Map | Ligne : 53 | Méthode : in `main'
Script : Scene_Map | Ligne : 41 | Méthode : in `loop'
Script : Scene_Map | Ligne : 65 | Méthode : in `main'
Script : Main | Ligne : 58



Posté par Nuri Yuri le 14 Aoû - 22:28 (2011)
J'ai fait une erreur en tapant le script. Remplace tmp_coord=[32,0,64,0,96,0,128,0,160,0,192,0] par tmp_coor=[32,0,64,0,96,0,128,0,160,0,192,0]

Posté par Zbooby le 14 Aoû - 22:34 (2011)
oui je venais de le remarquer ^^



Zbooby a écrit:
salut yuri, bon ben j'ai un bug avec ton script, voilà:


sa plante lorsque je lance le jeu: 


{{{Spoiler}}}


EDIT: j'ai trouvé pourquoi sa plante, en faite tu avais mis coor au lieu de coord.


Bref mtn sa bug à la ligne: bmp=RPG::Cache.characters(sprintf("pkmn_%03d.png",$pokemon_party.actors.id),0)


Et voici le log: 
 
Citation:
---------- Erreur de script : Affichage_equipe ----------
----- Version du logiciel : PSP DS v0.4
----- Type
NoMethodError


----- Message
- ARGS - ["pkmn_004.png", 0]
undefined method `characters' for RPG::Cache:Module


----- Position dans Affichage_equipe
Ligne 19


----- Backtrace
Script : Affichage_equipe | Ligne : 19 | Méthode : in `refresh'
Script : Affichage_equipe | Ligne : 16 | Méthode : in `each'
Script : Affichage_equipe | Ligne : 16 | Méthode : in `refresh'
Script : Scene_Map | Ligne : 53 | Méthode : in `main'
Script : Scene_Map | Ligne : 41 | Méthode : in `loop'
Script : Scene_Map | Ligne : 65 | Méthode : in `main'
Script : Main | Ligne : 58







Posté par Nuri Yuri le 14 Aoû - 22:43 (2011)
Il y a un S en trop à character enlève le (j'ai pas relu mon script Coupable)

Posté par Zbooby le 14 Aoû - 22:47 (2011)
XD, je viens de le voir aussi (enfin j'ai tenté et sa à marché) coup de chance !


Bon, mtn ça ne bug plus mais ça ne m'affiche rien :/

Posté par Pαlвσlѕку le 14 Aoû - 22:59 (2011)
Il faut que tu appelles le script, sinon ça n'affichera jamais rien. Clin d'œil foireux

Posté par Zbooby le 14 Aoû - 23:00 (2011)
il faut que j'apelle le script XD Mais comment ?

Posté par Pαlвσlѕку le 14 Aoû - 23:02 (2011)
Zbooby a écrit:
ou est ce que je dois mettre sa ?
Citation:

Après tu fais :
@interface=New_Interface.new
et à chaque mise à jour :
@interface.refresh






Peu tu m'expliquer stp un peu ton script, histoire que j'apprenne un peu ^^.
Merci d'avance.

Voilà comment faire, mais je ne sais pas à quel moment tu souhaites lancer ton script.
Je ne peux donc pas t'en dire davantage.

Posté par Zbooby le 18 Aoû - 15:05 (2011)
ben je veux qu'il fonctionne tout le temps, les chara des pokémon seront tout le temps affiché, sans exeption.


EDIT: j'ai changé plusieurs fois les coordonnées des chara mais sa n'affiche toujours rien...
Aidez moi svp :/


REEDIT: c'est bon, j'ai trouvé ce qui n'allais pas.
Mais il reste un dernier problème, lorsque que je clique sur "x" pour accéder au menu sa bug.







Voilà le log: 
---------- Erreur de script : Scene_Map ----------
----- Version du logiciel : PSP DS v0.4
----- Type
NoMethodError


----- Message
- ARGS - []
undefined method `dispose' for #<New_Interface:0x9785e10>


----- Position dans Scene_Map
Ligne 40


----- Backtrace
Script : Scene_Map | Ligne : 40 | Méthode : in `main'
Script : Main | Ligne : 58



Posté par Nuri Yuri le 18 Aoû - 15:25 (2011)
Ajout dans ta classe :
Code:

def dispose
  for i in 0...6
    @sprites[i].bitmap.dispose
    @sprites[i].dispose
  end
end

Posté par Zbooby le 18 Aoû - 15:42 (2011)
Merci, ça marche.
Tu as solution à tout ;P
Juste une dernière chose, lorsque j'ouvre le menu les Pokémon disparaissent, or je voudrais qu'ils soient tout le temps affichés.