Sujet n°12904
Posté par TouzaxA le 6 Juil - 08:45 (2013)
Titre : Triple choix
Bonjour à tous !
Je vous présente aujourd'hui mon premier script public. Généralement, je me les garde de côté pour moi tout seul Spiky , mais j'ai décidé de faire une petite exception.
Il s'agit donc d'un script, à placer au dessus de main:
Code:
  #-----------------------------------------------------------------------------
  # draw_choice_plus3
  #   Fenêtre de choix 1 / 2 / 3 récupéré dans une variable
  #   Par TouzaxA, à partir du travail de Krosk
  #-----------------------------------------------------------------------------   
  def draw_choice_plus3(arg1 = "", arg2 = "", arg3 = "", text1 = "", text2 = "", value = ["1","2","3"])         
    window = Window_Command.new(1, [arg1, arg2, arg3], $fontsizebig)
    width = [window.contents.text_size(arg1).width, window.contents.text_size(arg2).width, window.contents.text_size(arg3).width].max  + 12
    window.dispose
    @command = Window_Command.new(width + 27, [arg1, arg2, arg3], $fontsizebig)
    @command.x = 363 - 123 - width
    @command.y = 94
    @command.z = 10000
    @command.visible = false
    $textAffichage = false
    if text1 != "" || text2 != ""
      @dummy = Sprite.new
      @dummy.bitmap = RPG::Cache.picture($options[5])
      @dummy.x = 15
      @dummy.y = 158
      @dummy.z = 9999
      $textAffichage = true
    end
    @background = Sprite.new
    @background.bitmap = RPG::Cache.picture("draw_choice3")
    @background.x = 13
    @background.y = 227
    @background.z = 10001
    @curseur = Sprite.new
    @curseur.bitmap = RPG::Cache.picture("cursor_choice")
    @curseur.x = 13
    @curseur.y = 277   
    @curseur.z = 10002   
    @texte = Window_Base.new(0, 132, 250, 400)
    @texte.z = 10002
    @texte.opacity = 0
    @texte.contents = Bitmap.new(608, 412)
    @texte.contents.font.name = "Pokemon Emerald"
    @texte.contents.font.size = $fontsize
    @texte.draw_text_contour(19, 112, 212, 32, arg1, 1)
    @texte.draw_text_contour(19, 160, 212, 32, arg2, 1)
    @texte.draw_text_contour(19, 207, 212, 32, arg3, 1)
    @texte.draw_text(13, 8, 218, 32, text1)
    @texte.draw_text(13, 24, 218, 32, text2)
    $game_variables[15] = 1
    $game_variables[14] = 2   
    loop do
      Graphics.update
      Input.update
      @command.update         
      if @command.index == 0
        @curseur.x = 13
        @curseur.y = 253
      elsif @command.index == 1
        @curseur.x = 13
        @curseur.y = 299
      elsif @command.index == 2
        @curseur.x = 13
        @curseur.y = 347
      end 
      if Input.trigger?(Input::C) and @command.index == 0
        @command.dispose
        @background.dispose
        @curseur.dispose
        @texte.dispose
        if $textAffichage
          @dummy.dispose
          @dummy = nil
        end
        $game_variables[15] = 0 if not $game_variables[15] == 2
        @command = nil
        @background = nil
        @curseur = nil   
        @texte = nil
        @wait_count = 2         
        return value[0]       
      end
      if Input.trigger?(Input::C) and @command.index == 1
        @command.dispose
        @background.dispose
        @curseur.dispose
        @texte.dispose
        if $textAffichage
          @dummy.dispose
          @dummy = nil
        end
        $game_variables[15] = 0 if not $game_variables[15] == 2
        @command = nil
        @background = nil
        @curseur = nil   
        @texte = nil
        @wait_count = 2           
        return value[1]       
      end
      if Input.trigger?(Input::C) and @command.index == 2
        @command.dispose
        @background.dispose
        @curseur.dispose
        @texte.dispose
        if $textAffichage
          @dummy.dispose
          @dummy = nil
        end
        $game_variables[15] = 0 if not $game_variables[15] == 2
        @command = nil
        @background = nil
        @curseur = nil   
        @texte = nil
        @wait_count = 2           
        return value[2]       
      end
    end
  end

Il n'y a absolument pas de crédits obligatoires mais c'est toujours agréable, étant donné que tout le mérite revient à Krosk: je n'ai fait qu'adapter un petit peu.

Pour l'utilisation, il faut utiliser la commande script, et y ajouter le contenu suivant:
Code:
$game_variables[NumeroDeVariable] = draw_choice_plus3("Choix 1", "Choix 2", "Choix 3")

Cela stocke le résultat (1, 2 ou 3 par défaut) dans la variable indiquée.
Pour l'utiliser, il suffit de vérifier sa valeur.

Vous avez également la possibilité d'utiliser une description du choix:
Code:
$game_variables[NumeroDeVariable] = draw_choice_plus3("Choix 1", "Choix 2", "Choix 3", "Ligne 1 description", "Ligne 2 description")


Il est aussi possible de modifier les valeurs que prend la variable:
Code:
$game_variables[NumeroDeVariable] = draw_choice_plus3("Choix 1", "Choix 2", "Choix 3", "Ligne 1 description", "Ligne 2 description", ["Valeur 1", "Valeur 2", "Valeur 3"])

Cela peut être utile si cela modifie juste les paroles du personnage ensuite. Ainsi, on entre la réponse dans la valeur, et on l'affiche dans un message avec \V[NumeroDeVariable]. Cela économise des conditions.

Voilà !
Je joins également le template pour lequel le script est ajusté par défaut:

Il faut la mettre dans Graphics/Pictures et la nommer "draw_choice3.png".

J'espère que ça aidera les moins doués en script, ou les plus fainéants d'ailleurs. Petit saligaud mal élevé

Posté par TheDemon80 le 6 Juil - 09:31 (2013)
Cool super script (je suis moi même fainéant !!)

Posté par TouzaxA le 6 Juil - 09:52 (2013)
Content que ça serve.

Posté par Redder le 25 Juil - 19:56 (2013)
Très utile !
Merci beaucoup pour ce partage !

Posté par Nuri Yuri le 26 Juil - 08:14 (2013)
Utile sauf qu'il y a un truc qui ne va pas : value = ["1","2","3"]
Pourquoi des strings ? Pourquoi ?
Dans tes exemples d'utilisations tu utilises des variables de jeu et tu retourne un string ? Ne sais tu pas que l'interpreter d'évent ne sait pas comparer des strings dans les variables, plus globalement, imagine si les variables étaient définies ainsi :
Code:
class Game_Variable
  def void initialize()
    int* data=(int*)calloc($data_system->variables.size,4)
    malloc_error(data)
  end
  def int Game_Variables::operator[] (const int index)
    return data[index]
  end
  def int Game_Variables::operator[]= (const int index,int value)
    return data[index]=value
  end
end

Ça aurait donné un jolis résultat en sortie parce qu'à la fin, c'est pas "1" "2" ou "3" qui aurait été comparé mais 48653880, 48647904 ou 48644784 vu que les variables de jeu n'aurait pris que des ints.
Enfin, tout ça pour dire qu'il faut faire gaffe aux arguments par défauts que prend une fonction, surtout pour l'utilisation qui lui est destinée.

Merci du partage tout de même :b

Posté par TouzaxA le 26 Juil - 08:35 (2013)
C'est vrai que pour vérifier, j'utilise à chaque fois des scripts. XD
En fait, je crois qu'il n'y a pas une seule condition dans mon jeu qui ne teste pas du code.
Et j'ai mis des string pour avoir une indication "propre". Comme ça, je sais directement quand je fais la suite, ce qu'il faut que je mettes si je ne me rappelles plus du choix. C'est plus clair. ^^
En plus, j'utilise jamais les variables de l'éditeur pour ça. XD

Posté par Nuri Yuri le 26 Juil - 12:59 (2013)
Ça dépends pour quoi tu utilise les strings, si c'est pour stocker des nombres, c'est une très mauvais idée. Voici une démonstration de ce que tu appelles propre : (Moi, je l'appelle, lent et consommateur de mémoire.)

Bien entendu, l'index de l'object id prend un peu de temps mais supposons que cela en prend autant que créer un string, on se retrouverais donc avec 4 secondes pour 10000 strings contre 4ms pour 10000 fixnums.

Après, si il s'agit de contenir "Salut" y'a pas de problèmes c'est normal :b

Posté par TouzaxA le 26 Juil - 14:09 (2013)
Si quelqu'un souhaite mettre des nombres à la place, il n'y a pas de problème: le code fonctionne aussi. ^^

Posté par Rox le 19 Aoû - 21:58 (2013)
Merci du partage !
Est ce qu'il est possible d'ajouter plus que trois choix sans faire énormément de modifications ?
Depuis le temps que je l'attendais ^^

Posté par TouzaxA le 20 Aoû - 06:49 (2013)
Pas si facilement que ça en fait. ^^'
Je verrais pour faire une version qui s'adapte au nombre de possibilités voulues. Par manque de place, je pense mettre un système de défilement.

Posté par Rox le 20 Aoû - 09:48 (2013)
Merci d'avance ^^
Si le problème de place vient des images, soit d'être facile à faire avec le draw choice HGSS.

Posté par TouzaxA le 20 Aoû - 10:08 (2013)
Bah en fait ça serait une histoire de faire défiler les choses. Genre:
Proposition 1
Proposition 2
Proposition 3
<Flèche vers le bas>
Et si on arrive à la 3, et qu'on continue, on a par exemple:
<Flèche vers le haut>
Proposition 2
Proposition 3
Proposition 4

Je peux essayer de le faire. Clin d'œil foireux

Posté par Rox le 20 Aoû - 11:35 (2013)
Moi c'est bizarre, je pensais plutôt à un défilement par la gauche x)
C'est une bonne idée, je crois que ça rend mieux que dans les jeux officiels Imbécile heureux

Posté par TouzaxA le 20 Aoû - 11:36 (2013)
Bah après je peux laisser aussi la possibilité. Faut voir. ^^

Posté par Nuri Yuri le 20 Aoû - 12:38 (2013)
T'aurais peut être pas du utiliser un truc du genre Window_Command, t'es obligé de recoder quelque chose qui en découle lorsque tu veux faire des choses plus complexes...
Si tu es en sprite lorsque t'appuies sur Bas ou haut, tu as juste à vérifier si le curseur est aux extrémités et donc demandé un nouveau dessin de la chose.
Je vais partager quelques scripts qui vont peut être pousser les gens à utiliser les Sprites Plutot que les Window...

Posté par Wolforax le 20 Aoû - 12:42 (2013)
J'ai pas toujours compris le fonctionnement du script ni comment l'utiliser pourrais-tu réexpliquer stp?

Posté par TouzaxA le 20 Aoû - 12:43 (2013)
Bah je vais refaire ça avec des tableaux, et tester la longueur de chaque tableau pour gérer le truc, je pense.

@Wolforax: Il suffit d'installer le script (au dessus de main), de faire un nouvel évent, d'insérer un script et de mettre dedans un truc du genre:
Code:
$game_variables[200] = draw_choice_plus3("Choix 1", "Choix 2", "Choix 3") 

La variable 200 est prise au hasard.
Ensuite, il faut faire un condition où l'on teste la valeur de la variable choisie.

Posté par Wolforax le 20 Aoû - 12:57 (2013)
ok merci

EDIT: j'ai un problème, j'ai mis un évent en processus //. qui dit que si la variable 29 = 1. on envoie un message.
Mais ça ne fonctionne pas :/

$game_variables[29] = draw_choice_plus3("Oui", "Non", "Désactiver")