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:
Estheone -
posté le 21/12/2014 à 18:56:30 (312 messages postés)
| | Essaie de rajouter ça :
1
2
3
4
5
6
7
8
9
10
|
class Bitmap
alias rgss_text_size text_size unless method_defined?(:rgss_text_size)
def text_size(text)
font_effect = font.shadow || font.outline || font.italic
rect = rgss_text_size(text)
rect.width += font_effect ? 3 : 1 if text.size > 1
rect
end
end |
Si ça marche pas il ne te reste plus qu'à utiliser une version de draw_text sans les modifs (en espérant que t'avais pas de problème de rognage sur les dialogues...).
1
2
3
4
5
6
|
class Bitmap
def draw_text2(*args)
rgss_draw_text(*args)
end
end |
Puis tu vas dans ton script d'affichage des messages et tu remplaces les draw_text par draw_text2.
|
Wandering Souls : Jeu complet / Topic sur Oniro | Suite du sujet:
Joke -
posté le 21/12/2014 à 19:04:13 (5090 messages postés)
| Bilouteux fou | Guilhem a dit:
Yop, je voudrais savoir si il y a moyen de déterminer si une case est passable ou pas en jeu par condition et sans compter les événements. Concrètement c'est pour faire un projectile que le joueur peut envoyer quand il veut. Avant de l'envoyer, il faudrait que le jeu puisse vérifier si les 6 cases devant le joueur sont passables.
Je suppose que ça peut se faire par appel de script... D'où le choix de ce topic. Et j'utilise VX Ace.
|
Tu peux utiliser :
1
| $game_map.passable?(x, y, direction) |
Qui vérifie si le tile est passable dans la direction donnée : 2=bas, 4=gauche, 6=droite, 8=haut)
Ça ne prend pas en compte les événements susceptibles de bloquer, seulement la map.
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Mack -
posté le 21/12/2014 à 19:12:46 (2310 messages postés)
- - | |
1
| $game_map.passable?(x, y, direction) |
Avec direction != de 2/4/6/8 ça renvoie pas la case en coordonnées XY ?
Sinon tu mets x-1,y, 6 et ça regardes la case à droite de celle à gauche de celle que tu veux regarder. Donc celle que tu veux regarder ^^.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Joke -
posté le 21/12/2014 à 19:47:31 (5090 messages postés)
| Bilouteux fou | Bon en fait j'suis allé trop vite... c'est pas le tile "devant", mais bien le tile aux coordonnées x et y.
Seulement il a besoin de connaître la direction car un tile peut être bloquant sur moins de quatre directions.
Par exemple :
Ce tile est passable sur les directions 2, 4 et 8, mais pas la direction 6. (droite)
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Estheone -
posté le 21/12/2014 à 20:30:25 (312 messages postés)
| | @Ephy :
Garde le script que je t'ai filé pour text_size.
Puis va dans Window_Base, méthode process_normal_character.
Remplace l'argument text_width * 2 de draw_text par une valeur plus grande, genre text_width * 4.
D'après mes tests, ça devrait régler le problème.
Edit : Ou mieux, mets text_size(" #{c} ").width, c'est la valeur exacte nécessaire.
|
Wandering Souls : Jeu complet / Topic sur Oniro |
Ephy -
posté le 21/12/2014 à 20:38:15 (30100 messages postés)
- | [BIG SHOT] | Ça marche bien maintenant. Merci. J'espère ne pas avoir d'autres surprises rigolotes comme ça par la suite mais à première vue les messages vont bien.
|
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 |
Guilhem -
posté le 21/12/2014 à 22:48:04 (26 messages postés)
| | Merci pour la commande, Joke, mais elle me semble assez aléatoire... A en juger par les réactions de mon projectile, le plancher est passable une fois sur deux, ce qui est tout de même assez triste (surtout pour le joueur).
Du coup je mets un petit aperçu de ce que j'ai programmé (juste pour le projectile et pour la page où j'utilise la commande que tu m'as donné), au cas où ce serait lui qui buggerait, ce que j'espère.
Script : SV[1] = event_x(@event_id)
SV[2] = event_y(@event_id)
Condition : si l'év. Héros regarde vers Bas
Condition : Script : $game_map.passable?(SV[1], SV[2], 2)
SV[3] += 1
Condition : Script : $game_map.passable?(SV[1], SV[2] + 1, 2)
SV[3] += 1
...
Condition : Script : $game_map.passable?(SV[1], SV[2] + 5, 2)
SV[3] += 1
Fin
Fin
Fin
Fin
Fin
Fin
Fin
(la même chose, avec les adaptations nécessaires évidemment, pour les autres directions)
Etiquette : Chips
Condition : Script : SV[3] >= 0
Déplacer un év. : Cet év. (attendre la fin)
Un pas en avant (sachant que l'événement a tourné précédemment le dos au héros)
Script : SV[3] -= 1
Attendre 1 frame
Aller à l'étiquette : Chips
Sinon
Script : V[42] = 0 (l'évent disparaît)
Fin
Si il y a un problème dans ce code j'aimerais bien savoir lequel... Et j'ai déjà pensé à augmenter la variable SV[3] dans l'embranchement "Sinon" des conditions (que j'ai pas représenté ici par flemme (ou par pragmatisme ?)). J'obtiens le même résultat dans les deux cas, ce qui me rend pas très optimiste...
|
cortez -
posté le 22/12/2014 à 14:54:17 (524 messages postés)
| | Au pire tu peux aussi programmer avec les Tile ID (sur Ace il y en a plus de 8.)
Tu te rends dans l'onglet des Tiles ID (tileset avec des cases colorées numérotés)
Et pour chaque case non traversable tu place un ID 9, pour celles non traversables
dans une direction tu place l'id correspondant (2 pour bas, 4 pour gauche,...)
Ensuite le projectile teste l'id du terrain ou il se trouve.
Donc tu crée juste ton projectile qui se déplace : (exemple pour la direction haut)
Étiquette Boucle
Variable truc rendre égal à l'ID terrain de "cet event"
<>Si cet event regarde vers le haut (projectile avance en haut)
<><>Si la variable ID est égale à 8 (rencontre une case non passable haut)
Tu efface l'event
Variable trajet = 0
<><> Sinon
<>Si la variable ID est égale à 9 (rencontre une case non passable tout)
tu efface encore ^^
Variable trajet = 0
<>Sinon
Condition variable trajet = 6
Effacer l'event
variable trajet = 0
Sinon
Un pas vers le haut (la case est passable donc on avance.)
Variable trajet +1
Allez à l'étiquette boucle
Voilà cette méthode n'utilise pas de script mais elle reste plus maniable.
(Par contre le projectile peut être lancé même si la zone passable est plus petite que
6 cases. Mais le projectile disparait dès qu'il rencontre une case non
traversable.)
|
Guilhem -
posté le 22/12/2014 à 16:50:11 (26 messages postés)
| | J'utilise déjà les numéros de terrain pour autre chose (interactions avec l'environnement). J'avais d'ailleurs déjà pensé à faire passer les projectiles au-dessus des trous, qui ont un numéro de terrain qui leur est propre. Et pour les zones de combat je me retrouve avec le même problème : je les utilise déjà, et plutôt massivement... Donc cette solution ne me convient pas. Enfin merci quand même m'sieur.
|
Mack -
posté le 22/12/2014 à 17:03:13 (2310 messages postés)
- - | | Tu veux juste savoir si les 6 cases devant ton héros sont passables ?
Te fais pas chier, et passe par un mini bout de script du genre :
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
| def passable_on?(k)
b = true
for i in 1...k
d = $game_player.direction
if ($game_player.direction==2)
x = $game_player.x
y = $game_player.y+i
elsif ($game_player.direction==4)
x = $game_player.x-i
y = $game_player.y
elsif ($game_player.direction==6)
x = $game_player.x+i
y = $game_player.y
elsif ($game_player.direction==8)
x = $game_player.x
y = $game_player.y-i
end
if (!$game_map.passable(x,y,d))
b = false
end
end
return b
end |
Que tu colles dans un la classe Interpreter et que t'appelles avec passable_on?(k), avec k la distance.
Je sais que tu voulais pas utiliser les scripts ( je vois pas pourquoi, m'enfin soit ... ), mais là tu te fera beaucoup moins chier pour le même résultat ^^.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Guilhem -
posté le 22/12/2014 à 17:10:58 (26 messages postés)
| | Si je voulais pas passer par les scripts, c'est aprce que je peux me débrouiller en programmation par event mais j'ai pas encore eu le courage de m'attaquer aux scripts (pourtant ça fait plusieurs années que je me dis qu'il faudrait que je le fasse...). Et par event, je peux savoir combien de cases sont passables et donc sur combien de cases le projectile va pouvoir passer (il est en "traverse tout"). Mais ton code, du moins j'en ai l'impression, ne fait que vérifier si les k cases devant sont passables. Alors que ce que je veux, c'est qu'on me dise jusqu'où peut aller mon projectile, sachant que le plafond est 6 cases devant (histoire d'éviter qu'il prolonge son voyage à l'infini).
Enfin je prends quand même ton code, ça peut être utile...
|
Mack -
posté le 22/12/2014 à 17:15:50 (2310 messages postés)
- - | | Ah, d'accord, j'avais mal compris ce que tu voulais.
M'enfin, là c'est quasiment aussi simple :
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
| def passable_on?(k)
b = true
i = 0
for i in 1...k
d = $game_player.direction
if ($game_player.direction==2)
x = $game_player.x
y = $game_player.y+i
elsif ($game_player.direction==4)
x = $game_player.x-i
y = $game_player.y
elsif ($game_player.direction==6)
x = $game_player.x+i
y = $game_player.y
elsif ($game_player.direction==8)
x = $game_player.x
y = $game_player.y-i
end
if (!$game_map.passable(x,y,d))
b = false
end
if (b)
i+=1
end
end
return i
end |
Tu rajoutes un compteur, et tant que c'est passable, tu l'incrémentes de 1.
Là, ça va te dire sur les 6 prochaines cases, combien à partir de combien ça ne sera plus passable ^^.
( Et oui, t'as bien compris mon premier code ^^ )
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Guilhem -
posté le 22/12/2014 à 17:29:23 (26 messages postés)
| | Merci beaucoup encore une fois. Mais comment peut-on récupérer la valeur de i ? Elle peut s'enregistrer où ?
|
Mack -
posté le 22/12/2014 à 17:33:10 (2310 messages postés)
- - | | Tu peux le faire dans une variable en faisant :
1
| inserer un script : $game_variables[ID] = passable_on?(6) |
Dans n'importe quel évent ^^.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Guilhem -
posté le 22/12/2014 à 17:40:08 (26 messages postés)
| | Merci beaucoup encore (ça fait au moins 3 fois non ? ^^). Argh, tu m'as contaminé. Bon, je vais encore exploiter un peu le filon parce que j'ai aucun scrupule ; je pourrais avoir la commande pour analyser un numéro de terrain en script ? Pour que les projectiles passent par-dessus les trous, numérotés 5 rien que pour eux (yep j'avais déjà tout prévu). Avec ça je devrais pouvoir me débrouiller pour traficoter un peu le code histoire d'obtenir pile ce que je veux.
|
Mack -
posté le 22/12/2014 à 17:43:41 (2310 messages postés)
- - | | Un simple
1
| $game_map.terrain_tag(x,y) |
^^
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Guilhem -
posté le 22/12/2014 à 17:47:44 (26 messages postés)
| | Bon bah encore merci, normalement c'est la dernière fois ^^. J'ai bien envie de dire une connerie pour te remercier mais je sais pas quoi, donc tant pis, je vais passer pour un ingrat.
Edit : "undefined method 'passable' for #<Game_Map:0x65ad5c4>"
C'est le message d'erreur que j'obtiens après avoir utilisé ta commande. J'ai mis le code que tu m'as donné dans le script Game_Interpreter, juste avant le end final, si ça peut aider à faire comprendre l'erreur... Je l'ai placé à d'autres endroits dans le script pour tester mais ça ne change rien.
|
Grim -
posté le 22/12/2014 à 19:07:11 (251 messages postés)
| | Utilise square_passable? et terrain_tag de l'event extender (que tu sembles utiliser) :
http://funkywork.github.io/EE/doc.html#terrain_tag
http://funkywork.github.io/EE/doc.html#square_passable?
Pour le code de Mack, il manque un ? à passable.
|
http://funkywork.github.io/ |
Mack -
posté le 22/12/2014 à 19:09:10 (2310 messages postés)
- - | | Ah, euh en faite j'ai juste oublier un ? après le passable :
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
| def passable_on?(k)
b = true
i = 0
for i in 1...k
d = $game_player.direction
if ($game_player.direction==2)
x = $game_player.x
y = $game_player.y+i
elsif ($game_player.direction==4)
x = $game_player.x-i
y = $game_player.y
elsif ($game_player.direction==6)
x = $game_player.x+i
y = $game_player.y
elsif ($game_player.direction==8)
x = $game_player.x
y = $game_player.y-i
end
if (!$game_map.passable?(x,y,d))
b = false
end
if (b)
i+=1
end
end
return i
end |
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Grim -
posté le 22/12/2014 à 19:23:33 (251 messages postés)
| | Je ne comprend pas bien la sémantique de ta fonction. Si elle termine par un ? elle doit (par convention) renvoyer un boolean.
J'avais écrit ça (sans le tester, je suis sous Linux)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| class Game_Interpreter
def passable_on?(k)
h = Hash.new
h[2] = [0, 1]
h[4] = [-1, 0]
h[6] = [1, 0]
h[8] = [0, -1]
d = $game_player.direction
(1...k).each do |i|
x = $game_player.x + (h[d][0]*i)
y = $game_player.y + (h[d][1]*i)
return false unless $game_map.passable?(x, y, d)
end
return true
end
end
|
|
http://funkywork.github.io/ |
Mack -
posté le 22/12/2014 à 19:41:53 (2310 messages postés)
- - | | Ouais, c'est qu'à la base, j'avais compris que justement il voulais seulement savoir si c'était passable sur k cases, sauf que c'est pas exactement ça, et après j'ai oublier de le changer ^^.
|
( Je prend note de tout les commentaires, même si je n'y répond pas ) |
Nagato Yuki -
posté le 22/12/2014 à 20:03:52 (351 messages postés)
| | Moi, je ne comprends pas pourquoi t'utilises un Hash et un Range alors qu'aucun des deux n'est dans l'absolut nécessaire et si c'est la course au code qui fait pas beaucoup de lignes :
1
2
3
4
5
6
7
8
9
10
11
| class Game_Interpreter
def arrow_tile_travelable(max = 6, character = $game_player)
d = character.direction
add_x = d==6 ? 1 : d==4 ? -1 : 0
add_y = d==2 ? 1 : d==8 ? -1 : 0
1.step(max) do |i|
return i-1 unless $game_map.passable?(character.x+add_x*i, character.y+add_y*i, d) or $game_map.terrain_tag(x,y)==5
end
return max
end
end |
Mais comme ça n'a aucun intérêt alors faisons une version légèrement plus propre qui sera comprise pareil par Ruby mais demandant moins de calculs :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Game_Interpreter
def arrow_tile_travelable(max = 6, character = $game_player)
d = character.direction
x = character.x
y = character.y
add_x = (d==6 ? 1 : (d==4 ? -1 : 0))
add_y = (d==2 ? 1 : (d==8 ? -1 : 0))
1.step(max) do |i|
x+=add_x
y+=add_y
return i-1 unless $game_map.passable?(x, y, d) or $game_map.terrain_tag(x,y)==5
end
return max
end
end |
Sous VX.Ace il suffira juste de faire ça :
Par défauts ça vérifie 6 tiles devant sans considérer les trou que t'as indiqué comme étant sur le tag. Les 6 tiles commencent à partir du tile devant le héros, si tu veux changer la quantité il te suffit de mettre le premier argument, par exemple pour 3 tiles : arrow_tile_travelable(3).
Edit : Dans mon screen j'ai pas changé la variable, t'es libre de prendre celle que tu veux, en résultat t'auras le nombre de tiles que la fleche peut traverser à partir de la position du héros.
Edit2 : Je viens de rapidement tester, il faut aussi vérifier si ton projectile n'entre pas en collision avec un évent ?
Il faudra donc remplacer la ligne :
1
| return i-1 unless $game_map.passable?(x, y, d) or $game_map.terrain_tag(x,y)==5 |
par :
1
| return i-1 unless ($game_map.passable?(x, y, d) or $game_map.terrain_tag(x,y)==5) and !character.collide_with_characters?(x,y) |
Ce qui donne au final :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| class Game_Interpreter
def arrow_tile_travelable(max = 6, character = $game_player)
d = character.direction
x = character.x
y = character.y
add_x = (d==6 ? 1 : (d==4 ? -1 : 0))
add_y = (d==2 ? 1 : (d==8 ? -1 : 0))
1.step(max) do |i|
x+=add_x
y+=add_y
return i-1 unless ($game_map.passable?(x, y, d) or $game_map.terrain_tag(x,y)==5) and !character.collide_with_characters?(x,y)
end
return max
end
end |
Je rappelle que ce que ça retourne c'est le nombre de tiles que le projectile peut traverser avant d'entrer en contact avec quelque chose :
0 = si c'est une fleche tu devrais avoir beaucoup de mal à la tirer car le mec est juste devant toi
1, 2, 3, 4 ou 5 = il y a un tile entre toi et le point de collision (mur ou évent)
6 = Trop loin. (max)
|
Pokémon Workshop, le site de Making Pokémon sur RPG Maker~ |
Grim -
posté le 23/12/2014 à 00:08:02 (251 messages postés)
| | Nagato Yuki > Il n'y avait pas de "réécriture en force" pour faire le moins de ligne possible, désolé si ça a été prit comme tel.
Concernant l'usage du Hash, c'est parce que j'ai pris l'habitude d'utiliser de vrais langage de programmation et qu'en général on préfère éviter dans des cas d'imbrication de valeur entant qu'atome, d'utiliser une égalité conditionnelle. Mais je suppose que c'est une mauvaise pratique et qu'il vaut mieux mettre pleins de ternaires ... c'est "beaucoup plus lisible" aussi ?
|
http://funkywork.github.io/ |
Joke -
posté le 23/12/2014 à 02:36:45 (5090 messages postés)
| Bilouteux fou | Sinon c'est rigolo de faire :
1
2
3
4
| d = character.direction/2-1
bilou = [0, -1, 1, 0]
add_x = bilou[d]
add_y = bilou[(d + 2) % 4] |
C'est parce qu'il y a "bilou" dedans, ça me fait toujours rire.
Autrement ça ne change rien du tout, 'vaut mieux faire comme Grim où on lit tout de suite la matrice sans se poser de question.
Au pire :
1
2
3
4
| d = character.direction/2-1
bilou = [[0, -1, 1, 0], [1, 0, 0, -1]]
add_x = bilou[0][d]
add_y = bilou[1][d] |
Ne mange pas de pain aussi.
Nagato Yuki > Je ne vois absolument pas en quoi des conditions imbriquées seraient meilleures qu'un bête Range d'Arrays qui ne dévie pas la continuité du code. =D
|
biloumaster.fr, mon joli site ouèb tout bô tout frai ! |
Grim -
posté le 23/12/2014 à 14:31:22 (251 messages postés)
| | Le soucis qu'évoque Nagato Yuki concernant le Range, c'est qu'on instancie un "objet Range" pour l'itération, alors qu'un itérateur classique x.upto/times/step est "mieux". Ce qui "objectivement" ne change rien car on parcourt, dans les deux cas, un Enumerator et qu'une somme est, en terme de calcul de complexité, négligeable.
Donc je suppose que la question de Nagato Yuki a été due au fait que mon ton semblait peremptoire et prétentieux, et il m'a gentiment remit à place Je l'ai bien mérité.
|
http://funkywork.github.io/ | 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!!
|