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
#---------------------------------------------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------------------
# ● 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 agrandieLa démo est là :
http://www.megaupload.com/?d=AYHE6DJJLien 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 grilleMettre 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