Suite à l'echange interessant que j'ai eu avec Jebbou sur ce
topic, j'ai mis au point ce "systeme" qui sert à pouvoir non seulement monter sur le relief mais egalement à gerer simplement les ponts.
Tout d'abord, il vous faut ce script, placé dans "Materials" :
- Code:
-
class Game_Map
attr_accessor :tab_passage # Ecriture des nouvelles données
attr_reader :map # Lecture des données de la map
alias hk_initialize initialize
def initialize
hk_initialize
@tab_passage = {} # création du hash
end
# redefinition de la methode qui controle la passabilité
def passable?(x, y, flag = 0x01)
for event in events_xy(x, y) # events with matching coordinates
next if event.tile_id == 0 # graphics are not tiled
next if event.priority_type > 0 # not [Below characters]
next if event.through # pass-through state
pass = @passages[event.tile_id] # get passable attribute
next if pass & 0x10 == 0x10 # *: Does not affect passage
return true if pass & flag == 0x00 # o: Passable
return false if pass & flag == flag # x: Impassable
end
for i in [2, 1, 0] # in order from on top of layer
tile_id = @map.data[x, y, i] # get tile ID
return false if tile_id == nil # failed to get tile: Impassable
pass = @passages[tile_id] # get passable attribute
###################################
if @tab_passage.key?(tile_id) # Si quelque chose à été defini
return @tab_passage[tile_id] # retourne la valeur defini
end
###################################
next if pass & 0x10 == 0x10 # *: Does not affect passage
return true if pass & flag == 0x00 # o: Passable
return false if pass & flag == flag # x: Impassable
end
return false # Impassable
end
end
###################################
class Game_Player < Game_Character
attr_accessor :passage_pont
alias hk_init initialize
def initialize
hk_init
@passage_pont = false
end
def screen_z
return 250 if @passage_pont
super
end
end
###################################
class Game_Interpreter
def change_passage(fichier, x, y, valeur)
case fichier
when "A1"
min = 2048 + (((y * 8) + x) * 48)
max = min + 47
when "A2"
min = 2816 + (((y * 8) + x) * 48)
max = min + 47
when "A3"
min = 4352 + (((y * 8) + x) * 48)
max = min + 47
when "A4"
min = 5888 + (((y * 8) + x) * 48)
max = min + 47
when "A5"
min = 1536 + ((y * 8) + x)
max = min + 1
when "B"
min = 0 + ((y * 8) + x)
max = min + 1
when "C"
min = 256 + ((y * 8) + x)
max = min + 1
when "D"
min = 512 + ((y * 8) + x)
max = min + 1
when "E"
min = 768 + ((y * 8) + x)
max = min + 1
end
for tile_id in min..max
$game_map.tab_passage[tile_id] = valeur
end
end
def efface_passage
$game_map.tab_passage.clear
end
def passage_pont(var)
$game_player.passage_pont = var
end
def player_in_range?(x_min, y_min, x_max, y_max)
if $game_player.x.between?(x_min, x_max) and $game_player.y.between?(y_min, y_max)
return true
end
return false
end
end
Il permet deux choses :
- Modifier in-game la passabilité d'un element du terrain.
- Modifier in-game la priorité d'affichage du héros ( au dessus de ce qui est au-dessus de tout ).
1 - Modifier la passabilité :
Cela se fait grace à une insertion de script :
- Code:
-
change_passage(fichier, colonne, ligne, valeur)
- Fichier, c'est le fichier de reference du terrain à modifier.
( "A1", "A2", "A3", "A4", "A5", "B", "C", "D", "E" )
Faite attention à savoir dans quel fichier se trouve votre terrain.
( En réalité, la difficulté est pour "A3" et "A4", les autres sont assez identifiables ... )
- Colonne, c'est la colonne dans laquelle se trouve votre terrain ( de 0 à 7 ).
- Ligne, c'est la ligne dans laquelle se trouve votre terrain ( de 0 à ... ça depend des fichiers ... ).
- Valeur, c'est la valeur à donner au terrain.
Deux possibilités :
- true indique une case passable.
- false indique une case non-passable.
Voici un petit exemple in-situ :
Pour pouvoir monter sur le bloc de terre, on a besoin de deux events :
Ne faite pas attention aux interrupteurs pour l'instant !!
Voila à quoi ressemble l'event du haut :
Et voici pour l'event du bas :
En montant, le relief devient passable et l'herbe non.
Il n'est donc plus possible de redecendre du relief par le haut ou le coté.
Descendre par l'escalier permet de re-changer la passabilité, donc, retour à la normal.
( Herbe passable, relief non )
Pour effacer toutes les modifications, utiliser l'insertion :
- Code:
-
efface_passage
Ca permet de supprimer toutes les modifications faites in-game pour un retour à la passabilité "Editeur".
2 - Modifier la priorité d'affichage :
Ca aurait été assez complexe de modifier la priorité d'affichage du terrain, donc j'ai feinté en modifiant celle du player ...
Pour cela, on a besoin d'un event en processus parallele et d'un interrupteur.
( Qui dit mieux ? )
Voila, vous pouver désormais regarder l'interrupteur sur les screens ci-dessus.
Il sert à savoir si le player est en hauteur ou non.
Donc à savoir s'il passe sous le pont ou au-dessus.
Le pont, c'est un element classique du tilesets, mis en priorité d'affichage haute.
On voit sur le deuxieme screen qu'il doit etre defini comme passable.
( Contrairement au autres, il est mis en passable une fois pour toute et on n'a pas besoin de le "depassabiliser" à la redescente. )
Euh, où en etais-je ?
Ah oui, un event en processus parallele que voici :
Suffisament explicite ?
Cet event sert à gerer tous les ponts de la map.
L'insertion de script dans la condition sert à verifier si le player est dans une certaine zone :
- Code:
-
player_in_range?(x_min, y_min, x_max, y_max)
- x_min, c'est la coordonnée x du point haut-gauche de la zone.
- y_min, même chose mais pour la coordonnée y.
- x_max et y_max sont pour la point bas-droit.
Si l'interrupteur est actif et que le player est dans la bonne zone, l'insertion "passage_pont(true)" modifie la priorité d'affichage du player.
Il s'affiche desormais au dessus des elements en priorité haute ( c'est le cas de notre pont souvenez vous ).
Ca ne durera que le temps qu'il reste dans la zone.
Pour eviter les désagréments, ajouter une case aux extrémités de la zone.
Sur la map, mes ponts font 5 cases de large, ma zone en fait 7.
Il me reste une chose à dire :
AVERTISSEMENT !!
Les PNJ sont aussi affectés par le changements de passabilités.
Concretement, ils ne pourront plus bouger sur l'herbe pendant que vous etes en hauteur et vice-versa.
Pour pallier à ceci, utiliser l'interrupteur pour passer les events en mode "Passe-muraille".
Et determiner leurs une zone qu'ils ne pourront pas franchir pour eviter qui ne se balade sur les murs.
AVERTISSEMENT BIS !!
Le systeme est valable pour empecher le passage d'un terrain à un autre.
Le screen que j'ai posté sur le topic sus-mentionné et les remarques qui s'y rapportent sont toujours d'actualité !!
Même chose, pour pallier à ça, utiliser des events de blocage avec l'interrupteur comme declencheur.
Merci à ceux qui ont lu !!
Et voila pour les autres :
Démo pour les paresseux !!
ASHKA