Domaine concerné: Script
Logiciel utilisé: Rpg Maker XP
CE POST A ÉTAIT DÉPLACE DE LA SECTION QUESTION IDIOTES SUR LES SCRIPT, CAR IL DEVENAIT UN PEU TROP GROS A MON GOUT.
Bonjour (ou bonsoir) à tous !
Je viens vers vous avec deux petites questions que je n'arrive pas à résoudre par moi même.
Question 1 :
Après avoir modifié la fonction "se défendre", cette dernière permet maintenant la sélection d'un ennemis. Elle fonctionne comme la fonction "attaquer", cependant, lorsque j'appuie sur Echap lors de la sélection de ennemi, le curseur s'en va mais le retour sur la sélection d'une action ne se fait pas, forçant ainsi un CTRL ALT SUPP.
Ma question est donc la suivante, quel ligne de script permet le retour arrière en combat, et où se trouve-t-elle?
Question 2 :
Après avoir mis au point un événement commun qui permet de récupérer les MP excédentaires lors d'un changement de statut entrainant une modification de MP Max (plus d'infos ici http://www.rpg-maker.fr/index.php?page=forum&id=25502), je me heurte au problème suivant:
L'événement ne fonctionne qu'une fois l'inventaire fermé, il faut ensuite le ré-ouvrir pour réattribuer des MP via des objets +1 MP. Je cherche à outre passer cette condition en modifiant le script d'inventaire de façon à ouvrir et fermer l'inventaire après avoir équipé un bouclier (Item concerné par ma récupération de MP).
Je pense que le bout de script nécessaire est celui-ci:
1
2
3
|
$scene = Scene_Map.new
$scene = Scene_Equip.new (1) |
Cependant, après plusieurs essaie je n'ai toujours pas réussi à faire ce que je souhaite.
Une idée?
Merci d'avance comme toujours.
EDIT:
Après de nouvelles recherches, je pense que ceci:
1
2
3
4
5
6
7
8
9
10
11
12
| # * Frame Update (when right window is active)
#--------------------------------------------------------------------------
def update_right
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Switch to menu screen
$scene = Scene_Menu.new(2)
return
end |
Serait un bout de réponse à ma question 2.
J'ai donc essayé de faire ceci:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # * Frame Update (when right window is active)
#--------------------------------------------------------------------------
def update_right
# If B button was pressed
if Input.trigger?(Input::B)
# Play cancel SE
$game_system.se_play($data_system.cancel_se)
# Switch to menu screen
# Tentative pour faire apparaitre la map brièvement, pour que l'événement commun se déclenche:
$scene = Scene_Map.new
$scene = Scene_Menu.new(2)
return
end |
Mais sans résultats.
Pourtant si je ne dis pas de bêtise (bon ok j'en dis pas mal), cette commande doit faire un truc du genre:
Si appuyer sur Echap, retourner au menu précédent (donc menu curseur positionné sur équipement).
Je ne comprend donc pas pourquoi en le modifiant, cela ne fonctionne pas.
Un indice?
EDIT:
Bon j'avance à grands pas, (concernant ma question 2).
Modifier ceci:
1
2
3
4
5
6
| def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Menu.new(2)
return |
Est bien la solution, cependant, il m'a fallu le faire dans un script ajouté qui concerne l'inventaire (le dernier script définissant un système est celui qui prévaut, me coucherai moins bête).
Du coup, ceci fonctionne à merveille:
1
2
3
4
5
6
| def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return |
Mais ceci pas du tout:
1
2
3
4
5
6
7
8
9
|
def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
$scene = Scene_Menu.new(2)
return
|
Faut-il donc que je mette une sorte "d'attendre" entre l'appel des deux scènes pour que mon événement commun se déclenche, ou (nouvelle idée qui m'est venue) puis-je appeler directement mon événement commun via le script?
Du style:
1
2
3
4
5
6
7
8
9
10
|
def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
ATTENDRE le temps que mon événement commun se déclenche
$scene = Scene_Menu.new(2)
return
|
ou
1
2
3
4
5
6
7
8
9
|
def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
APPEL DE MON EVEN. COMMUN
$scene = Scene_Menu.new(2)
return
|
Merci d'avance, encore une fois.
Edit:
Pour le "attendre" j'ai trouvé dans un vieux post cette forumule:
1
2
3
4
|
($latence_en_sec * Graphics.frame_rate).times{
# ce que tu veux rafraichir
} |
Cependant, j'ai du mal à le mettre en œuvre.
J'ai tenté cela:
1
2
3
4
5
6
7
8
9
10
11
| def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
ATTENDRE le temps que mon événement commun se déclenche
$scene = Scene_Menu.new(2)
(3000 * Graphics.frame_rate).times{
$scene = Scene_Menu.new(2)
}
return |
Ça ne renvoi aucune erreur, mais ça ne fonctionne pas non plus.
EDIT DE RESOLUTION DE LA QUESTION 2 !
J'ai trouvé la solution !
L'absence d'aide m'a rendu plus malin et m'a appris des choses *_*
En gros vous m'avez tous aidez sans m'aider ! MERCI
Bref, la solution à ma question 2 et celle-ci:
Dans le script de modification du script de base de l'équipement (au dessus du Main).
J'ai modifier ceci:
1
2
3
4
5
6
7
|
def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Menu.new(2)
return |
Ligne qui est la même que celle dans le script de base Scene_Equip.
Par ceci:
1
2
3
4
5
6
7
|
def update_right
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return
|
Ça a pour effet de me renvoyer à la map de jeu, où mon événement commun peut fonctionner, puis il m'a suffit de modifier mon événément commun comme suit:
<> Script: $scene = Scene_Menu.new(2)
Pour que mon inventaire se ré-ouvre (avec le curseur sur "Équipements" comme lors d'un échap normal depuis le menu d’équipement), avec les changement effectués
C'est peu esthétique car on voit la map apparaitre puis disparaitre 1 seconde, mais au moins ça fonctionne
EDIT DE RESOLUTION DE LA QUESTION 2 !
Fort de ma résolution de ma question 2, j'ai eu un éclair de génie et est résolu ma question 1.
Voici comment j'ai fais:
Dans Scene_Battle 3, j'ai modifier ma fonction "se défendre" en "attaque à distance" pour pouvoir frapper avec une arme à distance en passant par l'équipement d'armure de type bouclier, en me servant de la valeur de la défense magique.
Du coup mon code actuel ressemble à ceci:
1
2
3
4
5
6
7
8
| when 2 # attaquer a distance //////////////////////////////////////////////////////
# Play decision SE
$game_system.se_play($data_system.decision_se)
# Set action
@active_battler.current_action.kind = 0
@active_battler.current_action.basic = 1
# Go to command input for next actor
start_enemy_select |
Dans Scene_Battle 3 toujours, j'ai donc modifier ceci:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #--------------------------------------------------------------------------
# * End Enemy Selection
#--------------------------------------------------------------------------
def end_enemy_select
# Dispose of enemy arrow
@enemy_arrow.dispose
@enemy_arrow = nil
# If command is [fight]
if @actor_command_window.index == 0
# Enable actor command window
@actor_command_window.active = true
@actor_command_window.visible = true
# Hide help window
@help_window.visible = false
end
end
|
En ceci:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #--------------------------------------------------------------------------
# * End Enemy Selection
#--------------------------------------------------------------------------
def end_enemy_select
# Dispose of enemy arrow
@enemy_arrow.dispose
@enemy_arrow = nil
# If command is [fight]
if @actor_command_window.index == 0 or 2 # <===== or 2 qui règle le problème
# Enable actor command window
@actor_command_window.active = true
@actor_command_window.visible = true
# Hide help window
@help_window.visible = false
end
end |
En espérant que mes aventures puissent servir à quelqu'un un jour
|