Voila j'ai réussi à afficher tous les persos de la BDD pour ça j'ai modifié : ligne 70
Code:
for i in 1...$data_actors.size @commands.push($data_actors[i].name) @items.push(Cache.character($data_actors[i].character_name)) end #for actor in $game_party.members #@commands.push(actor.name) #@items.push(Cache.character(actor.character_name)) #end
ligne 207
Code:
if $data_actors[i+1].character_name.include?("$") #if $game_party.members[i].character_name.include?("$")
ligne 213
Code:
index = $data_actors[i+1].character_index #index = $game_party.members[i].character_index
ligne 227
Code:
return if $data_actors.size < 2 #return if $game_party.actors.size < 2
if Input.press?(SWITCHEUR_KEY) and $data_actors.size > 0 #$game_party.actors.size > 0
Quand je switch je vois bien tous les persos de la BDD alors que j'en ai qu'un dans mon équipe
Spoiler:
Cool! Mais quand j'en selectionne un pour changer d'apparence le jeu freeze... moins cool! Donc y a toujours un problème =/ Si quelqu'un pouvait jeter un coup d'oeil et m'aider je suis à deux doigts je pense !!!
Le code:
Spoiler:
Code:
#============================================================================= # Switcheur de héros #----------------------------------------------------------------------------- # Créé par Sihn, à partir du menu tournant de MakirouAru # Conçu pour RMVX # Version 2.4 #=============================================================================
# Touche d'activation (Changez uniquement le Y) SWITCHEUR_KEY = Input::Y
# Son lors de l'apparition du switcheur SE_START = "Decision2"
# Animation à jouer sur le héros si changement de celui-ci ID_ANIMATION = 41
# Durée en frame de l'apparition du switcheur TRANS_FRAMES = 15
# Durée en frame de la rotation entre deux héros du switcheur MOVING_FRAMES = 10
# Rayon en pixel RAYON = 64
# true : En forme d'élipse / false : En forme de cercle ELIPSE = true
# true : Appuyez sur le bouton / false : Maintenez le bouton AUTO_KEY = true
#============================================================================= # Game_Temp #============================================================================= class Game_Temp
attr_accessor :switcheur_result
alias initialize_switcheur_result initialize def initialize initialize_switcheur_result @switcheur_result = false end
end
#============================================================================= # Game_Party #============================================================================= class Game_Party attr_accessor :actors end
#============================================================================= # Window_Switcheur #============================================================================= class Window_Switcheur < Window_Base
attr_accessor :index
def initialize super(-16, -16, 576, 448) self.contents = Bitmap.new(width-32, height-32) self.contents.font.name = "Arial" self.opacity = 0 self.back_opacity = 0 @commands = [] @items = [] for i in 1...$data_actors.size @commands.push($data_actors[i].name) @items.push(Cache.character($data_actors[i].character_name)) end #for actor in $game_party.members #@commands.push(actor.name) #@items.push(Cache.character(actor.character_name)) #end @item_max = @commands.size @index = 0 @cx = $game_player.screen_x + 16 @cy = $game_player.screen_y - 8 setup_move_start refresh end
def update super if @mode < 5 if Input.trigger?(Input::UP) or Input.trigger?(Input::LEFT) Sound.play_cursor ELIPSE ? setup_move_move(3) : setup_move_move(4) return elsif Input.trigger?(Input::DOWN) or Input.trigger?(Input::RIGHT) Sound.play_cursor ELIPSE ? setup_move_move(4) : setup_move_move(3) return elsif Input.trigger?(Input::B) and AUTO_KEY Sound.play_cancel $game_temp.switcheur_result = false setup_move_end return elsif AUTO_KEY if Input.trigger?(Input::C) or Input.trigger?(SWITCHEUR_KEY) Sound.play_decision $game_temp.switcheur_result = true setup_move_end return end else unless Input.press?(SWITCHEUR_KEY) Sound.play_decision $game_temp.switcheur_result = true setup_move_end return end end end refresh end
def refresh self.contents.clear case @mode when 1 refresh_start when 2 refresh_wait when 3 refresh_move(1) when 4 refresh_move(0) when 5 refresh_end end if @mode != 6 cy = ELIPSE ? 32 : 0 rect = Rect.new(@cx - 272, @cy + cy, self.contents.width - 32, 32) self.contents.draw_text(rect, @commands[@index], 1) else dispose end end
def refresh_start d1 = 2.0 * Math::PI / @item_max d2 = 1.0 * Math::PI / TRANS_FRAMES r = RAYON - 1.0 * RAYON * @steps / TRANS_FRAMES for i in 0...@item_max j = i - @index d = d1 * j + d2 * @steps x = @cx + (r * Math.sin(d)).to_i y = @cy - ((r * Math.cos(d)).to_i / elipse) draw_item(x, y, i) end @steps -= 1 if @steps < 1 @mode = 2 end end
def refresh_wait d = 2.0 * Math::PI / @item_max for i in 0...@item_max j = i - @index x = @cx + (RAYON * Math.sin(d * j)).to_i y = @cy - ((RAYON * Math.cos(d * j)).to_i / elipse) draw_item(x, y, i) end end
def refresh_move(mode) d1 = 2.0 * Math::PI / @item_max d2 = d1 / MOVING_FRAMES d2 *= -1 if mode != 0 for i in 0...@item_max j = i - @index d = d1 * j + d2 * @steps x = @cx + (RAYON * Math.sin(d)).to_i y = @cy - ((RAYON * Math.cos(d)).to_i / elipse) draw_item(x, y, i) end @steps -= 1 if @steps < 1 @mode = 2 end end
def refresh_end d1 = 2.0 * Math::PI / @item_max d2 = 1.0 * Math::PI / TRANS_FRAMES r = RAYON - 1.0 * RAYON * @steps / TRANS_FRAMES for i in 0...@item_max j = i - @index d = d1 * j + d2 * @steps x = @cx + (r * Math.sin(d)).to_i y = @cy - ((r * Math.cos(d)).to_i / elipse) draw_item(x, y, i) end @steps += 1 if @steps > TRANS_FRAMES @mode = 6 end end
def draw_item(x, y, i) item = @items[i] if $data_actors[i+1].character_name.include?("$") #if $game_party.members[i].character_name.include?("$") rect = Rect.new(item.width / 3, 0, item.width / 3, item.height / 4) opa = @index == i ? 255 : 128 self.contents.blt(x - item.width / 3, y - item.height / 4, item, rect, opa) else index = $data_actors[i+1].character_index #index = $game_party.members[i].character_index rect = Rect.new((item.width / 4) * (index % 4) + (item.width / 12), (item.height / 2) * (index / 4 % 2), item.width / 12, item.height / 8) opa = @index == i ? 255 : 128 self.contents.blt(x - item.width / 12, y - item.height / 8, item, rect, opa) end end
def setup_move_start @mode = 1 @steps = TRANS_FRAMES end
def setup_move_move(mode) return if $data_actors.size < 2 #return if $game_party.actors.size < 2 if mode == 3 @index -= 1 @index = @items.size - 1 if @index < 0 elsif mode == 4 @index += 1 @index = 0 if @index >= @items.size else return end @mode = mode @steps = MOVING_FRAMES end
def setup_move_end @mode = 5 @steps = 0 end
def elipse return ELIPSE ? -2 : 1 end
end
#============================================================================= # Scene_Map #============================================================================= class Scene_Map
alias ring_system_update update def update if @switcheur_window != nil if @switcheur_window.disposed? if $game_temp.switcheur_result and @switcheur_window.index != 0 $target_actor = $data_actors[@switcheur_window.index] #$game_party.members[@switcheur_window.index] $game_switches[5] = true #~ target_actor = $game_party.members[@switcheur_window.index] #~ while $game_party.members[0] != target_actor #~ $game_party.change_group_order #~ end #~ $game_player.animation_id = ID_ANIMATION #~ $game_player.refresh end $game_temp.switcheur_result = false @switcheur_window = nil else @switcheur_window.update end return end if Input.press?(SWITCHEUR_KEY) and $data_actors.size > 0 #$game_party.actors.size > 0 if SE_START != nil and SE_START != "" Audio.se_play("Audio/SE/" + SE_START, 80, 100) end @switcheur_window = Window_Switcheur.new end ring_system_update end
end
EDIT(1) : J'ai refait des modifs ça marche toujours pas (modif de la ligne 263)
EDIT(piaf) : piste 1 (merci TaZ) -> le jeu supporte pas que temporairement il n'y est aucun héro en jeu quand on switch hero_controlé <-> hero_bdd piste 2 -> le jeu ne trouve pas l'équipement du hero_bdd piste 3 -> le suicide collectif
Dernière édition par Electron le Lun 25 Juil 2011 - 11:48, édité 1 fois
Sihn
Voyageur Lv.10
Age : 36 Inscrit le : 24/04/2009 Messages : 407
Sujet: Re: Amélioration de scripts [Resolu] Dim 24 Juil 2011 - 18:35
Je ne suis pas sur de comprendre ce que tu cherches à faire... 1) Le switcheur doit afficher TOUS les héros dès le début du jeu? 2) Ton équipe (celle qui s'affiche dans le menu via Echap) doit contenir combien de héros? (toujours un seul? jusqu'à 4 héros? Tous?)
Electron
Poulet trizo Lv.3
Age : 34 Inscrit le : 18/07/2011 Messages : 44
Sujet: Re: Amélioration de scripts [Resolu] Dim 24 Juil 2011 - 20:39
Bonjour Sihn,
Pour l'instant je veux effectivement afficher tous les héros de la BDD, je contrôlerais avec un array représentant des interrupteurs InGame l'arrivé de certains personnages (actuellement je pense que c'est dans mes cordes de codeur rgss) Mon équipe (même si j'ai désactive le menu) ne doit comprendre qu'un personnage puisque sinon le train actor de l'ABS fera apparaître les quatre. Hors je ne veux vraiment qu'un personnage tout le long du jeu.
Pour essayer de comprendre je peux expliquer niveau "gameplay": Mon protagoniste va se retrouver plonger dans une histoire de manipulation où il va devoir utiliser différents talents pour réussir des plateaux. Il commencera avec des aspects Force (le chara en un peu plus grand) Saut (le chara avec des chaussures d'hermès) Resistance (le chara en armure) Ce qui influe sur l'apparence du héros mais aussi son équipement et ses stats. Petit à petit on pourra acheter, faire évoluer ou se voir attribuer de nouvelles apparences (Feu, Fantôme, ...) Le switcheur me permet de rendre cela graphiquement sympa et fluide pour ne pas perdre de temps dans un plateau.
Sihn
Voyageur Lv.10
Age : 36 Inscrit le : 24/04/2009 Messages : 407
Sujet: Re: Amélioration de scripts [Resolu] Dim 24 Juil 2011 - 21:52
Je crois que je vois un peu mieux... Je me disais, ne serait-ce pas plus pratique de juste désactiver le train actor de l'abs? Car là au final, tu dois bidouiller un peu partout et te priver de commandes d'événements qui te faciliterais bien la tache... (ajout/suppr de héros te permettrais de contrôler facilement les talents de ton perso, sans avoir à jongler avec les switchs et les scripts)
Le problème, c'est que l'ABS est basé sur le train actor. Impossible de juste désactiver le train actor, ça pose problème dès qu'il faut changer de personnage. Il crée des instances de joueurs selon l'équipe et les fait évoluer sur la map et on est obligé de passer par le train actor celui çi étant implanté directement dans l'ABS et n'étant pas une "option".
Ce serait trop lourd et trop chiant d'éditer tout cela étant donné que de base c'est codé n'importe comment.
Un script d'action-RPG basé sur... le train actor... oui, parfaitement logique... Bon bah du coup, je vais voir ce que je peux faire avec mon script... X)
Donc... Electron!
Citation :
je contrôlerais avec un array représentant des interrupteurs InGame l'arrivé de certains personnages (actuellement je pense que c'est dans mes cordes de codeur rgss)
Est-ce que ce système est déjà au point, et si oui, comment l'utilises-tu? (en gros, pour le moment, comment fais-tu pour savoir si tel ou tel héros apparait ou non, et via quel script/variables/switch?) Et sinon, est-ce que tu veux que je me charge d'inclure ce système dans le switcheur? (ça devrait pas être très compliqué je pense) (après ça normalement, j'ai plus de question)
Le système est pas encore en place j'ai juste penser à utiliser la plage 100 à 110 des variables. Comme j'aimerais apprendre petit à petit à scripter et que je pense que c'est dans mes capacités actuelles tu n'es pas obligé. Mais de ce que j'ai compris du script si je le met juste à la première boucle la vérification on ne devrait afficher et pouvoir utiliser que les héros en mode "true" dans l'array. J'ai pensé aussi à le faire en variable pour prendre moins de place, du style : 0110000110 > 1 étant true, 0 false. Mais comme j'ai pensé que d'autres voudrait peut être utiliser le script etc... Je préfère le rendre casual!
Si je demande ça, c'est pour savoir d'où le switcheur doit sortir la liste de héros. Pour ma part, je pensais plutôt à rajouter un tableau dans Game_Party, contenant la liste des talents utilisable (concrètement, la liste des héros sélectionnables).
Zangther m'avait parlé d'un deuxième Game_Party, j'ai orienté ça vers des switch puisque ça me semblait plus à mon niveau. Si c'est plus simple et plus propre en instanciant un nouveau Game_Party je suis pas fine bouche surtout l'aide proposé!
Plus précisément, je pensais qu'étant donné que l'ABS se basait sur $game_party. L'idée aurait été de gérer toute l'équipe dans une autre instance de Game_Party et de ne laisser que le leader ( le personnage actif ) dans l'équipe de base.
Un deuxième Game_Party? Arf, ça va être chiant pour les sauvegardes, ça. X)
Bon, j'ai un premier script à te faire tester... (tu verras pourquoi je dis premier)
Code:
#============================================================================= # Switcheur de héros #------------------------------------------------------------------- # Créé par Sihn, à partir du menu tournant de MakirouAru # Conçu pour RMVX # Basé sur la version 2.4 # Modifié pour Electron # http://rpg-maker-vx.bbactif.com/t4431-vx-switcheur-de-heros-changer-de-leader-en-cours-de-jeu #=============================================================================
# Touche d'activation (Changez uniquement le Y) SWITCHEUR_KEY = Input::Y
# Son lors de l'apparition du switcheur SE_START = "Decision2"
# Animation à jouer sur le héros si changement de celui-ci ID_ANIMATION = 41
# Durée en frame de l'apparition du switcheur TRANS_FRAMES = 15
# Durée en frame de la rotation entre deux héros du switcheur MOVING_FRAMES = 10
# Rayon en pixel RAYON = 64
# true : En forme d'élipse / false : En forme de cercle ELIPSE = true
# true : Appuyez sur le bouton / false : Maintenez le bouton AUTO_KEY = true
#============================================================================= # Game_Interpreter #------------------------------------------------------------------- # Permet d'appeler les fonctions des talents via des commandes "Insérer un script" sans # avoir à les préfixer de $game_party. #============================================================================= class Game_Interpreter def ajouter_talent(id) $game_party.ajouter_talent(id) end
def retirer_talent(id) $game_party.retirer_talent(id) end
def possede_talent?(id) $game_party.possede_talent?(id) end end
#============================================================================= # Game_Party #------------------------------------------------------------------- # Ajout de la gestion des talents #============================================================================= class Game_Party < Game_Unit MAX_MEMBERS = 1 attr_accessor :actors
alias initialize_talents initialize def initialize initialize_talents @talents = [] end
alias setup_starting_members_talents setup_starting_members def setup_starting_members setup_starting_members_talents for i in $data_system.party_members @talents.push(i) end end
def ajouter_talent(id) unless @talents.include?(id) and id.between?(1, $data_actors.size - 1) @talents.push(id) @talents.sort! end end
def retirer_talent(id) @talents.delete(id) end
def possede_talent?(id) return @talents.include?(id) end
def get_talents actors = [] for actor_id in @talents actors.push($game_actors[actor_id]) end return actors end end
#============================================================================= # Game_Temp #============================================================================= class Game_Temp attr_accessor :switcheur_result
alias initialize_switcheur_result initialize def initialize initialize_switcheur_result @switcheur_result = false end end
#============================================================================= # Window_Switcheur #============================================================================= class Window_Switcheur < Window_Base attr_accessor :index
def update super if @mode < 5 if Input.trigger?(Input::UP) or Input.trigger?(Input::LEFT) Sound.play_cursor ELIPSE ? setup_move_move(3) : setup_move_move(4) return elsif Input.trigger?(Input::DOWN) or Input.trigger?(Input::RIGHT) Sound.play_cursor ELIPSE ? setup_move_move(4) : setup_move_move(3) return elsif Input.trigger?(Input::B) and AUTO_KEY Sound.play_cancel $game_temp.switcheur_result = false setup_move_end return elsif AUTO_KEY if Input.trigger?(Input::C) or Input.trigger?(SWITCHEUR_KEY) Sound.play_decision $game_temp.switcheur_result = true setup_move_end return end else unless Input.press?(SWITCHEUR_KEY) Sound.play_decision $game_temp.switcheur_result = true setup_move_end return end end end refresh end
def refresh self.contents.clear case @mode when 1 refresh_start when 2 refresh_wait when 3 refresh_move(1) when 4 refresh_move(0) when 5 refresh_end end if @mode != 6 cy = ELIPSE ? 32 : 0 rect = Rect.new(@cx - 272, @cy + cy, self.contents.width - 32, 32) self.contents.draw_text(rect, @commands[@index], 1) else dispose end end
def refresh_start d1 = 2.0 * Math::PI / @item_max d2 = 1.0 * Math::PI / TRANS_FRAMES r = RAYON - 1.0 * RAYON * @steps / TRANS_FRAMES for i in 0...@item_max j = i - @index d = d1 * j + d2 * @steps x = @cx + (r * Math.sin(d)).to_i y = @cy - ((r * Math.cos(d)).to_i / elipse) draw_item(x, y, i) end @steps -= 1 if @steps < 1 @mode = 2 end end
def refresh_wait d = 2.0 * Math::PI / @item_max for i in 0...@item_max j = i - @index x = @cx + (RAYON * Math.sin(d * j)).to_i y = @cy - ((RAYON * Math.cos(d * j)).to_i / elipse) draw_item(x, y, i) end end
def refresh_move(mode) d1 = 2.0 * Math::PI / @item_max d2 = d1 / MOVING_FRAMES d2 *= -1 if mode != 0 for i in 0...@item_max j = i - @index d = d1 * j + d2 * @steps x = @cx + (RAYON * Math.sin(d)).to_i y = @cy - ((RAYON * Math.cos(d)).to_i / elipse) draw_item(x, y, i) end @steps -= 1 if @steps < 1 @mode = 2 end end
def refresh_end d1 = 2.0 * Math::PI / @item_max d2 = 1.0 * Math::PI / TRANS_FRAMES r = RAYON - 1.0 * RAYON * @steps / TRANS_FRAMES for i in 0...@item_max j = i - @index d = d1 * j + d2 * @steps x = @cx + (r * Math.sin(d)).to_i y = @cy - ((r * Math.cos(d)).to_i / elipse) draw_item(x, y, i) end @steps += 1 if @steps > TRANS_FRAMES @mode = 6 end end
def draw_item(x, y, i) item = @items[i] actor = $game_party.get_talents[i] if actor.character_name.include?("$") rect = Rect.new(item.width / 3, 0, item.width / 3, item.height / 4) opa = @index == i ? 255 : 128 self.contents.blt(x - item.width / 3, y - item.height / 4, item, rect, opa) else index = actor.character_index rect = Rect.new((item.width / 4) * (index % 4) + (item.width / 12), (item.height / 2) * (index / 4 % 2), item.width / 12, item.height / 8) opa = @index == i ? 255 : 128 self.contents.blt(x - item.width / 12, y - item.height / 8, item, rect, opa) end end
def setup_move_start @mode = 1 @steps = TRANS_FRAMES end
def setup_move_move(mode) return if $game_party.get_talents.size < 2 if mode == 3 @index -= 1 @index = @items.size - 1 if @index < 0 elsif mode == 4 @index += 1 @index = 0 if @index >= @items.size else return end @mode = mode @steps = MOVING_FRAMES end
def setup_move_end @mode = 5 @steps = 0 end
def elipse return ELIPSE ? -2 : 1 end end
#============================================================================= # Scene_Map #============================================================================= class Scene_Map < Scene_Base alias ring_system_update update def update if @switcheur_window != nil if @switcheur_window.disposed? if $game_temp.switcheur_result $game_party.actors[0] = $game_party.get_talents[@switcheur_window.index].id $game_player.animation_id = ID_ANIMATION $game_player.refresh end $game_temp.switcheur_result = false @switcheur_window = nil else @switcheur_window.update end return end if Input.trigger?(SWITCHEUR_KEY) if $game_party.get_talents.size > 1 if SE_START != nil and SE_START != "" Audio.se_play("Audio/SE/" + SE_START, 80, 100) end @switcheur_window = Window_Switcheur.new else Sound.play_buzzer end end ring_system_update end end
Tiens, essayes donc ce script. :3 Pour rajouter/supprimer des talents, utilises :
Par contre je te préviens, ce script réduit le maximum de héros contenu dans l'équipe à... 1. Tu peux avoir autant de talent que tu le veux, mais le héros ne peux plus avoir de coéquipier. Est-ce que ça pose problème pour ton jeu? (j'ai cru comprendre que tu ne contrôlerais qu'un seul perso, mais je préfère être sur)
Un détail à rajouter, que Blocky m'avait signalé, si d'autres veulent utiliser c'est que la table des héros va de 1 à x héros (et non pas de 0 à x-1 comme la "logique" le voudrait)
Pour ce qui est de l'arrivé des pouvoirs elle est encore mieux que si j'avais géré par variables, donc c'est parfait!
Le talent importe bien les équipements et les talents des différents héros. C'est donc exactement ce que je souhaitais.
Je te remercie d'avoir pris de ton temps pour réaliser ce script, et je remercie aussi Zangther et Blockade de m'avoir aidé à comprendre rgss pour que j'essaye de le réaliser (ça viendra ^^)