Sujet n°11944
Posté par Nuri Yuri le 22 Aoû - 08:54 (2012)
Titre : Questions Ruby
Bonjour, j'ai décidé de créer un topic dans lequel vous pourrez poser quelques questions à propos du ruby pour vous aider à réaliser vos scripts ou simplement apprendre, je pense que ça sera une manière un peu plus simple car la rédaction d'un cours complet est long compliqué et quand on le rédiges on se demande à chaque fois qu'est-ce qu'on va expliquer d'abord car en ruby le fait que tout soit objet lie tout à tout et c'est dure de parler de quelque choses sans expliquer tout ce qui l'entour.
Les questions que vous pourrez poster porterons sur les manières de coder ou ce que sont certains choses par exemple "c'est quoi une classe, comment ça se fait" ou "quelles sont les manières de faire un bloc itératif / énumératif" mais je préviens quand même de certaines choses, je ne répondrait pas à certaines questions en profondeur comme les RegExp car c'est une chose que je ne maitrise pas entièrement mais cela n'empêche pas aux autres scripteurs d'y répondre. Vous pourrez aussi poser des questions sur le fonctionnement des classes ruby ou RGSS mais attention il ne s'agira pas de vous faire un script.
J'espère pouvoir partager assez de connaissance et aider ceux qui veulent apprendre ou ceux qui ne comprennent pas les tutos sur internet Gros matou qui ronronne

PS : Je ne sais pas vraiment dans quelle sous-forum mettre ça car le type de sujet fait que c'est à la fois une offre du support technique et du script en même temps mais il faut pas déranger le fonctionnement des autres sections non plus donc...

Posté par Xyrram le 22 Aoû - 11:08 (2012)
Bonjour je vient te demander ton aide car je n'ai pas conpris comment fonctione les condition en ruby.
pourait-tu expliquer?

Posté par Ram' le 28 Aoû - 17:52 (2012)
Youri, tu penserais quoi au fur et à mesure que tu réponds à des messages sur ce sujet qu'on les déplace dans un forum ou un sujet dédié où il n'y aurait que tes réponses et pas les questions? Et où ça serait un peu organisé?

Posté par Nuri Yuri le 28 Aoû - 18:49 (2012)
Ça peut être bien Gros matou qui ronronne J'essaierais de voir ça quand je réécrirais la première réponse.

Posté par Elric le 29 Aoû - 13:51 (2012)
Hello à toi !
Je te remercie pour ce Topic génial !

Je voudrais te demander une chose :

Comment on fait pour faire défiler le dummy des messages de y = 336 à y = 283 (par exemple)
J'ai essayé de me baser sur Pokemon_Battle_Trainer (où les trainers défilent) nénamoins, je n'ai réussi qu'à faire bugger le jeu (à cause d'une boucle infinie qui ne break pas)...

Merci d'avance !

Posté par Arc-Arceus le 29 Aoû - 18:03 (2012)
Yay !! Génial ce topic ! Je pense que pas mal de monde en rêvait.
On peut poser des questions ?! Vrai ?! Alors j'y vais :

Dand un script, je crée une entité sous forme de tableau contenant des caractéristiques variables. Dans la suite, je veux affecter automatiquement une valeur aux variables du tableau en allant pêcher ces dernières dans une matrice préalablement définie. Donc en fonction d'une $Variable, je vais sur (I ligne, J colonne) et je retranscris ça dans l'Objet tableau... c'est peut-être très con mais je pêche...
Peux-tu m'aider (*s'teuplait ?*) =3

Posté par Nuri Yuri le 29 Aoû - 18:28 (2012)
Je comprends pas entièrement le sens de ta question... Donne moi un exemple du tableau / de la matrice et de ce que ça devrait donner au final ou reformule.

Posté par Arc-Arceus le 29 Aoû - 18:34 (2012)
Ok :
Au début, on a la matrice A(n,p). Définie.
Ensuite :
array = [a, b, c]
=> Si $Variable == desfrites
alors array = [paramètres de la case i,j dans A]
etc...

Je pense pas arriver à être plus explicite... XD mais il me manque la méthode...

Posté par Nuri Yuri le 29 Aoû - 18:49 (2012)
Code:
array=[1,2,3,4,5,6]
matrice=Marshal.load("matrice") #supposons que matrice contient l'objet voulu
if $Variables == :desfrites
  array.clear
  array.push(matrice[i,j]) #Dans le cas où matrice est une Table ce qui implique que des fixnums au final array=[matrice[i,j]]
elsif $Variable == :rien
  matrice[i][j].each_index do |k|
      array[k]=matrice[i][j][k] #Dans le cas où la matrice est un ensemble de tableaux
      #Tu peux aussi faire traitement_tablea(k,array,matrice) si tu veux faire des choses spéciales comme des additions.
  end
end

Sérieusement je vois pas quel est ton but dans tout ça donc je sens que ce que je te donne n'est pas bon donc...

Posté par Arc-Arceus le 29 Aoû - 18:56 (2012)
Merci, je vais essayer (en sachant que la matrice ne contient pas que des Fixnum). ^^

Posté par Elric le 30 Aoû - 10:52 (2012)
Merci Nyuki ! Je vais essayer ça tout de suite !

EDIT : Je remplace "i" par quoi ?

Posté par Nuri Yuri le 30 Aoû - 13:35 (2012)
Tu peux remplacer i par j ou ma_variable, c'est une variable locale.

Posté par Arc-Arceus le 30 Aoû - 13:49 (2012)
@elric : Ce n'est pas i qu'il faut remplacer, mais "dummy" en fonction du nom qu'il porte dans le reste du script. =)
Je pense que c'était le but du commentaire de Nyuky.

Posté par Elric le 30 Aoû - 16:10 (2012)
N'empêche que ça marche pas ! Où est-ce que je dois mettre ce code ?

Posté par The_Doctor le 30 Aoû - 20:58 (2012)
Nyuky j'ai une demande y'a t'il un script ( pas pour un event mais un vrai script ) pour la condition de " si le heros est tourné vers " merci d'avance au grand(e) Nyuky ( je suis pas sur si t'es un gars ou une fille )

Posté par og_loc-TATOO le 30 Aoû - 23:11 (2012)
Il est les deux pour éviter la jalousie Clin d'œil foireux

Posté par Nuri Yuri le 30 Aoû - 23:22 (2012)
$game_player.direction
À toi de voir quelle valeur tu veux.

Posté par Elric le 31 Aoû - 00:43 (2012)
J'ai un problème avec ton code. Le truc, c'est que le dummy s'affiche directement à 283, on ne le voit pas défiler ! Aurais-tu une idée du problème ?

Posté par Nuri Yuri le 31 Aoû - 00:47 (2012)
Envois le code exacte que t'as mis.

Posté par Elric le 31 Aoû - 00:53 (2012)
J'ai mis exactement le même que le tien, mais voilà :
Spoiler

Code:

#==============================================================================
# ■ Window_Message
# Pokemon Script Project - Krosk
# 18/07/07
#-----------------------------------------------------------------------------
# Scène à ne pas modifier de préférence
#-----------------------------------------------------------------------------
#
#-----------------------------------------------------------------------------

class Window_Message < Window_Selectable
  #--------------------------------------------------------------------------
  #
  #--------------------------------------------------------------------------
  def initialize
    # Redéfinition taille du cadre
    super(21, 342, 597, 126)
    self.contents = Bitmap.new(width - 32, height - 32)
    self.visible = false
    self.z = 9998
    self.opacity = 0
    @dummy = Sprite.new
    @dummy.bitmap = RPG::Cache.picture(POKEMON_S::MSG)
    @dummy.visible = false
    @dummy.z = 9997
    @fade_in = false
    @fade_out = false
    @contents_showing = false
    @cursor_width = 0
    @speed_defilement = POKEMON_S::SPEED_MSG
    self.active = false
    self.index = -1
  end
  #--------------------------------------------------------------------------
  #
  #--------------------------------------------------------------------------
  def reset_window
    # Redéfinition
    if $game_temp.in_battle
      self.y = 342
      @dummy.y = 336
    else
      case $game_system.message_position
      when 0  # 上
        self.y = 6
        @dummy.y = 0
      when 1  # 中
        self.y = 166
        @dummy.y = 160
      when 2  # Redéfinition position du cadre inférieur
        self.y = 342
        @dummy.y = 336
        336.step(283,-1) do |i| 
          @dummy.y=i #A remplacer par la bonne variable 
          Graphics.update 
        end
      when 3
        self.y = $position + 6
        @dummy.y = $position
        $game_system.message_position = 2
      end
    end
    case $game_system.message_frame
    when 0
      #self.opacity = 255
      @dummy.opacity = 255
    when 1
      #self.opacity = 0
      @dummy.opacity = 0
    when 2
      #self.opacity = $opacite
      @dummy.opacity = $opacite
      $game_system.message_frame = 0
    else
      #self.opacity = 0
      @dummy.opacity = 0
    end
    self.back_opacity = 255
  end
  #--------------------------------------------------------------------------
  #
  #-------------------------------------------------------------------------- 
  def update
    super
    # フェードインの場合
    if @fade_in
      self.contents_opacity += 24
      if @input_number_window != nil
        @input_number_window.contents_opacity += 24
      end
      if self.contents_opacity == 255
        @fade_in = false
        if @speed_defilement != 0
          refresh
        end
      end
      return
    end
    # 数値入力中の場合
    if @input_number_window != nil
      @input_number_window.update
      # 決定
      if Input.trigger?(Input::C)
        $game_system.se_play($data_system.decision_se)
        $game_variables[$game_temp.num_input_variable_id] = @input_number_window.number
        $game_map.need_refresh = true
        # 数値入力ウィンドウを解放
        @input_number_window.dispose
        @input_number_window = nil
        $nb_min = nil
        $nb_max = nil
        terminate_message
      end
      return
    end
    # メッセージ表示中の場合
    if @contents_showing
      # 選択肢の表示中でなければポーズサインを表示
      if $game_temp.choice_max == 0
        self.pause = true
      end
      # キャンセル
      if Input.trigger?(Input::B)
        if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
          $game_system.se_play($data_system.cancel_se)
          $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
          terminate_message
        end
      end
      # 決定
      if Input.trigger?(Input::C)
        if $game_temp.choice_max > 0
          $game_system.se_play($data_system.decision_se)
          $game_temp.choice_proc.call(self.index)
        end
        terminate_message
      end
      return
    end
    # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合
    if @fade_out == false and $game_temp.message_text != nil
      @contents_showing = true
      $game_temp.message_window_showing = true
      reset_window
      if @speed_defilement == 0
        refresh
      end
      self.visible = true
      @dummy.visible = true
      Graphics.frame_reset
      self.contents_opacity = 0
      if @input_number_window != nil
        @input_number_window.contents_opacity = 0
      end
      @fade_in = true
      return
    end
    # 表示すべきメッセージがないが、ウィンドウが可視状態の場合
    if self.visible
      @fade_out = true
      @dummy.opacity = 0
      #self.opacity -= 48
      if @dummy.opacity == 0 #self.opacity == 0
        self.visible = false
        @dummy.visible = false
        @fade_out = false
        $game_temp.message_window_showing = false
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  #
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.font.name = $fontface
    self.contents.font.size = $fontsize
    text_count = 0
    x = y = 0
    push = false
    @cursor_width = 0
    # 選択肢なら字下げを行う
    if $game_temp.choice_start == 0
      x = 8
    end
    # 表示待ちのメッセージがある場合
    if $game_temp.message_text != nil
      text = $game_temp.message_text
      # 制御文字処理
      begin
        last_text = text.clone
        text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
        # MODIF
        text.gsub!(/\\[Pp]\[([0-9]+)\]/) { $string[$1.to_i] }
      end until text == last_text
      text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
        $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
      end
      # 便宜上、"\\\\" を "\000" に変換
      text.gsub!(/\\\\/) { "\000" }
      # "\\C" を "\001" に、"\\G" を "\002" に変換
      text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
      text.gsub!(/\\[Gg]/) { "\002" }
      # c に 1 文字を取得 (文字が取得できなくなるまでループ)
      while ((c = text.slice!(/./m)) != nil)
        # \\ の場合
        if c == "\000"
          # 本来の文字に戻す
          c = "\\"
        end
        # \C[n] の場合
        if c == "\001"
          # 文字色を変更
          text.sub!(/\[([0-9]+)\]/, "")
          color = $1.to_i
          if color >= 0 and color <= 7
            self.contents.font.color = text_color(color)
          end
          # 次の文字へ
          next
        end
        # \G の場合
        if c == "\002"
          # ゴールドウィンドウを作成
          if @gold_window == nil
            @gold_window = Window_Gold.new
            @gold_window.x = 560 - @gold_window.width
            if $game_temp.in_battle
              @gold_window.y = 192
            else
              @gold_window.y = self.y >= 128 ? 32 : 384
            end
            @gold_window.opacity = 255
            @gold_window.back_opacity = 255
          end
          # 次の文字へ
          next
        end
        # 改行文字の場合
        if c == "\n"
          # 選択肢ならカーソルの幅を更新
          if y >= $game_temp.choice_start
            @cursor_width = [@cursor_width, x].max
          end
          # y に 1 を加算
          y += 1
          x = 0
          # 選択肢なら字下げを行う
          if y >= $game_temp.choice_start
            x = 8
          end
          # 次の文字へ
          next
        end
        # 文字を描画
        self.contents.draw_text(4 + x, 32 * y, 40, 32, c)
        text_count += 1
        Input.update
        if Input.trigger?(Input::C)
          push = true
        end
        if text_count == @speed_defilement and @speed_defilement != 0 and push == false
          Graphics.update
          #$game_map.update
          $scene.update#spriteset.update
          text_count = 0
        end
        # x に描画した文字の幅を加算
        x += self.contents.text_size(c).width
      end
    end
    # 選択肢の場合
    if $game_temp.choice_max > 0
      @item_max = $game_temp.choice_max
      self.active = true
      self.index = 0
    end
    # 数値入力の場合
    if $game_temp.num_input_variable_id > 0
      @input_number_window = Window_InputNumber.new($game_temp.num_input_digits_max)
      @input_number_window.x = self.x + 8
      @input_number_window.y = self.y + $game_temp.num_input_start * 32
    end
  end
  #--------------------------------------------------------------------------
  #
  #-------------------------------------------------------------------------- 
  def update_cursor_rect
    if @index >= 0
      n = $game_temp.choice_start + @index
      self.cursor_rect.set(0, n * 32, 32, 32)
    else
      self.cursor_rect.empty
    end
  end
end

class Interpreter
  def setup_choices(parameters)
    # Redéfinition
    # choice_max に選択肢の項目数を設定
    $game_temp.choice_max = parameters[0].size
    # message_text に選択肢を設定
    for text in parameters[0]
      # Espaces supplémentaires
      $game_temp.message_text += "  " + text + "\n"
    end
    # キャンセルの場合の処理を設定
    $game_temp.choice_cancel_type = parameters[1]
    # コールバックを設定
    current_indent = @list[@index].indent
    $game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }
  end
end


Posté par The_Doctor le 31 Aoû - 08:37 (2012)
Bon j'ai 2 autres requête a te faire Nyuky les voici :

-1 comment mettre le nom du premier pokemon de l’équipe en script ( je sais comment faire dans les message d'event mais je suis pas sur que c'est pareil )
-2 comment mettre en condition l'appui d'une touche ( du style " si le héros appui sur "C" ça fait telle ou telle truc " )

voila j’espère que c'est pas trop

merci d'avance

EDIT pas très visible : Quelle partit de

Code:
name=String.new 
 
name<<$pokemon_party.actors[0].name if $pokemon_party.size>0


jne doit modifier par name que je souhaite ( je n'ait pas trop comprit ta phrase )

Posté par Elric le 31 Aoû - 16:52 (2012)
Merci Nyuki, ça marche parfaitement bien.

EDIT : J'aurais une autre question :

Comment on fait, en script, pour dire : si l'objet "Potion" est possédé ?

Posté par The_Doctor le 31 Aoû - 16:59 (2012)
Ah moi je sais Imbécile heureux

Code:
$pokemon_party.item_got(id)



et tu remplace par l'id de l'objet ici ce sera :

Code:
$pokemon_party.item_got(13)


Je n'en suis pas sur mais je le suis presque

PS J'ai trouvé le code sur ce sujet : ./3687-Script-Liste-de-commandes-utiles…

Posté par Xyrram le 31 Aoû - 17:30 (2012)
J'ai fait comme me l'a dit yuki pour les condition et sa a donner sa:
Code:

if Input.trigger?(Input::C)
  case $pokemon_party.actors[id].loyalty # Où id est l'id du Pokémon
 when  >=70
   draw_text_contour(189, 293, 50, 25, "Moyen", 0)
  when  >=120
   draw_text_contour(189, 293, 50, 25, "Bon", 0)
    when  >=160
      draw_text_contour(189, 293, 50, 25, "Tres bon", 0)
      when >=180
        draw_text_contour(189, 293, 50, 25, "Exelent", 0)
        when  >=250
         draw_text_contour(189, 293, 50, 25, "Symbiose", 0)
       end
     end

Mais il y a une erruere de syntaxe avant when
Que dois-je faire?

Posté par The_Doctor le 31 Aoû - 17:54 (2012)
J'ai légèrement modifier le script ca ne met plus d'erreur de syntax mais ca marche pas si j'appuis sur C ca ne fait rien

Code:
#-----------------------------------------------------------------------------
# ● Bonheur
# Le bonheur est comme dans HG/SS
# Partie modifiable a loisir
#-----------------------------------------------------------------------------
if Input.trigger?(Input::C)
  case $pokemon_party.actors[0].loyalty
  when 0..70
     draw_text_contour(189, 293, 50, 25, "Il ne vous aime pas trop", 0) 
  when 71..120 
     draw_text_contour(189, 293, 50, 25, "Il vous aime un peu mais se méfie", 0) 
  when 121..160 
     draw_text_contour(189, 293, 50, 25, "Il vous aime beaucoup", 0) 
  when 161..180 
     draw_text_contour(189, 293, 50, 25, "Il chante et dance un peu", 0) 
  when 181..255 
     draw_text_contour(189, 293, 50, 25, "Il est super heureux avec vous", 0) 
  end 
end



J'ai aussi modifier les parole pour mon projet mais on peut les modifier

Posté par Xyrram le 31 Aoû - 18:04 (2012)
He bien il faudrait que tu fasse >=70 je pense

Posté par The_Doctor le 31 Aoû - 18:07 (2012)
Non mais j'ai essayer ca et ca marche pas il faut le truc des 2 petit points

Sinon j'ai une question : où es-ce que tu le met le script pour le bonheur moi je l'ai mit a la fin du script follow me de Brendan

Posté par Xyrram le 31 Aoû - 18:11 (2012)
Moi aussi^^ mais je ne pense pas que se soit ça

Posté par Elric le 31 Aoû - 18:45 (2012)
Merci dab777, ça devrait marcher compte tenu de ta source !

Posté par The_Doctor le 31 Aoû - 18:54 (2012)
logique c'est Nyuky la source mais sinon quelqu'un pourrait nous aidé ou bien je fait un autre sujet pour arréter un peu de HS

Posté par Elric le 31 Aoû - 19:27 (2012)
En event ce serait vraiment plus simple parce que là vous vous ensablez !!

Posté par The_Doctor le 31 Aoû - 19:28 (2012)
ensablez ? Ca veux dire quoi

Posté par Xyrram le 31 Aoû - 19:28 (2012)
Ouai mais on serait plus fier si se serait un script et puis se sera moins encobrant le script

Posté par Elric le 31 Aoû - 20:18 (2012)
dab777 a écrit:
ensablez ? Ca veux dire quoi


S'enfouir dans le sable ! (cf. Animé de Square Enix : FMA)

@Dragonstar => Il faut paramétrer beaucoup de choses : Le héros qui regarde le Pokémon, les opérateurs, et il ne faut pas utiliser draw_text, mais afficher_message !

Posté par The_Doctor le 31 Aoû - 20:20 (2012)
le héros qui regarde le pokemon a été deja paramètrer il faut juste tester mais les opérareur c'est quoi et merci pour le bonne affichage du message

Posté par Xyrram le 31 Aoû - 20:25 (2012)
Oui merci BEAUCOUP et oui Dab a raison que sont les opérateurs?

Posté par The_Doctor le 31 Aoû - 20:32 (2012)
apparement on s'y connais presque autant en script bon j'espere que cette histoire sera vite réglée

Posté par Xyrram le 31 Aoû - 20:35 (2012)
Oui a se que je vois.
On deverait travailler ensemble Clin d'œil foireux .
Sinon yuri pourait tu expliquer l'affichage de bitmap

Posté par Elric le 31 Aoû - 20:36 (2012)
Les opérateurs sont les signes que tu utilises en math comme : +, -, *, /, =, <, >, <=, >=... etc.
Pour votre cas, je suppose qu'il faudrait essayer ça :

Code:

if $pokemon_party.actors[0].loyalty <= 70
# Code pour afficher le message
elsif $pokemon_party.actors[0].loyalty > 70 and $pokemon_party.actors[0].loyalty < 120
# Code pour afficher le message
...
...
...
end


Oubliez afficher_message, ça ne marchera pas.

Posté par Xyrram le 31 Aoû - 20:50 (2012)
Eh bien on entend le bruit programer 1 fois puis plus rien.

Posté par Elric le 1 Sep - 11:16 (2012)
Hellow à toi !
J'ai une question, s'il te plait :

Je voudrais décaler le texte qui s'affiche dans un message de 50 px en "x", cependant, je n'ai pas trouvé le bout de code à modifier.

Merci d'avance !

Posté par Nuri Yuri le 1 Sep - 11:28 (2012)
Dans Window_Message* tu as cette ligne : draw_msg_text(4 + x, 16 * y, 12, 32, c, 0, @color) remplace le 4 par 54 ce qui donnera : draw_msg_text(54 + x, 16 * y, 12, 32, c, 0, @color).
Édit : Sinon, j'aimerais que vous me posiez plus des questions sur le ruby plutôt que des morceau de codes.

Posté par Arc-Arceus le 1 Sep - 14:06 (2012)
J'en ai une, de question. (lève le doigt)
=> Peux-tu nous faire un topo sur les listes (comme ce qui a été fait pour les conditions), sur leur nature, leur utilisation et la façon de les manipuler ? Parce que j'ai regardé ça de très loin, pour être honnête...

Posté par Elric le 1 Sep - 18:48 (2012)
Hellow à toi !
Je te remercie pour ton aide précieuse.

J'aimerais également (je sais c'est trop) apprendre comment utiliser la fonction "rand", je n'ai jamais compris.

Merci d'avance !

Posté par Xyrram le 8 Déc - 20:29 (2012)
J'ai une question:
Que sont les arguments en Ruby?

Posté par Xyrram le 8 Déc - 22:45 (2012)
Mais alors quant un script manque d'arguments cella veut dire qu'il lui faut:
Def...
Script
Return
End

Posté par Ze_Jirachi le 11 Avr - 15:24 (2013)
Bonjour Yuri! Je postes ici car je n'ai pas vraiment compris le principe pour réaliser une scène... J'ai essayé de voir le tuto sur le-site-dont-je-ne-citerai-pas-le-nom mais j'ai rien compris. Pourrais-tu m'expliquer?

Posté par Ram' le 13 Avr - 17:04 (2013)
J'ai divisé les parties que j'ai réussi à isoler dans une section spéciale Yuri.
Par contre il y a certaines choses auxquelles j'ai préféré ne pas toucher ne sachant pas vraiment ce qui allait avec quel autre message.

Posté par Zohran le 15 Avr - 14:39 (2013)
Merci par avance pour ce topique, je souhaiterais créer pour un projet une base de données programmées de A à Z. Voilà ma question:

Par exemple (ce ne sera pas le but de ma programmation), si je souhaitais créer en script une classe qui donne tout ce qui constitue ce qu'est un pokémon, comment dois-je procéder? (créer attribut niveau, pv... etc)

Ensuite comment utiliser ses attributs dans des interfaces, en fait je souhaite apprendre les choses les plus fondamentales et aussi les plus dures du ruby...

Autre question: A quoi sert un module, je suis pas sur d'avoir compris...

Posté par Nuri Yuri le 20 Avr - 08:55 (2013)
T'as deux choix, coder une classe de A à Z, ce qui te permettra de créer des méthodes spécifique sans avoir à "patcher" cette classe (réécrire dedans en gros) ou passer la classe Struct.
Dans les deux cas les effets sont les même sauf qu'avec la classe Struct, tu n'as pas à mettre les attributs et à coder la fonction d'initialisation, en contre partie toute les variables non précisé lors de la création de l'objet seront mises à nil. (Peut être gênant).
Voici les prototypes :
Avec Struct
Code:
Pokemon=Struct.new(:base_hp,:atk,:def,...) #J'ai mis ... pour ne pas tout écrire il faudra les remplacer par toute les variables.
#<...>
#Utilisation de la struct.
@Pokemon1=Pokemon.new(5,1,3,...)
@Pokemon1.base_hp=6
print(@Pokemon1.atk)
data=Marshal.dump(@Pokemon1) #Retourne un string correspondant au data sauvé.

Sans Struct (mais beaucoup plus maitrisé)
Code:
class Pokemon
  attr_accessor :name
  def initialize(*args)
    @base_hp=args[0].to_i.abs #Là je maîtrise la valeur car je la force à être positive
    @atk=args[1]
    #<...>
    @name=args[n]
  end
  def base_hp()
    return @base_hp=1 if(base_hp<=0)
    return @base_hp
  end
  def base_hp=(value)
    return if(value<=0)
    @base_hp=value
  end
  #<...>
end
#<...>
@Pokemon1=Pokemon.new(5,1,3,...)
@Pokemon1.base_hp=-6
print(@Pokemon1.base_hp) #Affiche 5 car -6 <= 0
data=Marshal.dump(@Pokemon1) #Retourne un string correspondant au data sauvé.

Après pour la base de données à toi de t'organiser, tu peux faire comme PSP 1.0 où l'on enregistre tous les datas dans des fichiers séparés ou alors faire comme PSP 0.7 en enregistrant tout dans un seul fichier mais en utilisant des classes Pokemon (ou Data_Pokemon selon le nom que tu donnes).
C'est là le but des classes, avoir des instances différentes pour travailler et maitriser le data.

Pour ce qui est des modules, c'est légèrement différent.
Ils servent à fournir des méthodes ou un travail complet mais ne génèrent pas d'instance à leur nom car ce sont eux même des instances au détail près, il faut expliciter les méthodes que l'on veut rendre utilisable sans include.
Les modules peuvent être vu comme des conteneurs, sur PSP c'est dans le module POKEMON_S qu'il y a la classe Pokemon et tout ce qui s'en rapproche. Sur PSP v1.0 on utilise des modules pour les scènes qui n'ont pas besoins d'instances comme Scène_Title. Elle a besoins d'être lancé qu'une fois donc on la met dans un module, par contre on doit gérer le vidage des variables car les modules sont des instances sur la durée et tant qu'on ne les efface pas explicitement ils ne seront pas libérés par le GC.
Code:
module Scene_Title
  module_function #J'explicite que tout ce qui suit sera des méthodes utilisable sans include : Scene_Title.main()
  def new() return self end
  def main()
    print("Vous avez lancé Scene_Title")
    $scene=Scene_Map.new
  end
end

Je te déconseille pour le moment d'utiliser cette manière de coder avec les modules car il faut un peu d'expérience et savoir ce que contiennent réellement des variables.
Quand tu sauras lancer Scene_Title de cette manière $scene=variable.new, tu pourras probablement commencer à coder des modules destinés uniquement au travail et non au stockage de méthode ou constante.

Posté par Zohran le 20 Avr - 21:58 (2013)
Je te remercie beaucoup d'avoir pris le temps de me répondre, tu commences à me permettre de m'améliorer considérablement en script, je vais garder tes explications sous la main. Je reposterais d'autres questions plus tard dès que j'aurais bien assimilé cela. Merci Imbécile heureux

Ca fait plaisir d'avoir un bon scripteur qui aide des apprentis tel que moi, parce que à part RPG Maker, je n'avais jamais programmé de ma vie, je ne savais pas coder, j'ai appris ce que je sais faire par moi même en analysant des scripts et en lisant quelques tuto de Tonyryu, mais malheureusement, les tutos ne sont pas assez nombreux pour le ruby sur RPG Maker pour me permettre d'aller beaucoup plus loin en script. Donc encore MERCI Imbécile heureux

QUESTION: Dans le script sans structure, tu as mis un attr_accessor: name, je voudrais savoir pourquoi... serait-ce-parce que en fait les pts de vie, attaque et autre existe déjà, tu as donc rajouté cet objet inexistant, cest pour ça?
2ème quesion: Où je peux voir les objets existants tels que les PV, dans l'aide RGSS de rpg maker? Dans les class RPG? Ou les class Game existantes?

PS: Coder une classe nouvelle sans structure me parait plus propre et plus clair non? Personnellement, je pense que coder une classe neuve sera moins fouillie...

EDIT: Autre question-> la différence entre attr_reader et attr_accessor ?