Aller à la page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
Reprise du message précédent:
Suite du sujet:
Husk -
posté le 26/07/2013 à 18:08:22 (1022 messages postés)
- | | Merci mais ... C'est pour VX tout ça, je demander justement la même choses, mais pour XP.
Edit: Ah d'accord Grim, j'avais pas vu, c'est le même que celui que j'ai posté, mais pour XP. Autant pour moi.
Merci
|
Itch.io | Don't click on the potato! |
Orbital -
posté le 06/08/2013 à 02:29:11 (194 messages postés)
| | Support : RM VX Ace
Bonsoir ! Alors voilà, en ce moment je paramètre un système ATB et j'aime bien bidouiller moi-même les formules pour avoir ce que je veux. Surtout que là le calcul fait de base est un peu à chier.
A un moment on met dans une méthode une certaine valeur :
1
2
3
| def total_agi
SceneManager.scene.all_battle_members.inject(0.0) {|r, obj| r += obj.agi }
end |
Le nom de la méthode m'a bien aidé pour comprendre qu'ici on faisait la somme de l'agi des perso et des monstres.
Question 1 :
Je voudrais en fait récupérer la valeur de la plus haute agilité parmi les persos et les monstres. Seulement je ne sais pas comment faire un [Value1, Value2].max où on peut choper toutes les valeurs d'agilité.
Si quelqu'un sait comment faire je prends. Mon problème étant que le nombre d'arguments peut varier. Est-ce qu'on peut créer un tableau par exemple où on prend la valeur de l'agi de chaque combattant puis traiter ces valeurs et les mettre dans le [].max ?
Question 2 :
Si pour la question 1 c'est chaud (je continuerai dans mon petit coin à chercher... j'y connais rien en script mais j'aime bien bidouiller), je voulais savoir si mettre :
1
| SceneManager.scene.all_battle_members.inject(0.0) {|r, obj| r += obj.agi } / SceneManager.scene.all_battle_members.size |
est suffisant pour prendre l'agilité moyenne des battlers.
Woilou, merci d'avance. ^^
PS : Si on peut m'expliquer la méthode inject je veux bien. J'ai à peu près compris que obj ici correspond à l'objet actuellement manipulé : all_battle_members. obj.agi correspond à l'agilité de ces objets et on l'incrémente pour chaque objet dans une variable r. C'est tout ? La variable on peut mettre n'importe quoi (elle est interne à la méthode ? à l'inject ?) ? Genre un peu comme les variables locales en C++ ?
Si c'est ça ok, je vois, mais je comprends pas la syntaxe que je trouve assez tordue...
|
Final Fantasy Fury |
Estheone -
posté le 06/08/2013 à 20:40:38 (312 messages postés)
| | Réponse 1 :
1
2
3
| SceneManager.scene.all_battle_members.inject do |r, obj|
r > obj.agi ? r : obj.agi
end |
ou si tu préfères :
1
2
3
4
5
| r = 0
SceneManager.scene.all_battle_members.each do |obj|
r = obj.agi if r < obj.agi
end
return r |
Réponse 2 :
Oui je crois que c'est bon.
Je saisis pas trop les subtilités de inject, je connaissais pas. Je crois que c'est juste pour appliquer une opération redondante à partir des éléments d'un bloc.
T'as plus d'infos ici :
http://ruby-doc.org/core-2.0/Enumerable.html#method-i-inject
|
Wandering Souls : Jeu complet / Topic sur Oniro |
Orbital -
posté le 07/08/2013 à 00:17:23 (194 messages postés)
| | D'acc, merci beaucoup !
Juste par curiosité, est-ce que ça aussi ça marcherait :
1
2
3
4
| SceneManager.scene.all_battle_members.inject do |r, obj|
r = [r, obj.agi].max
end
return r |
ou :
1
2
3
4
5
| r = 0
SceneManager.scene.all_battle_members.each do |obj|
r = [r, obj.agi].max
end
return r |
?
Merci pour le lien de la méthode inject. ^^ C'est en effet comme tu le dis, ça prend un groupe de valeur et on fait une opération dessus grâce à 2 variables en gros. D'ailleurs pourquoi on n'utilise pas r.agi après le |r, obj| ?
Grâce à ton lien je me demande si on peut faire ça du coup :
1
2
3
| SceneManager.scene.all_battle_member.agi.max do |a, b|
a <=> b
end |
Dernière petite question : je n'arrive pas à trouver dans les script de base comment est gérer le hit et le eva. Par exemple un monstre à 100% d'eva mais notre perso à 100% en hit, il se passe quoi ? Même sans forcément avoir 100% des 2 côtés, que se passe-t-il avec 80% des 2 côtés ? Et si l'un à 80% (voir 90 ou même 99) mais que l'autre à plus de 100%, il y a forcément une esquive/attaque réussie ?
|
Final Fantasy Fury |
Estheone -
posté le 07/08/2013 à 14:37:48 (312 messages postés)
| | Ta syntaxe pour each est bonne mais pour inject c'est tout simplement :
1
2
3
| SceneManager.scene.all_battle_members.inject do |r, obj|
[r, obj.agi].max
end |
Bon par contre tu crées un tableau pour chaque élément du bloc donc c'est pas top niveau performance.
1
2
3
| SceneManager.scene.all_battle_member.agi.max do |a, b|
a <=> b
end |
Non ça c'est n'importe quoi.
Mais tu sais tu peux tester ce genre de trucs toi-même.
Genre en rajoutant des lignes dans le main au-dessus de la ligne rgss_main.
En faisant ça par exemple,
1
2
3
4
5
| array = [2, 3, 5, 4]
l = array.inject do |r, i|
[r, i].max
end
p l |
j'ai pu vérifier que la syntaxe marchait sans être obligé de tester à partir de SceneManager.scene.all_battle_members.
Pour les effets d'eva et hit c'est dans la méthode item_apply de Game_Battler.
En gros ça fait 2 randoms, un pour vérifier si ça touche en tenant compte de hit uniquement, l'autre pour vérifier si c'est esquivé en tenant compte de l'eva de l'ennemi uniquement. Si les 2 randoms sont bons ça touche, si ça foire un des deux le coup est raté.
Si tu veux obtenir le pourcentage réel de réussite il suffit de multiplier la probabilité de toucher avec (1 - la probabilité d'esquiver).
80% hit, 20% eva => 0.8*(1-0.2) = 0.64 soit 64% de chance de réussite.
|
Wandering Souls : Jeu complet / Topic sur Oniro |
arttroy -
posté le 07/08/2013 à 15:04:54 (2394 messages postés)
| Just working | Non mais M.... à la fin il est pas humain ce mec...
|
Anti-inconstructivité / Pétition pour que le mot making soit inscrit dans le dictionnaire ? |
Orbital -
posté le 07/08/2013 à 15:14:22 (194 messages postés)
| | Waw, d'acc. Bah merci pour toutes ces explications. J'y vois beaucoup plus clair.
Sinon je viens de passer sur les scripts de base en anglais... c’est beaucoup plus simple à comprendre grâce au commentaire. Jusqu'à maintenant je me farcissais du japonais. Bon par contre il me semble que j'ai modifié quelques scripts de base donc je peux rien remplacer dans mon projet. ><
Bon au moins je sais où chercher pour les battle mechanics.
|
Final Fantasy Fury |
Åvygeil -
posté le 07/08/2013 à 18:18:58 (2502 messages postés)
| | Citation: Non mais M.... à la fin il est pas humain ce mec...XD |
Calme toi arttroy... c'est que du Ruby...
Sinon pour la réponse 1 :
1
2
3
4
5
|
max_agi = SceneManager.scene.all_battle_members.map {
|battler| battler.agi
}.max
|
devrait marcher aussi...
Citation: Sinon je viens de passer sur les scripts de base en anglais... c’est beaucoup plus simple à comprendre grâce au commentaire. Jusqu'à maintenant je me farcissais du japonais. Bon par contre il me semble que j'ai modifié quelques scripts de base donc je peux rien remplacer dans mon projet. >< |
Tu peux utiliser des outils comme TkDiff pour savoir ce que tu as modifié et fusionner les modifications.
|
arttroy -
posté le 07/08/2013 à 20:12:45 (2394 messages postés)
| Just working | Citation:
Calme toi arttroy... c'est que du Ruby... |
Ah te revoilà toi t'as pas compris la dernière fois... Naaan je déconne !!
Ben pour moi qui suis néophyte+ en la matière, ça me fait quand même halluciner de voir avec quelle facilité il arrive à sortir tout ça. Enfin je devrais dire vous parce que tu es un peu dans le même cas que lui...
C'est vrai que pour vous qui avez l'habitude de la programmation ça doit être facile et anodin.
Bon courage pour votre jeu avec ta chère et tendre (à moins que j'ai encore compris un truc de travers...), je suis vraiment curieux de voir ce que ça va donner.
|
Anti-inconstructivité / Pétition pour que le mot making soit inscrit dans le dictionnaire ? |
AlterEgo -
posté le 07/08/2013 à 23:41:14 (2481 messages postés)
| It shall be engraved upon your soul | Citation: Bon courage pour votre jeu avec ta chère et tendre |
Golem fail.
|
Et le pharaon noir est le premier roi de l’Atlantide pour la gloire de rien comprendre |
Orbital -
posté le 08/08/2013 à 00:04:19 (194 messages postés)
| | Merci beaucoup pour le nom de l'outils, j'vais le prendre de ce pas !
Tiens c'est marrant, avec :
1
| SceneManager.scene.all_battle_members.inject(0.0) do |r, obj| r > obj.agi ? r : obj.agi end |
si des battler ont une agilité trop faible et bien la jauge ATB se bloque.
Je viens de le voir en rajoutant un voleur à mon équipe pour faire un nouveau test.
En prenant en compte à chaque fois la même configuration de combat,
avec cette ligne de commande total_agi devrait me renvoyer 420,
avec la ligne de commande de base (somme de toutes les agi) ça me retourne 1330,
avec la ligne de commande qui fait la moyenne des agi (sum agi battler / nombre battler) ça me retourne 190.
A la limite ça aurait été une valeur trop petite ou trop grande c'est qu'il y aurait eu une valeur dépassée/pas atteinte mais là c'est pile entre 2 valeurs où les jauges se remplissent bien.
Je me demande donc si
1
| SceneManager.scene.all_battle_members.inject(0.0) do |r, obj| r > obj.agi ? r : obj.agi end |
fait bien ce qu'on lui demande. ^^ Ou alors qu'est-ce qui fait que ça plante ?
En revanche même avec cette ligne qui bloque l'ATB pour de faibles agi je peux les débloquer en changeant l'update des jauges.
1
2
3
| def update_atb
80 * (agi + 45) * speed_modifier / total_agi
end |
Pour celà je rajoute atk_speed à agi (ce qui a pour effet de prendre en compte la correction de vitesse d'attaque que l'on peut rajouter aux classes ou à l'équipement).
Je comprends absolument pas comment c'est possible.
|
Final Fantasy Fury |
Estheone -
posté le 08/08/2013 à 04:18:43 (312 messages postés)
| | Je suppose que le résultat de update_atb est inférieur à 1, et donc tronqué à 0, d'où une jauge qui avance pas. La différence entre l'agi de ton perso et l'agi la plus élevée doit être trop importante.
Essaie comme ça pour voir :
1
2
3
| def update_atb
[80 * (agi + 45) * speed_modifier / total_agi, 1].max
end |
Et tant que tu y es remplace le paramètre de inject (0.0) par (1). Dans le cas improbable où il n'y aurait pas de battler, total_agi va prendre cette valeur.
Tu ne tiens pas à détruire l'univers avec une division par 0, pas vrai ?
|
Wandering Souls : Jeu complet / Topic sur Oniro |
arttroy -
posté le 08/08/2013 à 11:53:41 (2394 messages postés)
| Just working | Citation:
Et M.... je savais que je disais une connerie... Désolé si j'ai offensé quiconque... Faut que je côtoie plus les fous d'Oniro...
|
Anti-inconstructivité / Pétition pour que le mot making soit inscrit dans le dictionnaire ? |
Orbital -
posté le 08/08/2013 à 14:27:38 (194 messages postés)
| | C'est en effet un problème sur update_atb qui devait être inférieur à 1.
Le truc qui m'étonne c'est qu'à aucun moment cette méthode peut prendre cette valeur. x)
L'agi mini de mon jeu sera 10 (pour les plus faibles monstres).
Donc normalement, même avec une agi à 450 pour mon persos le plus rapide et l'état somni sur le monstre (speed_modifier=0.5) je devrais avoir : 4~5
Et avec le total_agi de base j'ai des valeurs encore plus petite que ça.
Pour en revenir au déblocage grâce au max avec 1, je me demande pourquoi il y a une telle différence entre une agi de 423 et une de 350, c'est pas normal. Ah aussi, je me suis pété le cul à faire des tests pour voir un truc intéressant. A partir d'une agi de 380, l'atb du battler ne se bloque plus (comparé à l'agi max du combat : 423). Mais si je passe à 379, là ça bloque complètement. Et puis pour ceux qui ont leur jauge qui avance, elles avancent toutes au même rythme.
Par contre si je mets bien agi+atk_speed au lieu de seulement agi, là tout marche et ça va à la bonne vitesse (même avec le max par rapport à 1).
Tu me diras "bah fait ça alors", sauf que ça m'énerve de pas comprendre. x)
|
Final Fantasy Fury |
Estheone -
posté le 08/08/2013 à 15:09:44 (312 messages postés)
| | Je comprends pas non plus. ><
Utilise des print et la console de debug pour essayer de trouver le problème (genre quelle est la valeur de update_atb quand ça bloque), tu auras plus de chance de le résoudre qu'en travaillant à l'aveugle.
Au pire envoie-moi ton projet en mp, je peux pas t'aider plus sans tester.
|
Wandering Souls : Jeu complet / Topic sur Oniro |
Orbital -
posté le 08/08/2013 à 15:17:02 (194 messages postés)
| | Estheone a dit: Utilise des print et la console de debug pour essayer de trouver le problème (genre quelle est la valeur de update_atb quand ça bloque), tu auras plus de chance de le résoudre qu'en travaillant à l'aveugle. |
Ouaip j'vais essayer ça.
Edit :
Alors, déjà je me place dans le cas où je ne fais pas le max par rapport à 1 pour mieux me rendre compte. Le total_agi me renvoie bien l'agilité max mais sous forme d'int, alors que le total_agi de base me renvoie un float.
Ensuite, avec agi + atk_speed j'ai ça pour l'update_atb de mes battlers :
20.047.....(perso 1)
21.607.....(perso 2)
14.420.....(perso 3)
22.127.....(perso 4)
2.364..... (monstre 1)
2.364..... (monstre 2)
2.364..... (monstre 3)
Et avec agi seulement :
20
20
0
20
0
0
0
Donc avec agi seulement, si je suis supérieur à 20 il me met 20, si je suis inférieur il me retourne 0... wtf.
On peut modifier le float d'une variable (agi et/ou total_agi) ? 'fin je vois pas ce que ça changerai... D'un autre côté en faisant speed = agi + atk_speed et avec un print de ces 3 variables j'ai ça par exemple :
380
-1.0
379
423.0
0.0
423.0
Il considère agi comme un int et atk_speed (et donc par extension speed) comme un float.
EDIT 2 :
Je crois que j'ai trouvé ! C'est bien parce que total_agi est un int quand on prend le max des agi. On se sert ensuite de ces valeurs dans une méthode qui, avec le total_agi de base (un float), retourne une valeur inférieur à 1. Seulement avec mon total_agi modifié, en me renvoyer un int, dans l'autre méthode il me sort également un int, du coup il arrondi tout et ça me ramène des valeurs à 0 !
|
Final Fantasy Fury |
Estheone -
posté le 08/08/2013 à 15:57:58 (312 messages postés)
| | Force l'agi en float, je vois que ça (mets agi.to_f au lieu de agi).
Edit : ok tant mieux alors. ^^
|
Wandering Souls : Jeu complet / Topic sur Oniro |
Orbital -
posté le 08/08/2013 à 16:02:52 (194 messages postés)
| | Merci pour la syntaxe, j'ai mis ça sur le total_agi et ça marche !
J'te ferais bien un bisou tiens.
|
Final Fantasy Fury |
Slime55 -
posté le 09/08/2013 à 17:20:11 (442 messages postés)
| | Support : RMXP
Question 1 :
Bonjour, j'utilise ce script pour le combat vue de côté
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
| #==============================================================================
#++?????????(?????????)ver. 1.14++
#Script by ???
#http://rpg.para.s3p.net/
#------------------------------------------------------------------------------
# ????????????????????????
#==============================================================================
module SDVA
X_LINE = 450 # ????????????
Y_LINE = 280 # ????????????
X_SPACE = 75 # ?????????????
Y_SPACE = 100 # ?????????????
X_POSITION = 35 # ??[????????]????
Y_POSITION = -10 # ??[????????]????
ATTACK_MOVE = true # ???????????( true / false )
SKILL_MOVE = true # ??????????????( true / false )
ITEM_MOVE = false # ???????????????( true / false )
MOVE_STEP = 1 # ????
MOVE_PIXEL = 10 # ???????????
PARTY_POS = 1 # ?????????( 0:? / 1:? / 2:? / 3:? )
WINDOWPOS_CHANGE = true # ??????????????????????( true / false )
end
#==============================================================================
# ? Game_Actor
#==============================================================================
class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ? ????? X ?????
#--------------------------------------------------------------------------
def screen_x
if self.index != nil
# ?????
pos = $data_classes[self.class_id].position
x_pos = pos * SDVA::X_POSITION
scr_x = self.index * SDVA::X_SPACE + SDVA::X_LINE + x_pos
# ??????????
if self.current_action.move_action == true
# ????
scr_x += @shift_x
end
return scr_x
else
return 0
end
end
#--------------------------------------------------------------------------
# ? ????? Y ?????
#--------------------------------------------------------------------------
def screen_y
if self.index != nil
# ?????
pos = $data_classes[self.class_id].position
y_pos = pos * SDVA::Y_POSITION
scr_y = self.index * SDVA::Y_SPACE + SDVA::Y_LINE + y_pos
# ??????????
if self.current_action.move_action == true
# ????
scr_y += @shift_y
end
return scr_y
else
return 0
end
end
#--------------------------------------------------------------------------
# ? ????? Z ?????
#--------------------------------------------------------------------------
def screen_z
if self.index != nil
return self.index
else
return 0
end
end
end
#==============================================================================
# ? Game_Battler (???? 1)
#==============================================================================
class Game_Battler
#--------------------------------------------------------------------------
# ? ??????????
#--------------------------------------------------------------------------
attr_reader :pattern # ??????
attr_reader :trans_x # X???????
attr_reader :moving # ??????
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
alias initialize_sdva initialize
def initialize
initialize_sdva
move_reset
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def move
@moving = 1
if @step < SDVA::MOVE_STEP
# ??????????
@pattern = (@pattern + 1) % 4
@step += 1
move_step
else
# ????
@pattern = 1
@moving = 2
end
end
#--------------------------------------------------------------------------
# ? ????
#--------------------------------------------------------------------------
def move_step
# ???????????????????
case SDVA::PARTY_POS
when 0
@shift_y = @step * SDVA::MOVE_PIXEL
when 1
@shift_x = -(@step * SDVA::MOVE_PIXEL)
when 2
@shift_x = @step * SDVA::MOVE_PIXEL
when 3
@shift_y = -(@step * SDVA::MOVE_PIXEL)
end
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
def move_reset
@moving = 0
@pattern = 0
@step = 0
@shift_x = 0
@shift_y = 0
end
end
#==============================================================================
# ? Game_BattleAction
#==============================================================================
class Game_BattleAction
#--------------------------------------------------------------------------
# ? ??????????
#--------------------------------------------------------------------------
attr_accessor :move_action # ??????????
#--------------------------------------------------------------------------
# ? ???
#--------------------------------------------------------------------------
alias clear_sdva clear
def clear
clear_sdva
@move_action = false
end
end
#==============================================================================
# ? Sprite_Battler
#==============================================================================
class Sprite_Battler < RPG::Sprite
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
alias update_sdva update
def update
# ????????????????
if @battler.is_a?(Game_Actor)
# ????????????????????
# ??????
if @battler.battler_name != @battler_name or
@battler.battler_hue != @battler_hue or
@battler.current_action.basic == 0 or
@battler.current_action.kind != 3
# ????????????
@character_name = @battler.character_name
@character_hue = @battler.character_hue
# ???????????
#self.bitmap = RPG::Cache.character(@character_name, @character_hue)
#cw = self.bitmap.width
#ch = self.bitmap.height
#@width = cw
#@height = ch
if @battler.current_action.move_action == true
# ????
@battler.move
else
@battler.move_reset
end
# ?????????
#sx = @battler.pattern * cw
#sy = SDVA::PARTY_POS * ch
#self.src_rect.set(sx, sy, cw, ch)
#self.ox = @width / 2
#self.oy = @height
# ??????????? 0 ???
if @battler.hidden
self.opacity = 0
end
end
end
update_sdva
end
end
#==============================================================================
# ? Scene_Battle
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ? ????????????????????
#--------------------------------------------------------------------------
alias phase3_setup_command_window_sdva phase3_setup_command_window
def phase3_setup_command_window
phase3_setup_command_window_sdva
if SDVA::WINDOWPOS_CHANGE
# ???????????????????
case SDVA::PARTY_POS
when 0
x_pos = @active_battler.screen_x - (@actor_command_window.width/2)
y_pos = @active_battler.screen_y
when 1
x_pos = @active_battler.screen_x - @actor_command_window.width - 16
y_pos = @active_battler.screen_y - @actor_command_window.height
when 2
x_pos = @active_battler.screen_x + 16
y_pos = @active_battler.screen_y - @actor_command_window.height
when 3
x_pos = @active_battler.screen_x - (@actor_command_window.width/2)
y_pos = @active_battler.screen_y - @actor_command_window.height - 48
end
@actor_command_window.x = x_pos >= 0 ? x_pos : 0
@actor_command_window.x = x_pos+@actor_command_window.width <= 640 ? x_pos : 640-@actor_command_window.width
@actor_command_window.y = y_pos >= 0 ? y_pos : 0
@actor_command_window.y = y_pos+@actor_command_window.height <= 480 ? y_pos : 480-@actor_command_window.height
# ??????????????????
@actor_command_window.z = 9999
end
end
#--------------------------------------------------------------------------
# ? ?????? (??????? ???? 3 : ??????????)
#--------------------------------------------------------------------------
alias update_phase4_step3_sdva update_phase4_step3
def update_phase4_step3
if SDVA::ATTACK_MOVE
if @active_battler.current_action.basic == 0
@active_battler.current_action.move_action = true
end
end
if SDVA::SKILL_MOVE
if @active_battler.current_action.kind == 1
@active_battler.current_action.move_action = true
end
end
if SDVA::ITEM_MOVE
if @active_battler.current_action.kind == 2
@active_battler.current_action.move_action = true
end
end
# ??????????????????????
if @active_battler.is_a?(Game_Actor) and
@active_battler.current_action.move_action
# ?????
if @active_battler.moving == 2
update_phase4_step3_sdva
end
elsif @active_battler.moving == 0
update_phase4_step3_sdva
end
end
#--------------------------------------------------------------------------
# ? ?????? (??????? ???? 6 : ??????)
#--------------------------------------------------------------------------
alias update_phase4_step6_sdva update_phase4_step6
def update_phase4_step6
@active_battler.current_action.move_action = false
@active_battler.move_reset
update_phase4_step6_sdva
end
end
#==============================================================================
# ? Spriteset_Battle
#==============================================================================
class Spriteset_Battle
#--------------------------------------------------------------------------
# ? ?????????
#--------------------------------------------------------------------------
alias initialize_sdva initialize
def initialize
initialize_sdva
@viewport2.z = 1
end
end
#==============================================================================
# ? Arrow_Actor
#==============================================================================
class Arrow_Actor < Arrow_Base
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
alias update_sdva update
def update
update_sdva
# ?????
if Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
@index += 1
@index %= $game_party.actors.size
end
# ?????
if Input.repeat?(Input::UP)
$game_system.se_play($data_system.cursor_se)
@index += $game_party.actors.size - 1
@index %= $game_party.actors.size
end
end
end
#==============================================================================
# ? Arrow_Enemy
#==============================================================================
class Arrow_Enemy < Arrow_Base
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
alias update_sdva update
def update
update_sdva
# ?????
if Input.repeat?(Input::DOWN)
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
# ?????
if Input.repeat?(Input::UP)
$game_system.se_play($data_system.cursor_se)
$game_troop.enemies.size.times do
@index += $game_troop.enemies.size - 1
@index %= $game_troop.enemies.size
break if self.enemy.exist?
end
end
end
end
|
Mon problème est : Lorsque je combats un groupe d'ennemis, tout va bien, chaque ennemi donne une seule attaque mais lorsque les ennemis se retrouvent seuls ( c-à-d juste après avoir buté leurs compagnons ... ) Une deuxième attaque survient de nulle part, il n'y a pourtant qu'un seul ennemi. Et cette deuxième attaque ne provient pas du seul ennemi car quand un ennemi attaque il est complètement blanc quelques millièmes de secondes ( je ne sais pas si vous voyez ce que je veux dire ) hors l'ennemi ne bouge pas ou n'est pas blanc lorsque cette deuxième attaque surgit. Voilà j'espère avoir été assez clair dans mon explication, le problème au début du jeux n'est pas " si " dramatique ( un peu en fait ... ) mais bon, si le problème persiste jusqu'à plus loin dans le jeux, cela risque de poser de gros problèmes, je préfère donc le résoudre dès maintenant.
Voila, merci à ceux qui essayeront de me répondre
|
Mack -
posté le 12/08/2013 à 20:31:09 (2310 messages postés)
- - | | Chalut !
Alors voila, j'ai un petit soucis dans le coding d'un nouveau type d'ennemi pour mon Zelda.
Cette ennemi c'est le blop, le monstre vert qui saute sur le joueur.
En faite, je n'arrive pas à comprendre comment lui dire que ses coordonnées de destination doivent être, si le joueur est assez loin, soit aléatoire mais sur un cercle de 32 de diamètre, soit si le joueur est assez proche, mais pas assez pour l'atteindre le plus proche du héros, mais toujours sur ce cercle.
Bien entendu, c'est pas du Ruby, mais du Java, mais je cherche plus la partie logique que pratique, j'arrive pas à m'imaginer comment faire en faite.
( Je pense pas qu'ils vous faillent d'autres détails, mais si besoin est faites signe )
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Nagato Yuki -
posté le 12/08/2013 à 20:57:54 (351 messages postés)
| | Ton explication est totalement incompréhensible.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//---
//Saute vers le joueur
// player_x : Coordonnée x du joueur
// player_y : Coordonnée y du joueur
// distance : distance entre le blop et le joueur
// this.x : Coordonnée x du blop
// this.y : Coordonnée y du blop
// Math.random()*32 déplacement aléatoire sur une coordonée
// /!\ ce déplacement est un float et je ne sais pas quel est le
// format des coordonnées dans le jeu
// this.jump_to_coord serait une méthode de saut à des
// coordonnées sur #l'écran.
//---
boolean jump_to_player(int player_x,int player_y)
{
float distance=Math.sqrt(Math.pow(this.x-player_x,2.0) + Math.pow(this.y-player_y,2.0));
if(distance<32)
{
this.jump_to_coord(player_x,player_y);
return true;
}
else
{
this.jump_to_coord(this.x+Math.random()*32, this.y+Math.random()*32);
return false;
}
} |
Ca serait un truc dans le genre que tu cherches ?
(Je ne programme pas en Java normalement donc mon code n'est peut être pas propre x) )
|
Pokémon Workshop, le site de Making Pokémon sur RPG Maker~ |
Mack -
posté le 12/08/2013 à 21:55:52 (2310 messages postés)
- - | | Ah, bah ça m'étonnes pas que mes explications soient pourrit xD
Sinon, comme je cherche pas le code pré fait, c'pas bien grave, c'est surtout que je sais pas comment m'y prendre pour choper un point sur un cercle de 32 de diamètre xD.
Là dans ton code, le blop va sauter sur le joueur, s'il y a moins de 32px entre eux.
Ça c'est pas forcément compliqué, j'avais réussis tout seul xD.
Sauf que si le joueur est trop loin, il va sauter de 32px dans une des quatre directions.
Hors, moi il faudrait que ça soit aléatoire sur un cercle, le centre étant les coordonnées X/Y du mob, et de diamètre 32px ( Cas lorsque le joueur est beaucoup trop loin ).
Et si le joueur est suffisamment proche, mais plus loin que 32px, il saute le plus proche possible, toujours en restant sur le cercle de centre X/Y, et de diamètre 32.
Petits exemples :
Le point jaune est le héros, le rouge le, le cercle Vert est le cercle qui permet de définir si le monstre va chercher à se rapprocher du mob, et le bleu c'est la distance de saut maximale.
Dans le cas 1, le héros est beaucoup trop loin ( en dehors des deux cercles ), le monstre va donc chercher à sauter aléatoirement sur un des points du cercle bleu.
Dans le cas 2, le héros est dans le cercle vert, mais en dehors du cercle bleu, le monstre va donc sauter sur le cercle bleu, mais sur le point le plus proche du héros.
Et dans le cas 3, le héros est dans le cercle bleu, le mob lui saute dessus ( Pas de soucis pour ce point donc ).
Voila, ça doit surement être plus compréhensible xD.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Cortez -
posté le 12/08/2013 à 22:11:27 (524 messages postés)
| | Alors pour simplifier tu devrais te servir d'une droite imaginaire qui
relie les 2 points. (calcul de trigonométrie pour l'hypoténuse.)
Sur cette droite tu fixe les valeurs de saut maximales. (cercles)
Et tu n'a plus qu'a faire sauter ton monstre sur les coordonnées
obtenue. Dans tous les cas il va sauter au plus près du héro.
Edit: Pour le coté aléatoire si le héro est trop loin il te suffit de
générer un point au hasard (à plus de 32px du monstre).
Puis tu reprends le même calcul qu'indiqué plus haut.
Normalement ça devrait marcher.
|
Orbital -
posté le 12/08/2013 à 22:51:39 (194 messages postés)
| | Ouais, c'est comme l'a dis Cortez.
Bon déjà je connais pas le rayon du cercle bleu donc je vais le mettre à 20 pour simplifier l'écriture.
Xm,Ym : coord du monstre
Xh,Yh : coord du héros
Je sais pas si je cherche trop compliqué mais je pense qu'il faut que tu te crées des fonctions pour :
hyp = sqrt((Xm-Xh)²+(Ym-Yh)²)
cos = |Xm-Xh| / hyp
sin = |Ym-Yh| / hyp
Au final je pense qu'il faut un truc du genre :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| hyp = sqrt((Xm-Xh)²+(Ym-Yh)²) #calcul de la longueur qui sépare le monstre du héros (Pythagore classique)
cos = |Xm-Xh| / hyp # cosinus de l'angle entre l'axe des abscisses et la droite imaginaire reliant le héros et le monstre
sin = |Ym-Yh| / hyp # de même avec le sinus
if hyp > 32 # ton cas numéro 1
X = Xm + rand(-20 à +20) # le random calcule Xs (le X du saut) qui peut aller de -rayon bleu à +rayon bleu
Ys = sqrt(20²-(X-Xm)²) # Ys correspond au Y maximum du saut aléatoire suivant le X. Il te permet de rester dans le cercle bleu en fonction Xs random choisi avant. Il s'agit d'une borne, pas du Y définitif.
Y = Ym + rand(-Ys à +Ys) # Y définitif pour le saut. Ça permet d'avoir ton random sur l'ordonnée tout en restant dans le cercle bleu.
elsif hyp > 20 # ton cas numéro 2
X = Xm + 20 * cos # nouvelle cordonnée X suivant le bon angle (trigo classique)
Y = Ym + 20 * sin # de même pour l'ordonnée
else # ton cas numéro 3
X = Xh
Y = Yh
end
jump aux coord : (X, Y) |
Je pense que c'est bon. Si je me suis chié hésitez pas à me gueuler dessus.
Par contre pour les valeurs absolues, la racine carrée et la vraie syntaxe tu te démerdes. C'est pas que j'y connais rien en ruby mais un peu quand même.
EDIT 2 :
J'ai moi aussi une petite question.
Je voudrais rajouter une option lors d'un combat.
Quand un personnage doit choisir une action, je voudrais pouvoir afficher une série d'action différente lorsqu'on appuie sur la flèche de gauche, et revenir au choix normal (Attaquer, Magie, Objets) quand on utilise la flèche de droite.
Pour mieux illustrer j'ai fait un truc qui marche sûrement pas mais c'est pour mieux m'exprimer :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| class Window_ActorCommand < Window_Command
def make_command_list
if Input.repeat?(:RIGHT)
add_other_command
elsif Input.repeat?(:LEFT)
return unless @actor
add_attack_command
add_skill_commands
add_item_command
end
# Nouvelle méthode : add_other_command
def add_other_command
add_command("Exceed", :skill, true, 3) #afficher le type de skill numéro 3 (Exceed)
add_guard_command
end
end |
En fait, expliquer temps par temps ça donne ça :
-c'est au tour de mon perso 1 de jouer, la fenêtre de commande apparaît (Attaquer, Magie, Technique, Objets).
-Si j'utilise la flèche de droite (ou gauche en fait), tout ça est remplacer par Guarde et Exceed (un type de skill que j'ai dans ma bdd, nom : Exceed, id : 3)
-Si je fais flèche de gauche (ou droite aussi en fait), je reviens au menu normal.
Ah sinon j'ai pas encore cherché mais je voudrais rajouter une ligne dans cette fenêtre de commande (pour qu'il y en ait 5 au lieu de 4). Je pense que c'est pas bien dur à trouver mais je demande quand même (flemme de chercher vu qu'il est 1h30 du mat' )
Voilou, désolé pour le gros pavé.
|
Final Fantasy Fury |
Cortez -
posté le 13/08/2013 à 11:10:04 (524 messages postés)
| | Système : RmXP
Question : Je voudrais changer l'apparence d'un event en fonction d'une variable.
Je ne veux pas utiliser les commandes d'évent classique car il
faudrait que je fasse 100 condition !
Pour bien comprendre, il faut un petit exemple.
Mon dossier character contient 100 chara ayant leur nom de 1 à
100. (1.png, 2.png, ...)
Maintenant je rend la variable Y égale à 5 et j'obtient un
changement d'apparence avec le chara "5.png".
La ligne de commande existe mais seulement dans les script :
1
| @character_name = @page.graphic.character_name |
Dans mon idée, je cherche à obtenir une commande en "insérez
un script" :
$game_event.character_name = $game_variables(Y)
| Aller à la page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73Index du forum > Entraide > [Scripts] Petites questions connes sur les SCRIPTS!!
|