Night.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker


Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Jeux: puie z / Jeux: Citymaime - Chapitre 1 / Jeux: Mer, îles et fous / News: Du neuf dans le making / News: Muma|Rope est disponible en (...) / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

169 connectés actuellement

30731832 visiteurs
depuis l'ouverture

1810 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Lunae - le bazar d'Emz0

RPG Maker Détente

Level Up!

Tashiroworld

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [Scripts] Petites questions connes sur les SCRIPTS!!

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:

Tata Monos - posté le 13/04/2012 à 09:10:08 (28 messages postés)

❤ 0

Compte Non utilisé

Comme avec le ruby nous pouvons tout faire ça c'est super puissant et tout, il y a pas moyen avec un script ruby de communiqué avec la carte graphique pour lui dire : Fout moi ça en cette couleur quand tu me lance en pleine gueule heu écran ?

Aller les copains méga bon scripteur de la mort qui tue, vous allez bien réussir à me pondre ça quand même vu que vous êtes les meilleurs des meilleurs ! La crème de la crème. Un zibou au 1er qui y arrive !:rit2


Suite du sujet:

zou - posté le 13/04/2012 à 12:31:00 (2197 messages postés)

❤ 0

Le plus simple : tu prends un carton de la couleur que tu veux, tu fais un trou de la taille de ton écran et tu le scotch autour ;)

EDIT :
Comment faire pour que le curseur de Window_Selectable soit affiché par dessus le contenue de la fenêtre ? (sur XP)


Mélodie - posté le 15/04/2012 à 19:39:49 (147 messages postés)

❤ 0

Les mecs, c'est comme les crevettes... Rien dans la tête, tout dans la queue!! :D

Support : RMXP

Question 1 : [Résolu]
Bonjour, apprêt un long moment d'absence me re voila avec une question conne xD.
J'aimerai savoir comment faire pour inversé un nombre inférieur à 0.
Par exemple: @s contient -50 et je voudrai l'inversé en 50 pour qu'il ne soi pas inférieur à 0.
Merci d’avance.

Si tu as un ennemi assieds-toi au bord du fleuve, tu verras passer son cadavre un jour ou l'autre... (proverbe du sage moine assassin). "Mes pourquoi suis-je ici ?, est ce ma vue qui se déforme ?, Ou je suis au paradis ?" Ma galerie/Mes script. Connecté que le week end et parfois dans la semaine.


Tata Monos - posté le 15/04/2012 à 19:45:25 (28 messages postés)

❤ 0

Compte Non utilisé

* -1 ?


S4suk3 - posté le 15/04/2012 à 19:54:54 (555 messages postés)

❤ 0

-

ton_nombre.abs


Mélodie - posté le 15/04/2012 à 20:08:17 (147 messages postés)

❤ 0

Les mecs, c'est comme les crevettes... Rien dans la tête, tout dans la queue!! :D

Moi qui cherché depuis un moment comment faire, et finalement c'est tout bête... :s
Merci pour l'aide, les 2 code fonctionne.

Si tu as un ennemi assieds-toi au bord du fleuve, tu verras passer son cadavre un jour ou l'autre... (proverbe du sage moine assassin). "Mes pourquoi suis-je ici ?, est ce ma vue qui se déforme ?, Ou je suis au paradis ?" Ma galerie/Mes script. Connecté que le week end et parfois dans la semaine.


Tasslehoff - posté le 15/04/2012 à 20:11:55 (5274 messages postés)

❤ 0

Disciple de Pythagolf

Avec .abs t'as même pas besoin de vérifier si ton nombre est négatif, dans tous les cas ça le rend positif. Alors qu'avec *-1 faut faire gaffe parce ça le rendra négatif dans le cas où il est positif.

~~


Ephy - posté le 16/04/2012 à 22:24:26 (30100 messages postés) - honor

❤ 0

[BIG SHOT]

Support: VX

Question:
Plutôt que de perdre du temps à chercher, je demande ici:
Dans les scripts de base de VX, j'aimerais savoir où est défini le taux de critique des héros et si on peut le rendre égal à un truc du genre:

Portion de code : Tout sélectionner

1
valeur de base + niveau du héros/nombre


Et tant qu'a y être, où est défini le bonus de critique conféré par l'option "taux de critique accru" des options sur la page "persos" de la BDD et si on peut mettre un truc du genre:

Portion de code : Tout sélectionner

1
taux de critique de base du perso*nombre



Merci d'avance.
(alors oui je pourrais chercher dans tout le fatras de script mais ce serait une perte considérable de temps pour quelque chose d'aussi simple et futile).

Power Level: 1 148 355,38|Mystic Slayer (Value!+)|Le monde d'Adélaïde|Reikon no Yume|★ H-Project|Toho Danmaku Arena|Loli versus Ponies|Mes vidéos|Ma galerie|Débuter sur VX:10, 11|Tuto: Importation de ressources|Mapper avec les RTP VX|Touhou|Fan de Omenides|Fan de Estheone|Eph'ille: 14


zou - posté le 16/04/2012 à 22:48:00 (2197 messages postés)

❤ 0

regarde ligne 650 de Game_Battler


Ephy - posté le 16/04/2012 à 23:37:40 (30100 messages postés) - honor

❤ 0

[BIG SHOT]

Je ne parle pas de où est déterminé si le coup critique est porté ou non mais de là où est définie la valeur de critique de base des persos (la valeur de "attacker.cri" je pense) qui est de 5 par défaut et que je veux pouvoir modifier.

Power Level: 1 148 355,38|Mystic Slayer (Value!+)|Le monde d'Adélaïde|Reikon no Yume|★ H-Project|Toho Danmaku Arena|Loli versus Ponies|Mes vidéos|Ma galerie|Débuter sur VX:10, 11|Tuto: Importation de ressources|Mapper avec les RTP VX|Touhou|Fan de Omenides|Fan de Estheone|Eph'ille: 14


zou - posté le 16/04/2012 à 23:40:41 (2197 messages postés)

❤ 0

alors jette un oeil ligne 281 de game_Actor


Ephy - posté le 17/04/2012 à 19:29:51 (30100 messages postés) - honor

❤ 0

[BIG SHOT]

Ah merci Zou. Mais du coup, comment faire pour mettre ceci comme valeur de n (en fait plus précisément comment récupérer la valeur du niveau du héros):

Portion de code : Tout sélectionner

1
nombre + niveau du héros/nombre


J'ai tenté de mettre un "actor.level" mais comme je m'en doutais ça marche pas :F

Power Level: 1 148 355,38|Mystic Slayer (Value!+)|Le monde d'Adélaïde|Reikon no Yume|★ H-Project|Toho Danmaku Arena|Loli versus Ponies|Mes vidéos|Ma galerie|Débuter sur VX:10, 11|Tuto: Importation de ressources|Mapper avec les RTP VX|Touhou|Fan de Omenides|Fan de Estheone|Eph'ille: 14


S4suk3 - posté le 17/04/2012 à 19:55:35 (555 messages postés)

❤ 0

-

@level


Ephy - posté le 18/04/2012 à 00:01:56 (30100 messages postés) - honor

❤ 0

[BIG SHOT]

Yeah! Merci Sasuke, ça fonctionne nickel comme ça.

Power Level: 1 148 355,38|Mystic Slayer (Value!+)|Le monde d'Adélaïde|Reikon no Yume|★ H-Project|Toho Danmaku Arena|Loli versus Ponies|Mes vidéos|Ma galerie|Débuter sur VX:10, 11|Tuto: Importation de ressources|Mapper avec les RTP VX|Touhou|Fan de Omenides|Fan de Estheone|Eph'ille: 14


S4suk3 - posté le 18/04/2012 à 00:34:36 (555 messages postés)

❤ 0

-

Il faut bien comprendre que quand tu fais actor.level, actor doit correspondre a une instance de Game_Actor. Or ici on est dans la définition d'une classe, donc un comportemment générique aux instances.


Mack - posté le 18/04/2012 à 20:13:23 (2310 messages postés) - staff -

❤ 0

Salut !
J'ai deux nouvelles questions, même si celle d'avant reste toujours d'actualités.

Support : RMVX Ace

Question Jesaispluscombien + 1:
Est il possible d'afficher les petites flèches qui disent qu'il reste des trucs en dehors de la fenêtre.
( Celles qui se trouvent dans le Fichier du Windowskin. )
Je sais que c'est pas super clair, mais je sais pas trop comment expliquer c'que je veut faire en faite ...
En gros, je voudrais arriver à ça :
image


Question Jesaispluscombien + 2:
Système de déplacement d'un sprite améliorée.

Voila, donc en faite, j'suis en train d'essayer de faire qu'un sprite puisse se déplacer comme un character.
C'est à dire que le sprite se déplace dans 4 directions, et selon des cases de 32 Pixels.
J'ai donc fait ça :

Portion de code : Tout sélectionner

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
  def moveto(x,y)
    wait_frame = 0
    loop do 
      wait_frame += 1
      Graphics.update
      SceneManager.scene.spriteset.update
      if @x < x
        @x += 1
        @direction = 6
      elsif @x > x
        @x -= 1
        @direction = 4
      end
      if @y < y
        @y += 1
        @direction = 2
      elsif @y > y
        @y -= 1
        @direction = 8
      end
      if x == @x and
         y == @y
        break
      end
    end
  end



Mais je rencontre deux gros problème :
Premièrement le déplacement est beaucoup trop brute :
Le sprite se déplace cases par cases, et pas progressivement.

C'est réglé.

Second problème, j'aimerais que le sprite soit un peu plus intéligent, et que si la map est pas passable, le sprite ne passe pas par cette case.
( Le sprite est afficher sur une map, donc j'utiliserais les passabilitées des map. )

( Je prend note de tout les commentaires, même si je n'y répond pas )


zou - posté le 18/04/2012 à 20:42:10 (2197 messages postés)

❤ 0

Question 1 : Il faut que contents soit plus grand que le fenêtre-32
exemple :

Portion de code : Tout sélectionner

1
2
3
super(x, y, 100, 100)
...
self.contents = Bitmap.new(width-10, height-32)


Là tu auras une fleche sur la droite, mais pas en bas.
Mais tu devras surement redéfinir le scrolling droite/gauche qui ne doit être mis par défaut.

Question 2 : Tu as deux possibilités, soit tu utilises une fonction rand (aléatoire) pour déterminer droite/gauche dans le cas où devant n'est pas passable. Regarde move_toward_player
Ou alors tu passes par le pathfinding


Mack - posté le 18/04/2012 à 20:51:46 (2310 messages postés) - staff -

❤ 0

Question 1 :
Et comment faire si le bitmap à déjà était définit ?
Faut que je le redéfinisse obligatoirement ?
- Le scrolling Gauche/Droite c'est déjà fait ^^ )

Question 2 :
Okay, j'vais essayer de voir avec move_toward_player.
Sinon, pour le pathfinding, j'y avais pensé, mais j'me demander si y avais pas mieux.

( Je prend note de tout les commentaires, même si je n'y répond pas )


zou - posté le 19/04/2012 à 01:08:31 (2197 messages postés)

❤ 0

Tu veux le changer en live ?
Je sais pas si en refesant initialize avec les bons arguments ça marche, ou alors changer self.width = X. Sinon dispose la fenêtre et fait une nouvelle.


Mack - posté le 19/04/2012 à 10:16:16 (2310 messages postés) - staff -

❤ 0

Question 1 :
Ouais j'voudrais faire comme dans FF10 :
Première partie de la fenêtre on a les commandes normales, et si on appuis sur Gauche, on récupère d'autres commandes.

En utilisant la def initialize c'pas possible.
Enfin, j'y arrive pas quoi.

Par contre, en redéfinissant le Contents, j'ai réussis à afficher une image sur la droite. Mais aucune idée de comment l'afficher à gauche ...

Question 2 :
Pour le Move_Toward_Player, ça arrangeras pas mes affaires ...
Si entre la case ciblée et l'évent il y a un obstacle, bah l'évent restera bloqué.
J'vais donc essayer de voir avec des pathfindings ... Même si le seul que j'ai trouvé avait l'air bien chiant à décortiquer ...

( Je prend note de tout les commentaires, même si je n'y répond pas )


S4suk3 - posté le 19/04/2012 à 11:43:27 (555 messages postés)

❤ 0

-

Pour faire un pathfinding tu dois te baser sur un algorithme.
Dans le cas des cibles mouvantes il y a les recherches multi Agent ou alors plus simplement A* qui est relativement facile à implémenter.

http://www.games-creators.org/wiki/Introduction_au_pathfinding
http://the-lambda-church.org/articles/pathfinding/
http://khayyam.developpez.com/articles/algo/astar/

L'algorithme est assez facile à écrire mais relativement gourmand (sur des grandes maps avec des grands trajets ça peut poser problème).

Sinon, tu peux utiliser la spéculation réductrice qui est simplification de A* et qui agit au "case par case".

Bonne chance.


Mack - posté le 19/04/2012 à 21:02:30 (2310 messages postés) - staff -

❤ 0

Question 2 :
Moi c'est juste sur une map en Maximum 20*15, avec une destination fixe.
Donc j'devrais pas trop galérer, si ? x)
J'vais essayer de voir si je peux le faire avec les liens que tu ma refiler :).

Question 1 :
J'crois qu'il faudrait que je décale mon bitmap vers la gauche ...
Mais j'ai beau regarder la Doc', j'vois pas comment faire ...


Et sinon, personnes aurait la Doc de Ace en anglais/Français ?
Non, parce que du coup, j'doit prendre celle de XP/VX ...

( Je prend note de tout les commentaires, même si je n'y répond pas )


S4suk3 - posté le 19/04/2012 à 21:42:58 (555 messages postés)

❤ 0

-

Non ça devrait aller.
Les pathfinding sont relativement simple à implémenter, tu ne devrais pas avoir de soucis.


zou - posté le 19/04/2012 à 21:43:33 (2197 messages postés)

❤ 0

Question 1

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
def create_contents
    contents.dispose
    if contents_width > 0 && contents_height > 0
      self.contents = Bitmap.new(contents_width, contents_height)
    else
      self.contents = Bitmap.new(1, 1)
    end
  end


tu redéfinies cette méthode dans la classe de ta fenêtre

Question 2
C'est quoi qui est aléatoire, les cases passables ? Le point de départ ? car si c'est toutjours le même chemin ou il y en a 3-4 ou plus, tu précalcules le chemin.


Mack - posté le 19/04/2012 à 21:58:35 (2310 messages postés) - staff -

❤ 0

zou a dit:


Question 1

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
def create_contents
    contents.dispose
    if contents_width > 0 && contents_height > 0
      self.contents = Bitmap.new(contents_width, contents_height)
    else
      self.contents = Bitmap.new(1, 1)
    end
  end


tu redéfinies cette méthode dans la classe de ta fenêtre

Question 2
C'est quoi qui est aléatoire, les cases passables ? Le point de départ ? car si c'est toutjours le même chemin ou il y en a 3-4 ou plus, tu précalculer le chemin.



Question 1 :
Ouais ouais, j'ai réussis ça ^^.
Mais je comprend pas comment afficher la flèche à gauche, car si je modifie contents_width, bah, la flèche va être à droite ...

Question 2 :
Pour faire simple, mes sprites commencent aléatoirement sur l'écran. L'écran est divisé en Tile avec la Classe Game_Map.
Les cases non passable sont différentes pour chaque map, puisque elles dépendent de si le tile est passable ou pas dans la BDD.
Et la destination est entièrement aléatoire :
Le joueur choisit où le personnage va aller. ( Ça dépend toujours de la passabilité de la map. )

J'ai beau lire les tuto de Sas', j'comprend pas vraiment comment faire ...

J'ai donc taper Pathfinding A* Ruby, et je suis tomber sur un post de Samarium :

Samarium a dit:

Bonjour,

Je ne vois pas trop ce que tu veux faire mais j'ai créé (pour un jeu de stratégie) un pathfinding made in Samarium ^^. Je pense qu'il est optimisé :

Portion de code : Tout sélectionner

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
# Pathfinding par Samarium
# Méthode "pathfinding"
# xfinal : position X de l'arrivé
# yfinal : position Y de l'arrivé
# Retourne : un tableau de direction (2,4,6,8)
#####
def pathfinding(xfinal, yfinal)
    x = @x
    y = @y
    @list_ouvert = {[x, y] => [nil, nil, nil]}
    calcul_distance_path(xfinal, yfinal, x, y)
    list_ferme = {[x, y] => [0, @dis_final, @somme_dis, 0]}
    @dir = []
    id = 0
    while not (x == xfinal and y == yfinal)
      # Si les positions ne sont pas valides.
        return [] if y == nil or x == nil
        id += 1
        for i in 0...4
          case i
          when 0
            new_y = y-1
            new_x = x
          when 1
            new_y = y
            new_x = x+1
          when 2
            new_y = y+1
            new_x = x
          when 3
            new_y = y
            new_x = x-1
          end 
          if record_pos_path?([new_x, new_y])
            calcul_distance_path(xfinal, yfinal, new_x, new_y)
            @list_ouvert[[new_x, new_y]] = [@dis_ini, @dis_final, @somme_dis, id]
          end
         
        end
         @list_ouvert[[x, y]] = [nil, nil, nil]
         min_dis_final = min_somme_dis = 200
         new_value = new_pos = []
        @list_ouvert.each do |key, value|
          if value[2] != nil
            if value[2] <= min_somme_dis and value[1] <= min_dis_final
               min_dis_final = value[1] 
               min_somme_dis = value[2]
               new_value = value
               new_pos = key
             end
           end
         end
        list_ferme[new_pos] = new_value
        x = new_pos[0]
        y = new_pos[1]  
      end
      min_dis_ini = 200
      while min_dis_ini != 0
        min_dis_ini = min_somme_dis = min_dis_id = 200
        return [] if y == nil or x == nil
        for i in 0...4
          case i
          when 0
            new_y = y-1
            new_x = x
            dir = 8
          when 1
            new_y = y
            new_x = x+1
             dir = 4
          when 2
            new_y = y+1
            new_x = x
             dir = 2
          when 3
            new_y = y
            new_x = x-1
             dir = 6
           end # case
           value = list_ferme[[new_x, new_y]]
           list_ferme[[x, y]] = nil
          if value != nil
            if value[3] < min_dis_id
              min_dis_id = value[3]   
              min_dis_ini = value[0]  
              n_dir = dir 
              n_new_x = new_x
              n_new_y = new_y
            end # if
          end  # if
        end # for
        x = n_new_x
        y = n_new_y
        @dir.push(n_dir)
      end # while     
       return @dir.reverse!
  end # def
 
def calcul_distance_path(xfinal, yfinal, x, y)
    @dis_final = (xfinal - x).abs + (yfinal - y).abs
    @dis_ini = (@x - x).abs + (@y - y).abs
    @somme_dis = @dis_final + @dis_ini
  end
  
  def record_pos_path?(tab_xy)
    return  true if @tab_move.include?(tab_xy) and not @list_ouvert.include?(tab_xy)
    return false
 end



Attention : ce n'est pas une classe mais des méthodes. Ils font donc les rajouter dans la classe adéquate.

Lis le commentaire à l'entête du script. La méthode "pathfinding" retourne un tableau de direction. Il suffira de lire en boucle le tableau pour faire déplacer un personnage

Exemple : [2, 6, 2, 2]
signifie : Haut, Droite, Haut, Haut

Ne pas oublier d'inialiser les variables @x et @y (positions de départ d'un personnage) dans une méthode (inialize par exemple)

Normalement je n'ai rien oublier mais puisque je le tire d'un système qu'il y a d'aures scripts, il se peut que j'ai oublié une méthode, variables ..etc. sinon, il marche très bien et optimisé.



Il marche donc assez bien, le personnage se déplace très bien jusqu'à la destination sans aucun soucis.
Néanmoins, il ne gère pas la passabilité, et je comprend pas comment faire ...

( Je prend note de tout les commentaires, même si je n'y répond pas )


zou - posté le 20/04/2012 à 17:44:22 (2197 messages postés)

❤ 0

Question 1 :
Ah, tu la veux à gauche ta flèche, tu fais self.ox = blabla ;)

Question 2 :
J'avais fais ça pour mon A-RPG, pour moi il fonctionne très bien, après sur projet vièrge je ne garantis rien.
Il te renvoie un Move_Route (regarde la méthode make_move_route)

Portion de code : Tout sélectionner

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
class Node
  
  attr_reader   :parent, :x, :y
  attr_accessor :good, :passage, :distance
  
  def initialize(parent, x, y, distance = nil)
    @parent, @x, @y = parent, x, y
    @good = true
    @passage = false
    @distance = distance
  end
  
  def pos?(x, y)
    return (@x == x and @y == y)
  end
  
end
 
class Goal
  
  attr_reader   :x, :y
  
  def initialize(x, y)
    @x, @y = x, y
  end
  
end
 
module Pathfinding
  
  def self.start(event_id, x, y, zone = 0, skippable = false)
    if event_id == 0
      @event = $game_player
    else
      return unless $game_map.events[event_id]
      @event = $game_map.events[event_id]
    end
    @goal = Goal.new(x, y)
    @path = [Node.new(nil, @event.x, @event.y, self.distance(@goal))]
    @move_route = RPG::MoveRoute.new
    @move_route.repeat = false
    @move_route.path = true
    @move_route.x = x
    @move_route.y = y
    @move_route.zone = zone
    @move_route.skippable = skippable
    @zone = zone
    self.make_path
  end
  
  def self.make_path
    begin
    @current_node = @path[0]
    if @current_node.pos?(@goal.x, @goal.y) or 
       (self.passable?(@goal.x, @goal.y) == false and @zone == 0)
      return
    end
    
    loop do
      break if @current_node.pos?(@goal.x, @goal.y)
      if @zone > 0
        break if @current_node.distance <= @zone
      end
      adjacent_nodes = get_adjacent_nodes
      if adjacent_nodes == [nil, nil, nil, nil]
        # retour en arrièrre
        @current_node.good = false
        @current_node = @current_node.parent
      else
        adjacent_nodes.compact!
        nearest = self.node_nearest(adjacent_nodes)
        @path.push(nearest)
        @current_node.passage = true
        @current_node = nearest
      end
    end # fin loop
    rescue
      # passage introuvable
      #print "passage introuvable"
      return
    end
    self.erase_useless_node
  end
  
  def self.erase_useless_node
    # Effacer des nodes mauvais
    for i in 0 ... @path.size-1
      if @path[i].good == false
        @path[i] = nil
      end
    end
    @path.compact!
    # Effacer les nodes qui ralongent le chemin
    for i in 0 ... @path.size-1
      node = @path[i]
      next if node == nil
      nodes = self.find_adjacent_node(node.x, node.y)
      nodes.compact!
      for i in 0 ... nodes.size
        if node.parent == nodes[i] or nodes[i].parent == node
          nodes[i] = nil
        end
      end
      nodes.compact!
      node2 = node_nearest(nodes)
      if node2
        self.erase_to(node,node2)
      end
    end
    @path.compact!
    self.make_move_route
  end
    
  def self.make_move_route
    @move_route.list = []
    for i in 0 ... @path.size-1
      node = @path[i]
      next_node = @path[i+1]
      sx = node.x - next_node.x
      sy = node.y - next_node.y
      if sx == 1 # bas
        @move_route.list.push(RPG::MoveCommand.new(2))
      elsif sx == -1 # gauche
        @move_route.list.push(RPG::MoveCommand.new(3))
      elsif sy == 1 # droite
        @move_route.list.push(RPG::MoveCommand.new(4))
      elsif sy == -1 # haut
        @move_route.list.push(RPG::MoveCommand.new(1))
      end
    end
    @move_route.list.delete_at(0)
    @move_route.list.push(RPG::MoveCommand.new(0))
    @event.force_move_route(@move_route)
  end
 
  def self.passable?(x, y)
    return false if @event.passable?(x, y,0) == false
    for node in @path
      return false if node.pos?(x, y) and (node.good == false or node.passage == true)
    end
    return true
  end
  
  def self.distance(node)
    return Math.hypot(node.x - @goal.x, node.y - @goal.y)
  end
  
  def self.node_at(x, y)
    for node in @path
      next unless node
      return node if node.pos?(x, y)
    end
    return nil
  end
  
  def self.node_nearest(nodes)
    nearest = nodes[0]
    for node in nodes
      if nearest.distance > node.distance
        nearest = node
      elsif nearest.distance == node.distance
        if rand(2) == 0
          nearest = node
        end
      end
    end
    return nearest
  end
  
  def self.erase_to(node,node2)
    start = false
    for i in 0 ... @path.size
      if @path[i] == node
        start = true
        next
      end
      if @path[i] == node2
        break
      end
      if start
        @path[i] = nil
      end
    end
  end
  
  def self.get_adjacent_nodes
    nodes = []
    if self.passable?(@current_node.x+1, @current_node.y)
      node = Node.new(@current_node, @current_node.x+1, @current_node.y)
      node.distance = self.distance(node)
      nodes.push(node)
    else
      nodes.push(nil)
    end
    if self.passable?(@current_node.x-1, @current_node.y)
      node = Node.new(@current_node, @current_node.x-1, @current_node.y)
      node.distance = self.distance(node)
      nodes.push(node)
    else
      nodes.push(nil)
    end
    if self.passable?(@current_node.x, @current_node.y+1)
      node = Node.new(@current_node, @current_node.x, @current_node.y+1)
      node.distance = self.distance(node)
      nodes.push(node)
    else
      nodes.push(nil)
    end
    if self.passable?(@current_node.x, @current_node.y-1)
      node = Node.new(@current_node, @current_node.x, @current_node.y-1)
      node.distance = self.distance(node)
      nodes.push(node)
    else
      nodes.push(nil)
    end
    return nodes
  end
  
  def self.find_adjacent_node(x, y)
    nodes = []
    nodes.push(node_at(x+1,y))
    nodes.push(node_at(x-1,y))
    nodes.push(node_at(x,y+1))
    nodes.push(node_at(x,y-1))
    return nodes
  end
  
end
 
module RPG
  
  class MoveRoute
    
    attr_accessor :repeat
    attr_accessor :skippable
    attr_accessor :wait
    attr_accessor :path
    attr_accessor :x
    attr_accessor :y
    attr_accessor :zone
    
    def initialize
      @repeat = true
      @skippable = false
      @wait = false
      @path = nil
      @x = nil
      @y = nil
      @zone = nil
    end
    
  end
  
end



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

Index du forum > Entraide > [Scripts] Petites questions connes sur les SCRIPTS!!

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers