AccueilAccueil  PortailPortail  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  ConnexionConnexion  



Le deal à ne pas rater :
Pokémon EV06 : où acheter le Bundle Lot 6 Boosters Mascarade ...
Voir le deal

Partagez
 

 [VX] Gerer les reliefs et les ponts

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
ASHKA
Voyageur Lv.10
Voyageur Lv.10
avatar


Masculin Age : 41
Inscrit le : 04/12/2008
Messages : 383

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeMer 17 Déc 2008 - 17:53

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 :

[VX] Gerer les reliefs et les ponts Relief_01-91c190

Ne faite pas attention aux interrupteurs pour l'instant !!

Voila à quoi ressemble l'event du haut :

[VX] Gerer les reliefs et les ponts Relief_02-91c1da

Et voici pour l'event du bas :

[VX] Gerer les reliefs et les ponts Relief_03-91c1f4

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 :

[VX] Gerer les reliefs et les ponts Relief_04-91c432

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


Dernière édition par ASHKA le Sam 14 Fév 2009 - 11:25, édité 1 fois
Revenir en haut Aller en bas
Elezia
Roi des Lapinous
Roi des Lapinous
Elezia


Masculin Age : 33
Inscrit le : 11/10/2008
Messages : 2291

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeMer 17 Déc 2008 - 18:04

Ouah, voila un des scripts qui manquait à vx selon moi ^o^ super travail, je le testerais quand j'aurais un peu plus de temps.
Revenir en haut Aller en bas
Altair19
Voyageur Lv.10
Voyageur Lv.10
avatar


Masculin Age : 30
Inscrit le : 16/08/2008
Messages : 467

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeMer 17 Déc 2008 - 18:37

Très bon script et fonctionnel en plus ( j'ai testé ) C\\'est bien !
Revenir en haut Aller en bas
Invité
Invité
avatar



[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeMer 17 Déc 2008 - 18:42

O_O Au debut j'ai pas bien cormpis l'utilité, mais après reflexion, ça va m'aider enormement !
Merci, en plus les explications sont claires, très bien réaliser, bravo!
Revenir en haut Aller en bas
pattes
Templier Lv.15
Templier Lv.15
pattes


Masculin Age : 30
Inscrit le : 29/11/2008
Messages : 1272

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeMer 17 Déc 2008 - 22:01

Merci beaucoup ASHKA, je metonne que personne ait demandé avant moi'^^.Je le prends bin sur Wink

EDIT: J'ai testé génial.A part que le hero marche sur l'eau en descendant les marches en haut de la map mais pas grave merci Ahska Wink

REEDIT: Je l'ai mit sur mon projet et...very dommage, il est pas compatible avec ABS x).Je vais pas pouvoir le prendre finalement mais c'est un chef d'oeuvre ASHKA!
Revenir en haut Aller en bas
ASHKA
Voyageur Lv.10
Voyageur Lv.10
avatar


Masculin Age : 41
Inscrit le : 04/12/2008
Messages : 383

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeMer 17 Déc 2008 - 22:29

Bah, c'est une démo pour montrer qu'on peux modifier in-game la passabilité du terrain ...
Oui, il marche sur l'eau, preuve que ça fonctionne !!

ASHKA
Revenir en haut Aller en bas
Darksmile
Maître du destin
Maître du destin
Darksmile


Masculin Age : 28
Inscrit le : 05/11/2008
Messages : 2955

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeJeu 18 Déc 2008 - 0:36

Ça va sûrement me servir, merci du partage!
Revenir en haut Aller en bas
jebbou
Doyen
Doyen
jebbou


Masculin Age : 45
Inscrit le : 20/08/2008
Messages : 2485

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeJeu 18 Déc 2008 - 1:39

Génial ton truc, et ca va pas mal plus loin que ce dont on avait discuté. J'ai mis quelque temps à comprendre que tu ne changes pas la passabilité pour les ponts, tu ne fais que mettre le chara au dessus de tout pendant un moment! ^^

Bien joué!

Jebbou
Revenir en haut Aller en bas
Invité
Invité
avatar



[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeJeu 18 Déc 2008 - 8:33

moi ce que je trouve con
c'est que cela n'avait pas été de base ...

car je trouve ce script plus qu'utile mais surtout donnant du réalisme

merci pour le partage
Revenir en haut Aller en bas
ASHKA
Voyageur Lv.10
Voyageur Lv.10
avatar


Masculin Age : 41
Inscrit le : 04/12/2008
Messages : 383

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeJeu 18 Déc 2008 - 9:44

Oui, c'est dommage qu'il faille en passer par ça ...
Mais ça reste du bricolage, et les pnj posent un probleme qu'il sera difficile de regler "simplement".
L'idéal serait d'avoir une sorte d'AMS ultimate, comme le script XP de Zeus81, mais c'est lourd aussi à mettre en place ...

@Jebbou : Explication technique :
( Ca t'interessera surement plus que les autres ... )

Dans l'editeur, on a trois types de passabilités :
- Passable.
- Obstacle.
- Affichage haut.

En réalité, seul les deux premiers releve de la passabilité, voila comment "passable?" utilise l'affichage haut :

Code:
      next if pass & 0x10 == 0x10          # *: Does not affect passage

En gros, il s'en moque ...

Cette configuration de l'editeur est aussi utilisé par les "tilemap", c'est-à-dire, l'assemblage des tiles en map d'apres ce qu'on a defini dans l'editeur.
Ces trois informations servent à definir la priorité d'affichage :

Manuel : section Tilemap a écrit:
The Z-coordinate of each sprite used to create a tilemap is fixed at a specific value.

- A tile that should be displayed under the character has a Z coordinate of 0.
- A tile that should be displayed over the character has a Z coordinate of 200. (RGSS2)

Keep these rules in mind when setting the Z-coordinates of any map characters.

Deux possibilités :
Soit sous le héros, soit au dessus.
( Les obstacles sont sous le héros, mais on ne le voit pas puisqu'on ne va pas sur la case !! )

On n'a pas la definition de la classe "Tilemap", et de toutes façons, ça n'aurait pas été simple de modifier à volonté la priorité d'affichage des tiles ...
Il n'y avait qu'une solution : Modifier celle du player !!

ASHKA
Revenir en haut Aller en bas
jebbou
Doyen
Doyen
jebbou


Masculin Age : 45
Inscrit le : 20/08/2008
Messages : 2485

[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitimeJeu 18 Déc 2008 - 17:53

C'est rusé ^^
Revenir en haut Aller en bas
Contenu sponsorisé




[VX] Gerer les reliefs et les ponts Empty
MessageSujet: Re: [VX] Gerer les reliefs et les ponts   [VX] Gerer les reliefs et les ponts Icon_minitime

Revenir en haut Aller en bas
 

[VX] Gerer les reliefs et les ponts

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

 Sujets similaires

-
» Gerer la transparence d'une animation(le fichier)

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Maker VX :: Entraide :: Scripts :: Scripts VX - RGSS2 :: Carte et HUDs-
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Forum gratuit