Bienvenue visiteur !
|
Désactiver la neige
Statistiques
Liste des membres
Contact
Mentions légales
358 connectés actuellement
30912339 visiteurs depuis l'ouverture
1975 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
Gari -
posté le 05/03/2021 à 19:27:55 (5901 messages postés)
- | | Domaine concerné: Script Logiciel utilisé: VX Hello,
Par défaut, il n'y a pas de terrain sur VX, et donc pas de quoi les détecter, ce qui est assez emmerdant pour gérer les tutos à event qui les utilisent, surtout que c'est quand même bien pratique. Malheureusement, impossible de trouver un script émulant ça sur le web, malgré les quatre ans de vie du log (2008-2012).
Je quémande donc votre aide pour m'aider à faire ça, car on va pas se mentir, je sais pas ce que je fais ni où je vais.
Voilà l'ébauche difficilement créée, il manque encore pas mal de choses mais l'idée est là :
- une liste des tile ayant un terrain tag (différent de 0 donc). Faudrait que ça ne crash pas si on appelle un tile inexistant ou un tile non répertorié).
- un moyen d'obtenir ces terrains pour un event et le joueur, si possible sous ces deux formes :
$game_player.terrain_tag(x,y)
$game_event.id[id].terrain_tag(x,y) (je suis même pas sûr que ce soit possible ce genre de chose)
Tout le script est sans doute faux. :/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| # Insérez le numéro du tile dont vous avez besoin et numéro du terrain.
class Game_Map
def terrain_tag
{
1: "1", 2: "1", 5: "1", 7: "1", 3584: "2"
}
end
end
# Obtenir l'id du terrain quand un héros événement est sur un tile.
class Game_Character
def get_terrain_tag
terrain_tag = @event.id(@event.x,@event.y)
end
end
class Game_Player
def get_terrain_tag
$game_map.terrain_tag(@x, @y)
end
end |
|
timtrack -
posté le 13/03/2021 à 19:31:35 (665 messages postés)
| Plop | *Dépoussière son logiciel rm VX*
J'ai corrigé ta proposition de script, le module permet d'associer un tag à toutes les tiles B à E.
Je ne suis pas sûr d'avoir compris ton intention dans Game_Character donc j'ai préféré ne pas toucher à la fonction.
J'ai testé l'appel de $game_player.get_terrain_tag dans un projet vierge
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
| module Terrain_Tag
#Si le terrain n'est pas répertorié dans TERRAIN_TAG, on renvoie cette valeur :
DEFAULT_TAG = "0"
#On associe à chaque id de terrain un tag
TERRAIN_TAG = {
1 => "1",
2 => "1",
5 => "1",
7 => "1",
3584 => "2"
}
end
class Game_Map
include Terrain_Tag
#renvoie l'id de terrain de la couche B à E (0 si rien n'est rempli)
def get_tile_id(x,y)
#la couche 2 correspond à B-E,
#la couche 1 m'est inconnue,
#la couche 0 correspond aux tileset A, dont les ids changent pour les tile dynamiques
for i in [2] #1,0]
tile_id = @map.data[x, y, i]
return 0 if tile_id == nil #il semblerait que cela puisse arriver
return tile_id
end
end
#renvoie le tag associé à l'id de terrain
def terrain_tag(x,y)
ret = TERRAIN_TAG[get_tile_id(x,y)]
return DEFAULT_TAG if ret == nil
return ret
end
end
# Obtenir l'id du terrain quand un héros événement est sur un tile.
class Game_Character
def get_terrain_tag
terrain_tag = @event.id(@event.x,@event.y)
end
end
class Game_Player
def get_terrain_tag
$game_map.terrain_tag(@x, @y)
end
end |
edit : corrigé des commentaires
|
Projet actuel |
Gari -
posté le 13/03/2021 à 19:54:54 (5901 messages postés)
- | | Merci beaucoup !
Je ne sais pas scripter donc pas sûr que Game_Character soit utile, l'idée était surtout de pouvoir obtenir l'id de terrain pour le joueur (player) ou l'événement (character).
Je vais essayer ça tout de suite ^^
VICTOIRE !
|
Gari -
posté le 14/03/2021 à 11:30:02 (5901 messages postés)
- | | Presque.
En gros j'ai utilisé une variable du jeu pour stocker le numéro du terrain dans une variable du jeu, et j'ai mis une condition pour que quand le héros se trouve sur le tile de terrain différent de 0, une musique se déclenche.
Sauf que la variable vaut 0, et le test se déclenche. Elle vaut autre chose, le test ne se déclenche pas.
Je vais voir si le fix interpreter est bien intégré sur la version payante de VX.
Une idée ?
|
timtrack -
posté le 14/03/2021 à 13:08:03 (665 messages postés)
| Plop | Ce n'est pas un bug du l'interpréteur (sur la version steam).
Dans le script plus haut, on a mis les tag comme chaîne de caractères ("1" n'est pas le nombre 1 mais la chaîne de caractères avec pour contenu "1").
Pour corriger cela, il suffit de remplacer les valeurs des tags par des nombres comme suit :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| module Terrain_Tag
#Si le terrain n'est pas répertorié dans TERRAIN_TAG, on renvoie cette valeur :
DEFAULT_TAG = 0
#On associe à chaque id de terrain un tag
TERRAIN_TAG = {
1 => 1,
2 => 1,
5 => 1,
7 => 1,
3584 => 2
}
end
|
|
Projet actuel |
Gari -
posté le 14/03/2021 à 13:32:11 (5901 messages postés)
- | | Merci !
J'ai contacté les deux autres personnes qui m'avaient pointé vers des solutions, j'aimerais juste savoir si pour toi c'est ok si le crédit n'est pas nécessaire en cas d'utilisation (ce sera sur la description du script) ?
J'ai réussi à trouver un moyen de récupérer l'id de tile en jeu sans avoir à créer un template avec tous les numéros de tile.
Pour l'utiliser en condition pour le moment, j'ai juste réussi à stocker l'id dans une variable du jeu, j'arrive pas à l'utiliser directement en condition (par exemple : $game_player.get_terrain_tag = 2 ou $game_player.get_terrain_tag[2]), après j'ai pas essayé de condition avec la modification sans guillemets, peut-être que ça le fera.
Il me reste plus qu'à le tester/faire fonctionner avec une ligne du style $game_character.event_id[id].get_terrain_tag et ce sera bon. ^^
|
timtrack -
posté le 14/03/2021 à 14:34:11 (665 messages postés)
| Plop | Je suis assez curieux de comment tu as fait sans le format template si tu peux détailler je suis chaud.
Pas de crédit nécessaire t'inquiète.
Pour le coup j'ai testé avec et sans les guillemets sur un event qui fait :
-$game_variables[1] = $game_player.get_terrain_tag (appel de script)
-teste si $game_variables[1] == 0
Avec les guillemets la variable sera différente de 0 (le nombre, car une chaine de caractère non vide n'est pas nulle), sans les guillemets le test va renvoyer vrai sur les tiles non répertoriés par le script, ce qui est le résultat attendu.
Citation: $game_player.get_terrain_tag = 2 |
Si tu veux tester une égalité via appel de script, tu devrais faire :
$game_player.get_terrain_tag == 2
== teste l'égalité
!= la différence
>=, <=, >, < pour les comparaisons
= c'est l'affectation, donc ça a probablement du te renvoyer une erreur
Ah et en temps normal a[k] c'est la case d'indice k du tableau a.
Tu peux utiliser ça et même enlever la classe Game_Player :
1
2
3
4
5
| class Game_Character
def get_terrain_tag
$game_map.terrain_tag(@x, @y)
end
end |
Pour synthétiser, ce code fonctionne :
Spoiler (cliquez pour afficher)
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
| module Terrain_Tag
#Si le terrain n'est pas répertorié dans TILE_TAG, on renvoie cette valeur
DEFAULT_TAG = 0
#On associe à chaque id de terrain un tag
TILE_TAG = {
1 => 1,
2 => 3,
5 => 1,
7 => 1,
3584 => 2
}
end
class Game_Map
include Terrain_Tag
#renvoie l'id du tile en x,y
def get_tile_id(x,y)
#la couche 2 correspond à B-E,
#la couche 1 m'est inconnue,
#la couche 0 correspond aux tileset A, dont les ids changent pour les tile dynamiques
for i in [2] #1,0]
tile_id = @map.data[x, y, i]
return 0 if tile_id == nil #il semblerait que cela puisse arriver
return tile_id
end
end
#renvoie le tag du tile en x,y
def terrain_tag(x,y)
ret = TILE_TAG[get_tile_id(x,y)]
return DEFAULT_TAG if ret == nil
return ret
end
end
#A chaque event est associé le tag à récupérer
class Game_Character
def get_terrain_tag
$game_map.terrain_tag(@x, @y)
end
end |
tu peux faire les commandes suivante :
1
2
3
4
5
6
| #pour recupérer le tag de la case des protagonistes
$game_player.get_terrain_tag
#pour recupérer le tag de la case de l'event id de la map courante
$game_map.events[id].get_terrain_tag
#pour recupérer le tag de la case x,y sur la map courante
$game_map.terrain_tag(x, y) |
|
Projet actuel |
Gari -
posté le 14/03/2021 à 14:45:35 (5901 messages postés)
- | | Cool !
Pour récupérer l'id d'un tile qu'on veut utiliser comme terrain :
Sur une map test, on map une région avec le tile voulu, et en jeu on fait un appel de script :
$game_variables[id de la variable] = $game_map.get_tile_id($game_player.x , $game_player.y)
(l'appel de script est nul et casse un peu le code, mais ça ressemble à ça :
Citation: $game_variables[id de la variable] =
$game_map.get_tile_id($game_player.x ,
$game_player.y) |
Et on le montre avec un message ou F9 en test.
Le double égal forcément (comme quoi même en l'ayant tous les jours sous les yeux ça tilte pas).
|
timtrack -
posté le 14/03/2021 à 14:58:43 (665 messages postés)
| Plop | Okay, fair enough, si tu trouves l'écriture trop lourde tu peux rajouter une méthode pour récupérer le tile id depuis l'event/le joueur :
1
2
3
4
| #dans la classe Game_Character
def get_tile_id
$game_map.get_tile_id(@x, @y)
end |
Et après plus qu'à faire
1
| $game_variables[id] = $game_player.get_tile_id |
Après c'est juste de la simplification d'écriture, ça apporte rien.
|
Projet actuel |
Gari -
posté le 14/03/2021 à 15:01:27 (5901 messages postés)
- | | Ok !
Je le rajouterai à part pour ceux qui souhaitent l'utiliser souvent, mais normalement pour cet appel de script c'est juste pour les tests.
Merci beaucoup en tout cas !
Et voilà un exemple sadique de pourquoi les terrains, c'est bien :
|
Index du forum > Entraide > [RESOLU] [VX] Ajouter des terrain tag à VX
|
|
|