Partagez
Aller en bas
avatar
ASHKA
Membre

Nombre de messages : 242
Age : 36
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008

Gerer les reliefs et les ponts ( entre autres )

le Mer 17 Déc 2008 - 20:33
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)
    when "A2"
      min = 2816 + (((y * 8) + x) * 48)
    when "A3"
      min = 4352 + (((y * 8) + x) * 48)
    when "A4"
      min = 5888 + (((y * 8) + x) * 48)
    when "A5"
      min = 1536 + ((y * 8) + x)
    when "B"
      min = 0 + ((y * 8) + x)
    when "C"
      min = 256 + ((y * 8) + x)
    when "D"
      min = 512 + ((y * 8) + x)
    when "E"
      min = 768 + ((y * 8) + x)
    end
    for tile_id in min..(min + 47)
      $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
avatar
Gummy
Staffeux retraité

Nombre de messages : 2666
Age : 27
Localisation : Belgique
Distinction : Modérateur imprévisible

Papy Lolo' [Nabots Nimousse]


Date d'inscription : 27/01/2008

Re: Gerer les reliefs et les ponts ( entre autres )

le Mer 17 Déc 2008 - 21:48
Euh... Fallait y penser =)
Je n'ai qu'une chose à dire, respect, et merci du partage ^^
avatar
Berka
Administrateur

Nombre de messages : 1831
Age : 28
Localisation : Paris
Distinction : rubyste déglingué
9ème dan en scripting-no-jutsu

Nouveau Justine Beber ;P
Date d'inscription : 16/12/2007
http://rpgruby.olympe-network.com

Re: Gerer les reliefs et les ponts ( entre autres )

le Mer 17 Déc 2008 - 22:07
joli...très joli !

mais ce qui m'intéresse surtout, c'est:
Code:
2048 + (((y * 8) + x) * 48)

ca peut m'etre utile pour un script en développement... a suivre Wink
avatar
ASHKA
Membre

Nombre de messages : 242
Age : 36
Localisation : Omnipresent !!
Distinction : aucune
Date d'inscription : 28/10/2008

Re: Gerer les reliefs et les ponts ( entre autres )

le Mer 17 Déc 2008 - 23:02
Ravi d'etre utile, d'une maniere ou d'une autre !!
( Surtout que ça n'a pas été facile de referencer toutes les "tile_id" ... )

ASHKA
avatar
kordarr
Modérateur

Nombre de messages : 1838
Age : 28
Localisation : île de la réunion, Le Tampon.
Distinction : Auto-proclamé sex-symbol de la commu'
Frère jumeau de Jonathan ( Secret Story )
Exhibitionniste en herbe
[Mist' & Coco' Smile]
Fan n°1 de Coco'
Psychopathe en chef
Date d'inscription : 05/11/2008

Re: Gerer les reliefs et les ponts ( entre autres )

le Mer 17 Déc 2008 - 23:05
C'est plut^to intéressant ça permet pas mal de possibilité, mais c'est pas facile à configurer...

Bravo, ça c'est du taff bien fait...



ps: @berka...2048 + (((y * Cool + x) * 48) :gné:
avatar
blar
Membre

Nombre de messages : 18
Age : 39
Localisation : La Terre
Distinction : aucune
Date d'inscription : 08/12/2008
http://wi.gw-team.com

Re: Gerer les reliefs et les ponts ( entre autres )

le Jeu 18 Déc 2008 - 9:26
oui sacré taff

et cela va servir à plus d'un !
Contenu sponsorisé

Re: Gerer les reliefs et les ponts ( entre autres )

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum