Username:

Password:


collapse
Who's Online
  • Dot Invités: 6
  • Dot Caché: 0
  • Dot Membres: 0

There aren't any users online.

* Shoutbox
Refresh History
  • kriss: oui.. je dois faire des demandes pour que google refasse des analyse du site afin de "voir" s'il est tjr malveillant
    Dcembre 08, 2011, 22:47:27
  • Leopold: Cool! Mais Firefox me le déclare toujours malveillant...
    Dcembre 08, 2011, 22:30:32
  • kriss: réouverture du forum !
    Dcembre 06, 2011, 00:48:58
  • Fabien: Coucou facto!! Trop bon de repasser ici :)
    Septembre 25, 2011, 18:06:22
  • Krän: aye ! ^^
    Aot 21, 2011, 23:43:29
  • RPG-Man: lol manu
    Aot 20, 2011, 00:24:00
  • RPG-Man: JE SUIS REVENU MOUHAHA
    Aot 20, 2011, 00:22:26
  • Manucyan: Ca dit quoi un ivrogne dans le noir ? "hé... t'es qui là ?" xd
    Mai 07, 2011, 18:11:20
  • Krän: Il est 2h46 et tout est calme ! :)
    Mai 05, 2011, 01:47:01
  • Manucyan: La tronche du bestiaire ? Un pokédex ! xd
    Avril 30, 2011, 21:18:09
  • Manucyan: désolé je pensais que tout le monde connaissait le phénomène du rickroll (cf wikipédia)
    Avril 30, 2011, 14:08:48
  • kriss: ca merite un ban pour ce lien oO
    Avril 30, 2011, 12:29:51
  • RPG-Man: Sale vilain
    Avril 30, 2011, 11:26:31
  • Krän: Never gonna give u up, never gonna let u dooowwwn ...
    Avril 28, 2011, 20:29:20
  • kriss: en effet mais ce n'est pas normal.. il y a un bug que je dois trouver ^^
    Avril 25, 2011, 10:30:16
  • Leopold: Pour la mise à jour, on peut cliquer sur "Refresh" (deux flèches vertes) ou sur "History" (pendule).
    Avril 22, 2011, 21:31:57
  • RPG-Man: Manque plus qu'elle se mette à jour toute seule quand on ajoute un message et c'est le must !
    Avril 21, 2011, 20:29:39
  • RPG-Man: le shootbox CAY LE BIEN
    Avril 21, 2011, 20:29:14
  • kriss: on appel ca une shootbox :p
    Avril 18, 2011, 16:47:13
  • Manucyan: hé mais c'est marrant !
    Avril 17, 2011, 18:03:46

The Factory » ATELIER » OUTILS DE DEVELOPPEMENT » Kits de jeux » [Tuto]Une façon de gerer de la 2D isométrique
Pages: [1]
« sujet précédent | | sujet suivant »
Imprimer
Auteur Fil de discussion: [Tuto]Une façon de gerer de la 2D isométrique  (Lu 258 fois)
kriss
Architecte
Savant
*
Hors ligne Hors ligne

Messages: 4447


Don Quichotte de l'orthographe

krisss666@msn.com
Voir le profil Courriel
[Tuto]Une façon de gerer de la 2D isométrique
« le: Aot 16, 2009, 23:50:39 »

Je refais un topic de synthese sur le script MGCaladtogel, tout ce qui est ici est un copié/collé de ses posts.
Si vous avez des questions / demande d'aide, merci de poster sur le lien d'origine : Une façon de gérer de la 2D isométrique



J'ai fait un petit script permettant de gérer certaines cartes en "presque" 2D-isométrique.
"Presque" en 2D-isométrique car les angles ne sont pas exactement à 120°, j'ai utilisé la méthode du tutorial de Titania.

Le maillage vis-à-vis des carreaux de tiles doit être comme ça :


Pour l'instant le script prend en compte ;
- la gestion des déplacements non case par case
- la possibilité de déplacement dans les 8 directions (activable/désactivable par interrupteur)
- la possibilité de courir en gardant B appuyé (activable/désactivable), menu avec Z
- la possibilité de sauter avec le bouton A (activable/désactivable)


Je suis parti d'un constat : l'isométrie sert à faire des cartes visuellement plus impressionnantes. C'est donc juste une histoire de rendu graphique. J'ai donc eu l'idée de séparer le rendu des cartes des données intrinsèques.
En gros, tous les personnages et évènements évoluent sur une carte classique en allant de case en case vers le haut, la gauche, la droite, ou le bas. En revanche l'affichage est en isométrique, à partir d'une seconde carte dessinée en isométrique.

Il va donc falloir faire deux cartes.
Tout d'abord choisir les dimensions de la carte de données, et créer les contours de la carte en isométrie à partir de ces dimensions. L'origine théorique de la carte (normalement en haut à gauche) doit être placée en haut.

exemple pour une carte 20*16


Si la somme hauteur + largeur de la carte de données est impaire, la hauteur de la carte en isométrique ne sera pas divisible par 32 et il faudra alors arrondir les dimensions au tile supérieur en plaquant la carte en isométrique en haut.

exemple pour une carte 19*16 (bon, d'accord ça n'existe pas, mais c'est pour le principe)


Ensuite vous dessinez votre carte en isométrique comme vous voulez, avec les différentes couches comme il faut bien pour les histoires de priorités de superposition.

L'étape suivante consiste à créer la carte de données en tant que fille de la carte isométrique, et remplir par exemple sa première couche d'éléments qui vont définir la passabilité et les autres données des cases correspondantes sur la carte isométrique (il faut essayer de faire une sorte de rotation à 45° pour bien placer les carreaux).
Par exemple j'ai pris le premier tileset et je me suis servi d'un élément impassable (le marron de la tente) pour définir les endroits inaccessibles sur la carte isométrique : j'aurais pu prendre n'importe quel autre tile impassable.
Je me suis également servi des hautes herbes pour définir des cases "obscurcissantes".



Ensuite tous les évènements seront placés sur cette carte de données.
Les effets de panoramas et brouillards, faisant plutôt partie du "visuel", sont à intégrer dans le chipset de la carte en isométrique.
« Dernière édition: Aot 17, 2009, 00:14:58 par kriss » Journalisée

La plus vieille et la plus forte des émotions humaines est la peur, et la plus vieille et la plus forte peur est celle de l'inconnue
- H.P LOVECRAFT -
Projet en cours: MONOLITHE
http://rpgmakerxp-factory.net/forum/index.php?topic=10561.0
kriss
Architecte
Savant
*
Hors ligne Hors ligne

Messages: 4447


Don Quichotte de l'orthographe

krisss666@msn.com
Voir le profil Courriel
Re : [Tuto]Une façon de gerer de la 2D isométrique
« Répondre #1 le: Aot 16, 2009, 23:58:35 »

Evidemment, il y a un script à ajouter comme d'habitude au-dessus de main.
Ce n'est pas de la programmation difficile, c'est surtout des modifications de tout ce qui touche l'affichage (tous les screen_x, screen_y, screen_z, display_x, display_y, les histoires de scrolling...). Le voici :
Script de base : ajouter au dessus de Main

Code:
#---------------------------------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------------------
# ● Script 2D_ISO, créé par MGCaladtogel pour la communauté rpgmakerxp-factory.net
#---------------------------------------------------------------------------------------------------------------
#==============================================================================
# ■ Ajouts, modifications des classes d'origine
#
# indications : $game_map désigne la carte de données
#               $game_map_iso désigne la carte en 2D-isométrique
#==============================================================================

#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ● Le scrolling doit s'effectuer en fonctions des dimensions de la carte
  #     en isométrique
  #--------------------------------------------------------------------------
  def scroll_down(distance)
    corr = (($game_map.height + $game_map.width)%2 == 0 ? 0 : 4*16)
    @display_y = [@display_y + distance, 128*$game_map_iso.height - 4*480 - corr].min
  end
  #--------------------------------------------------------------------------
  def scroll_right(distance)
    @display_x = [@display_x + distance, 128*$game_map_iso.width - 4 * 640].min
  end
end

#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ● On change les coordonnées d'affichage des characters à l'écran
  #--------------------------------------------------------------------------
  def screen_x
    return  (@real_x - @real_y)/4 + 32*$game_map.height - 0 - $game_map.display_x/4
  end
  #--------------------------------------------------------------------------
  def screen_y
    y = (@real_y + @real_x) / 8 + 22 - $game_map.display_y/4
    if @jump_count >= @jump_peak
      n = @jump_count - @jump_peak
    else
      n = @jump_peak - @jump_count
    end
    return y - (@jump_peak * @jump_peak - n * n) / 2
  end
  #--------------------------------------------------------------------------
  def screen_z(height = 0)
    if @always_on_top
      return 999
    end
    z = screen_y
    if @tile_id > 0
      return z + $game_map_iso.priorities[@tile_id] * 32
    else
      return z + ((height > 32) ? 31 : 0)
    end
  end
end

#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  def center(x, y)
    max_x = ($game_map.width - 20) * 128
    max_y = ($game_map.height - 15) * 128
    max_xy = [max_x, max_y].max
    $game_map.display_x = 2*max_xy
    $game_map.display_y = 2*max_xy
  end
  #--------------------------------------------------------------------------
  # ● Les commandes directionnelles en diagonale sont activées, et on s'arrange
  #     pour que le scrolling se passe bien
  #--------------------------------------------------------------------------
  def update
    last_moving = moving?
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
      case Input.dir8
      when 1..2
        move_down
      when 3
        move_right
      when 4
        move_left
      when 7
        move_left
      when 6
        move_right
      when 8..9
        move_up
      end
    end
    last_real_x = @real_x
    last_real_y = @real_y
    super
    disp_y = screen_y + $game_map.display_y/4
    disp_x = screen_x + $game_map.display_x/4
    if CENTER_Y - (4*disp_y - $game_map.display_y) < 0
      $game_map.scroll_down(4*disp_y - $game_map.display_y - CENTER_Y)
    end
    if CENTER_X - (4*disp_x - $game_map.display_x) > 0
      $game_map.scroll_left(CENTER_X - (4*disp_x - $game_map.display_x))
    end
    if CENTER_X - (4*disp_x - $game_map.display_x) < 0
      $game_map.scroll_right(4*disp_x - $game_map.display_x - CENTER_X)
    end
    if CENTER_Y - (4*disp_y - $game_map.display_y) > 0
      $game_map.scroll_up(CENTER_Y - (4*disp_y - $game_map.display_y))
    end
    unless moving?
      if last_moving
        result = check_event_trigger_here([1,2])
        if result == false
          unless $DEBUG and Input.press?(Input::CTRL)
            if @encounter_count > 0
              @encounter_count -= 1
            end
          end
        end
      end
      if Input.trigger?(Input::C)
        check_event_trigger_here([0])
        check_event_trigger_there([0,1,2])
      end
    end
  end
end

#==============================================================================
# ■ Scene_Title
#==============================================================================
class Scene_Title
  alias main_orig main
  #--------------------------------------------------------------------------
  # ● Dans MapInfos on va trouver l'identité de la carte parente à la carte
  #     de données (donc l'id de la carte en iso)
  #--------------------------------------------------------------------------
  def main
    $data_map_infos        = load_data("Data/MapInfos.rxdata")
    main_orig
  end
end

#==============================================================================
# ■ Spriteset_Map
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● On va associer à la tilemap, qui gère l'affichage de la carte à l'écran,
  #     les données de la carte en 2D-isométrique
  #--------------------------------------------------------------------------
  def initialize
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    @tilemap = Tilemap.new(@viewport1)
    map_infos = $data_map_infos[$game_map.map_id]
    $game_map_iso = Game_Map.new
    $game_map_iso.setup(map_infos.parent_id)
    @tilemap.tileset = RPG::Cache.tileset($game_map_iso.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map_iso.data
    @tilemap.priorities = $game_map_iso.priorities
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    @weather = RPG::Weather.new(@viewport1)
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    @timer_sprite = Sprite_Timer.new
    update
  end
  #--------------------------------------------------------------------------
  # ● Attention : pour ma carte test j'ai fait en sorte que le panorama bouge
  #     de la même façon que la tilemap.
  #     Pour retrouver le déplacement d'origine des panoramas, il faut changer :
  #       @panorama.ox = $game_map.display_x / 4
  #       @panorama.oy = $game_map.display_y / 4
  #     en :
  #       @panorama.ox = $game_map.display_y / 8
  #       @panorama.oy = $game_map.display_y / 8
  #--------------------------------------------------------------------------
  def update
    if @panorama_name != $game_map_iso.panorama_name or
       @panorama_hue != $game_map_iso.panorama_hue
      @panorama_name = $game_map_iso.panorama_name
      @panorama_hue = $game_map_iso.panorama_hue
      if @panorama.bitmap != nil
        @panorama.bitmap.dispose
        @panorama.bitmap = nil
      end
      if @panorama_name != ""
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
      end
      Graphics.frame_reset
    end
    if @fog_name != $game_map_iso.fog_name or @fog_hue != $game_map_iso.fog_hue
      @fog_name = $game_map_iso.fog_name
      @fog_hue = $game_map_iso.fog_hue
      if @fog.bitmap != nil
        @fog.bitmap.dispose
        @fog.bitmap = nil
      end
      if @fog_name != ""
        @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      end
      Graphics.frame_reset
    end
    @tilemap.ox = $game_map.display_x / 4
    @tilemap.oy = $game_map.display_y / 4
    @tilemap.update
    @panorama.ox = $game_map.display_x / 4
    @panorama.oy = $game_map.display_y / 4
    @fog.zoom_x = $game_map_iso.fog_zoom / 100.0
    @fog.zoom_y = $game_map_iso.fog_zoom / 100.0
    @fog.opacity = $game_map_iso.fog_opacity
    @fog.blend_type = $game_map_iso.fog_blend_type
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
    @fog.tone = $game_map.fog_tone
    for sprite in @character_sprites
      sprite.update
    end
    @weather.type = $game_screen.weather_type
    @weather.max = $game_screen.weather_max
    @weather.ox = $game_map.display_x / 4
    @weather.oy = $game_map.display_y / 4
    @weather.update
    for sprite in @picture_sprites
      sprite.update
    end
    @timer_sprite.update
    @viewport1.tone = $game_screen.tone
    @viewport1.ox = $game_screen.shake
    @viewport3.color = $game_screen.flash_color
    @viewport1.update
    @viewport3.update
  end
end

#==============================================================================
# ■ Interpreter
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # ● Commande : "Modifier les propriétés de la carte..."
  #--------------------------------------------------------------------------
  def command_204
    case @parameters[0]
    when 0
      $game_map_iso.panorama_name = @parameters[1]
      $game_map_iso.panorama_hue = @parameters[2]
    when 1
      $game_map_iso.fog_name = @parameters[1]
      $game_map_iso.fog_hue = @parameters[2]
      $game_map_iso.fog_opacity = @parameters[3]
      $game_map_iso.fog_blend_type = @parameters[4]
      $game_map_iso.fog_zoom = @parameters[5]
      $game_map_iso.fog_sx = @parameters[6]
      $game_map_iso.fog_sy = @parameters[7]
    when 2
      $game_map_iso.battleback_name = @parameters[1]
      $game_temp.battleback_name = @parameters[1]
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ● Commande : "Modifier le ton du brouillard..."
  #--------------------------------------------------------------------------
  def command_205
    $game_map_iso.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
    return true
  end
  #--------------------------------------------------------------------------
  # ● Commande : "Modifier l'opacité du brouillard..."
  #--------------------------------------------------------------------------
  def command_206
    $game_map_iso.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
    return true
  end
end

Add-on : ajouter entre Main et script de base

Attention, ce script réquisitionne des interrupteurs ! : voir ce lien pour plus de précisions

Ajouts :
- la gestion des déplacements non case par case
- la possibilité de déplacement dans les 8 directions (activable/désactivable par interrupteur)
- la possibilité de courir en gardant B appuyé (activable/désactivable), menu avec Z
- la possibilité de sauter avec le bouton A (activable/désactivable)

Add on : (script trop long)
[attachment=1]

Et c'est tout.


version png agrandie

La démo est là : http://www.megaupload.com/?d=AYHE6DJJ
Lien de la démo sur le forum



Aucun script ne pourra faire que le héros marche parallèlement aux maison (ce n'est pas du 45° ni vraiment de l'iso).Pour pallier à ce problème, voici une "astuce"



Prendre un screen et l'afficher dans un logiciel de dessin.
Ajouter une grille par dessus afin de repérer les cases en iso : Modèle de grille
Mettre des non-passabilités comme cela :



Après il y a juste à compter les cases à partir de l'origine (en rouge).

L'autre option consiste à placer des cases non passables à vue de nez puis tester la carte et modifier le cas échéant.


Synthese en cours ... la suite plus tard
« Dernière édition: Aot 17, 2009, 00:17:35 par kriss » Journalisée

La plus vieille et la plus forte des émotions humaines est la peur, et la plus vieille et la plus forte peur est celle de l'inconnue
- H.P LOVECRAFT -
Projet en cours: MONOLITHE
http://rpgmakerxp-factory.net/forum/index.php?topic=10561.0
Pages: [1]
Imprimer
« sujet précédent | | sujet suivant »
Aller à:  


Powered by SMF 1.1.15 | SMF © 2006-2009, Simple Machines

EN Theme by Nati

Page générée en 0.172 secondes avec 26 requêtes.
Chargement...
SimplePortal 2.3.2 © 2008-2010, SimplePortal