Sujet n°3519
Posté par Lén le 19 Avr - 17:39 (2009)
Titre : [Recherche] Besoin de connaître quelques fonctions ...
Salut salut !
Sous la forme d'un Question/Réponse, voici quelques trucs a connaître pour afficher les infos sur ses pokémon (si vous cherchez a faire une nouvelle interface par exemple)
Ce qui suis est fait sous PSP4G+.

JE TIENS A RAPELLER QUE JE N'AI PAS ENCORE TOUT TROUVÉ DONC N'HÉSITEZ PAS À M'AIDER !!!
Spoiler
Voici la définition de la fonction:
Code:

def draw_hp_bar(x, y, level)
      src_rect = Rect.new(0, 0, 60, 7)
      bitmap = RPG::Cache.picture("hpbarsmall2.png")   #Image personnelle, utilisez la votre
      self.contents.blt(x, y, bitmap, src_rect, 255)
      rect1 = Rect.new(x + 15, y + 2, level*43.to_i, 1) #43 est la largeur du rectangle à remplir par les HP restants
      rect2 = Rect.new(x + 15, y + 3, level*43.to_i, 2) # 15, 3 et 2 sont des valeurs qui determine où se trouve le rectangle
      
      if level < 0.1 # C'est les couleurs que prendra le rectangle des HP (vert jaune ou rouge)
        color1 = Color.new(170, 70, 70, 255)
        color2 = Color.new(250, 90, 60, 255)
      elsif level >= 0.1 and level < 0.5
        color1 = Color.new(200, 170, 0, 255)
        color2 = Color.new(250, 225, 50, 255)
      else
        color1 = Color.new(90, 210, 125, 255)
        color2 = Color.new(110, 250, 170, 255)
      end
      self.contents.fill_rect(rect1, color1)
      self.contents.fill_rect(rect2, color2)
  end


 C'est donc la fonction suivante qui permet d'afficher une barre de hp

Code:

 draw_hp_bar(x, y, level)

x: Position sur l'axe des abscisses de l'écran
y: Position sur l'axe des ordonnées de l'écran
level: C'est le pourcentage de la vie qu'il reste a voter pokémon

Le pourcentage se calcule comme suis:
Code:

 level = $pokemon_party.actors[Numero].hp / $pokemon_party.actors[Numero].maxhp_basis.to_f


Numero est a remplacer par la position du pokémon dans l'équipe (0 est le pokémon en première position et 5 étant le dernier, soit la 6e position).
Ici on fait en fait:
Code:

 level = (HP actuels) / (HP max)

On obtient donc un pourcentage qui nous permettra de remplir le rectangle en fonction du pourcentage de HP restants.
En mettant en script dans un event ce qui suit, cela affichera une barre de HP du pokémon en première position de l'équipe.

 
Code:

  level = $pokemon_party.actors[0].hp / $pokemon_party.actors[0].maxhp_basis.to_f
  draw_hp_bar(100, 100, level)

Et voilà !

Spoiler
Voilà comment faire
Code:

if ($pokemon_party.actors[Numero].status > 0 and $pokemon_party.actors[Numero].status < 6) or $pokemon_party.actors[Numero].dead?
        string = "stat" + $pokemon_party.actors[Numero].status.to_s + ".png"
        src_rect = Rect.new(0, 0, 60, 24)
        bitmap = RPG::Cache.picture(string)
        self.contents.blt(x, y, bitmap, src_rect, 255)
end

Ici on a: x et y position de l'image a afficher, et Numero, ben comme la question d'au dessus.
Code:

         string = "stat" + $pokemon_party.actors[Numero].status.to_s + ".png"
et
         bitmap = RPG::Cache.picture(string)

Ces deux lignes servent à definir ce que l'on va afficher.
Voici un exemple concret: Notre pokémon en tête d'équipe est mort.
Code:

 if ($pokemon_party.actors[0].status > 0 and $pokemon_party.actors[0].status < 6) or $pokemon_party.actors[0].dead?
         string = "stat" + $pokemon_party.actors[0].status.to_s + ".png"
         src_rect = Rect.new(0, 0, 60, 24)
         bitmap = RPG::Cache.picture(string)
         self.contents.blt(x, y, bitmap, src_rect, 255)
 end

De plus,
Code:

 string = "stat" + $pokemon_party.actors[0].status.to_s + ".png"

SIGNIFIE EN FAIT

 string = "stat" + 0 + ".png"



Comment je sais que cela va afficher l'icone "K.O." ? Ben car j'ai regardé dans le dossier pictures, et dedans j'ai cherché les images des status, et il s'avere que l'image "stat0.png" c'est l'icone de "K.O."
Voici la liste des status, pour ceux qui on la flemme d'aller chercher:
Si la valeur de $pokemon_party.actors[NumeroDeVotrePokemon].status est:
0 => K.O.
1 => PSN
2 => PAR
3 => BRU
4 => DOR
5 =< GEL

Mainteant vous pourrez faires des piège sur vos maps en faisant ça, et oui, si vous marchez dans un feu, il suffit de faire
Code:

 $pokemon_party.actors[0].status = 3

Dans une commande de script dans un évènement (3e page des actions d'évènement, tout en bas à droite) et le pokémon en première position prendra feu ... Héhéhé !

Merci a Palbolsky qui m'a orienté (Voir la 4e Réponse de ce Sujet).


Dernière étape, trouver comment utiliser les infos dans data_zone.txt :D

Posté par Pαlвσlѕку le 19 Avr - 19:23 (2009)
Je ne sais pas si ça peut t'aider :

Script
Code:
  #------------------------------------------------------------
  # Gestion de statut
  #------------------------------------------------------------           
  # @status:
  # 0: Normal, 1: Poison, 2: Paralysé, 3: Brulé, 4:Sommeil, 5:Gelé, 8: Toxic
  # @confuse (6), @flinch (7)
    # Cure
    def cure
      @status = 0
      @status_count = 0
    end
 
    # Poison
    def poisoned?
      if @status == 1
        return true
      else
        return false
      end
    end
   
    def status_poison(forcing = false)
      if @status == 0 or forcing
        @status = 1
        return true # status imposé
      else
        return false # autre statut
      end
    end
   
    def poison_effect
      if @status == 1
        return Integer(maxhp_basis / 8.0)
      end
    end
   
    # Paralysis
    def paralysis_check
      if rand(100) < 25
        return true #lose attack chance
      else
        return false
      end
    end
   
    def status_paralyze(forcing = false)
      if @status == 0 or forcing
        @status = 2
        return true # status imposé
      else
        return false # autre statut
      end
    end
   
    def paralyzed?
      if @status == 2
        return true
      else
        return false
      end
    end
   
    # Burn
    def burn?
      if @status == 3
        return true
      else
        return false
      end
    end
   
    def burn_effect
      if @status == 3
        return @hp - Integer(@hp * 0.875)
      end
    end
   
    def status_burn(forcing = false)
      if @status == 0 or forcing
        @status = 3
        return true # status imposé
      else
        return false # autre statut
      end
    end
   
    # Sleep
    def asleep?
      if @status == 4
        return true
      else
        return false
      end
    end
   
    def status_sleep(forcing = false)
      if @status == 0 or forcing
        @status = 4
        @status_count = rand(7) + 1
        return true
      else
        return false
      end
    end
   
    def sleep_check
      @status_count -= 1
      if @status_count > 0
        return true #Dort
      else
        @status = 0
        return false #réveillé
      end
    end
   
    # Frozen
    def frozen?
      if @status == 5
        return true
      else
        return false
      end
    end
   
    def status_frozen(forcing = false)
      if @status == 0 or (forcing)
        @status = 5
        return true
      else
        return false
      end
    end
   
    def froze_check
      i = rand(100)
      if @status == 5 and i < 10
        @status = 0
        return false #defrosted
      elsif @status == 5 and i >= 10
        return true #still frozen
      end
    end
       
    # Confuse
    def confused?
      return @confused
    end
   
    def status_confuse
      if not(@confused)
        @confused = true
        @state_count = rand(4) + 2
        return true
      end
      return false
    end
   
    def confuse_check
      if @confused and @state_count > 0
        if rand(2) > 0
          return true # Auto damage
        end
      elsif @confused and @state_count == 0
        cure_state
        return "cured"
      end
      return false
    end
   
    def confuse_decrement
      if @confused
        @state_count -= 1
      end
    end
   
    def cure_state
      @confused = false
      @state_count = 0
    end
   
    # Flinch (peur?)
    def flinch?
      return @flinch
    end
   
    def status_flinch
      return @flinch = true
    end
   
    def flinch_check
      @flinch = false
    end
   
    # Toxic
    def toxic?
      if @status == 8
        return true
      end
      return false
    end
   
    def status_toxic(forcing = false)
      if @status == 0 or forcing
        @status = 8
        @status_count = 0
        return true
      end
      return false
    end
   
    def toxic_effect
      if @status == 8
        @status_count += 1
        return Integer(maxhp_basis / 16.0 * @status_count)
      end
    end
   
    def reset_toxic_count
      if @status == 8
        @status_count = 0
      end
    end

J'ai trouvé ce morceau dans le script Pokemon vers la ligne 1539.

Posté par Lén le 19 Avr - 20:02 (2009)
Ben je pense pas que ça va m'aider :s J'essaye de trouver tout ce qu'il me faut dans Pokemon_Party_Menu en fait car c'est la que sont la plupart des fonctions comme "afficher le statut", et sa m'évite d'avoir à coder un truc pour savoir quel pokémon est sous ce status ^^ Mais merci :D

Posté par Pαlвσlѕку le 19 Avr - 20:27 (2009)
La variable qui s'occupe des POKéMON K.O, c'est celle-ci :
Code:
@pokemon.dead?

La variable des status, donc elle regroupe tout les status, c'est celle-ci :
Code:
@pokemon.status

Selon à quel valeur elle est égale, le statut est modifié.

J'espère que je t'aurais aider cette fois.

Posté par Lén le 19 Avr - 22:32 (2009)
Ouais niquel ! maintenant que je connais les variables, je peu chercher comment les utiliser ^^ Merci !
J'ai trouvé ! premier post édité !

Posté par Sphinx le 20 Avr - 05:31 (2009)
pour récupérer le nom d'un lieu (tel qu'il est écrit sur le panneau qui s'affiche, à l'entrée d'une map) faut faire :

Code:
$data_zone[ID][0]

où ID est l'id de la zone en question ^o^

Note : buggera si la zone ID n'est pas définie dans data_zone.txt !

Posté par Lén le 20 Avr - 13:37 (2009)
 MERCIIII ! J'essaye ça tout de suite.