设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 987|回复: 4
打印 上一主题 下一主题

[有事请教] ace mode7人物行走图扁平与直立的转换,悬赏【5v】

[复制链接]

Lv1.梦旅人

史莱姆的信徒
12-B

梦石
0
星屑
53
在线时间
368 小时
注册时间
2013-8-14
帖子
1011
跳转到指定楼层
1
发表于 2014-3-25 19:21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
需要:人物在地面时,是扁平的,即不需要3D效果;在墙面时,(假设墙面可通行)是3D的。或者在标签为6的区域扁平,在标签为5的区域直立……诸如此类,就是可控制角色行走图的变化。

代码如下,如果有基佬愿意接,我就去发悬赏(直接发不能收回V实在坑 不够可以加,最多11V

不胜感谢,即使你只是顶了下帖。
  1. #====================================================================
  2. # Mode 7 Ace
  3. # v.1.7
  4. # Auteur : MGC
  5. #
  6. # Il s'agit d'un script de mode 7 basique pour RMVX Ace.
  7. #
  8. # - Permet une inclinaison de la carte de 0° à 89°
  9. # - Toute la carte est inclinée, sans relief. Seuls les évènements
  10. #   paraissent dressés verticalement.
  11. # - L'effet de colorisation à l'horizon est personnalisable.
  12. # - Les tiles animés sont supportés, ainsi que le bouclage de la carte.
  13. # - possibilité de zoomer (de 1:8 à 8:1) quand le mode 7 est activé.
  14. #
  15. # IMPORTANT : SI VOUS RENCONTREZ DU LAG, VEUILLEZ VOUS ASSURER D'AVOIR
  16. # DECOCHER "REDUCE SCREEN FLICKERING" (F1).
  17. #
  18. # Nécessite :
  19. # - le fichier MGC_Mode7_Ace_1_6.dll à la racine du projet
  20. # - les 3 fichiers graphiques suivants, déposés dans Pictures/ :
  21. #         - autotiles_data.png
  22. #         - autotiles_data_small.png
  23. #         - autotiles_data_xsmall.png
  24. #
  25. # Configuration :
  26. # - MODE7_MAPS_ID : Contient la liste des id des cartes pour lesquelles
  27. #         le mode 7 est appliqué dès l'entrée sur ces cartes
  28. # - MODE7_DEFAULT_ZOOM : valeur de zoom par défaut qui s'applique dès le
  29. #         passage en mode 7. Compris entre 0.125 et 8.0.
  30. # - MODE7_DEFAULT_ANGLE : valeur d'angle d'inclinaison par défaut qui
  31. #         s'applique dès le passage en mode 7. Compris entre 0 et 89.
  32. # - MODE7_VIEW_LIMIT : nombre de tiles supplémentaires à afficher (en plus
  33. #         des 13 pour la vue normale de la carte en 544 * 416) avant l'horizon.
  34. # - MODE7_FADING_DISTANCE : nombre de tiles avant l'horizon subissant un
  35. #         dégradé de ton et/ou d'opacité.
  36. # - MODE7_FADING_TONE : composantes de couleur R, G, B vers lesquelles tend
  37. #         le dégradé de ton à l'horizon. Chaque composantes peut varier
  38. #         entre -255 et 255.
  39. # - MODE7_FADING_OPACITY : opacité vers laquelle tend le dégradé d'opacité ton
  40. #         à l'horizon. Compris entre 255 (pas de dégradé d'opacité) et 0.
  41. # - MODE7_SCAN_STEP : méthode de rafraîchissement de l'écran :
  42. #         - 1 : l'écran est entièrement redessiné en 1 frame. Déconseillé
  43. #               car extrêmement gourmand en ressources.
  44. #         - 2 : l'écran est redessiné en 2 frames (une ligne de l'écran sur
  45. #               deux est dessinée pour chaque frame).
  46. #         - 3 : l'écran est redessiné en 3 frames (une ligne de l'écran sur
  47. #               trois est dessinée pour chaque frame). Conseillé s'il y a
  48. #               trop de lag.
  49. # - MODE7_TERRAIN_TAGS : liste de valeurs de terrain tags pour lesquelles les
  50. #         tiles doivent être dessinés verticalement en mode 7. Si le paramètre
  51. #         MODE7_VERTICAL_TILES_TYPE n'a pas sa valeur égale à 0, utiliser
  52. #         plusieurs valeurs permet de séparer des regroupements de tiles
  53. #         contigus.
  54. # - MODE7_VERTICAL_TILES_TYPE :
  55. #         - 0 : aucun regroupement des tiles verticaux même si des tiles voisins
  56. #               ont le même terrain tag. Pour un tile avec un terrain tag
  57. #               configuré pour être dessiné verticalement, un sprite de
  58. #               dimensions 32*32 est créé. A priori aucun intérêt sans la
  59. #               rotation, car aura le même effet que la valeur 2 mais avec
  60. #               plus de sprites à l'écran, donc plus de ralentissements.
  61. #         - 1 : regroupement des tiles verticaux contigus sur la même colonne
  62. #               ayant le même terrain tag. Un sprite est créé par regroupement,
  63. #               le tile le plus bas du regroupement servant de base au sprite.
  64. #               A priori aucun intérêt sans la rotation, car aura le même effet
  65. #               que la valeur 3 mais avec plus de sprites à afficher.
  66. #         - 2 : regroupement des tiles verticaux contigus sur la même ligne
  67. #               ayant le même terrain tag. Un sprite est créé par regroupement,
  68. #               l'origine horizontale étant fixée au milieu du regroupement.
  69. #         - 3 : regroupement des tiles verticaux contigus ayant le même
  70. #               terrain tag, quelle que soit la ligne ou la colonne. Un sprite
  71. #               est créé par regroupement, le tile le plus bas du regroupement
  72. #               servant de base au sprite et l'origine horizontale étant fixée
  73. #               au milieu du regroupement. Valeur par défaut.
  74. # - MODE7_ALWAYS_DRAW_TILES_ON_MAP :
  75. #         - 0 : les tiles verticaux ne sont pas dessinés couchés sur la carte.
  76. #               Valeur par défaut.
  77. #         - 1 : les tiles verticaux sont également dessinés couchés sur la carte.
  78. #
  79. # Utilisation :
  80. # Commandes utilisables comme commandes d'évènement avec Script... :
  81. # - MGC.start_mode7 : lance le mode 7 pour la carte
  82. # - MGC.to_mode7_angle(nouvel angle, durée de transition)
  83. # - MGC.to_mode7_zoom(nouvelle valeur de zoom, durée de transition)
  84. # - MGC.end_mode7 : quitte le mode 7
  85. # - MGC.set_mode7_scan(nouvelle valeur) : modifie le paramètre MODE7_SCAN_STEP
  86. #
  87. # Vous pouvez ajouter des commandes dans le nom des cartes pour forcer le
  88. # paramétrage du mode 7 de la carte. Les paramètres dans le nom de la
  89. # carte sont prioritaires par rapport à ceux dans la partie CONFIGURATION
  90. # - [M7] : active le mode 7 pour la carte
  91. # - [Ax], où x est un entier entre 0 et 89 : angle de la carte
  92. # - [Zx], où x est un décimal entre 0.125 et 8.0 : zoom de la carte
  93. # - [FDx], où x est un entier positif : nombre de tiles avant l'horizon
  94. #         subissant un dégradé de ton et/ou d'opacité
  95. # - [FTx,y,z], où x, y et z sont des entiers entre -255 et 255 :
  96. #         composantes de couleur R, G, B vers lesquelles tend le dégradé
  97. #         de ton à l'horizon
  98. # - [FOx], où x est un entier entre 0 et 255 : opacité vers laquelle
  99. #         tend le dégradé d'opacité ton à l'horizon
  100. # Exemple :
  101. # My Worldmap [M7][A55][Z0.5][FD20][FT128,64,-32][FO128]
  102. #====================================================================
  103. module MGC
  104.   #--------------------------------------------------------------------------
  105.   # * CONFIGURATION
  106.   #--------------------------------------------------------------------------
  107.   MODE7_MAPS_ID = []
  108.   MODE7_DEFAULT_ZOOM = 1.0
  109.   MODE7_DEFAULT_ANGLE = 0
  110.   MODE7_VIEW_LIMIT = 26
  111.   MODE7_FADING_DISTANCE = 13
  112.   MODE7_FADING_TONE = Tone.new(64, 64, 128)
  113.   MODE7_FADING_OPACITY = 0
  114.   MODE7_SCAN_STEP = 2
  115.   MODE7_TERRAIN_TAGS = [1, 2] # [1.7]
  116.   MODE7_VERTICAL_TILES_TYPE = 3 # [1.7]
  117.   MODE7_ALWAYS_DRAW_TILES_ON_MAP = 0 # [1.7]
  118.   #--------------------------------------------------------------------------
  119.   # * Initialisation
  120.   #--------------------------------------------------------------------------
  121.   @mode7_zoom = 1.0
  122.   @mode7_active = false
  123.   #--------------------------------------------------------------------------
  124.   # * Lancement du mode 7
  125.   #--------------------------------------------------------------------------
  126.   def self.start_mode7
  127.     @end_mode7 = false
  128.     @spriteset.start_mode7
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # * Fin du mode 7
  132.   #--------------------------------------------------------------------------
  133.   def self.end_mode7
  134.     @end_mode7 = true
  135.     self.to_mode7_zoom(1.0, 1)
  136.   end
  137.   #--------------------------------------------------------------------------
  138.   # * Setter pour l'attribut spriteset
  139.   #--------------------------------------------------------------------------
  140.   def self.spriteset=(spriteset)
  141.     @spriteset = spriteset
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # * Initialisation des données du mode 7
  145.   #--------------------------------------------------------------------------
  146.   def self.initialize_mode7
  147.     self.mode7_angle = $game_system.mode7_angle ? $game_system.mode7_angle :
  148.     $game_map.get_default_mode7_angle
  149.     @mode7_angle_duration = 0
  150.     @mode7_zoom = $game_system.mode7_zoom ? $game_system.mode7_zoom :
  151.     $game_map.get_default_mode7_zoom
  152.     @mode7_zoom_incr = Math.log(@mode7_zoom) / Math.log(2)
  153.     @mode7_zoom_duration = 0
  154.     pivot = (Graphics.height >> 1) + 12
  155.     @mode7_data = [pivot, pivot.to_f / Graphics.height, 1.0, 1.0, 0,
  156.     Graphics.height, 0, 0, 0, 0]
  157.   end
  158.   #--------------------------------------------------------------------------
  159.   # * Change Map
  160.   #--------------------------------------------------------------------------
  161.   def self.start_change_map
  162.     self.mode7_angle = $game_map.get_default_mode7_angle
  163.     @mode7_angle_duration = 0
  164.     @mode7_zoom = $game_map.get_default_mode7_zoom
  165.     @mode7_zoom_incr = Math.log(@mode7_zoom) / Math.log(2)
  166.     @mode7_zoom_duration = 0
  167.     @change_map = true
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # * Is Changing Map ?
  171.   #--------------------------------------------------------------------------
  172.   def self.is_changing_map?
  173.     return @change_map
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # * End Change Map
  177.   #--------------------------------------------------------------------------
  178.   def self.end_change_map
  179.     @change_map = false
  180.   end
  181.   #--------------------------------------------------------------------------
  182.   # * Getter pour l'attribut mode7_data
  183.   #--------------------------------------------------------------------------
  184.   def self.mode7_data
  185.     return @mode7_data
  186.   end
  187.   #--------------------------------------------------------------------------
  188.   # * Getter pour l'attribut mode7_zoom
  189.   #--------------------------------------------------------------------------
  190.   def self.mode7_zoom
  191.     return @mode7_zoom
  192.   end
  193.   #--------------------------------------------------------------------------
  194.   # * Getter pour l'attribut mode7_angle
  195.   #--------------------------------------------------------------------------
  196.   def self.mode7_angle
  197.     return @mode7_angle
  198.   end
  199.   #--------------------------------------------------------------------------
  200.   # * Getter pour l'attribut mode7_active
  201.   #--------------------------------------------------------------------------
  202.   def self.mode7_active
  203.   return @mode7_active
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # * Setter pour l'attribut mode7_active
  207.   #--------------------------------------------------------------------------
  208.   def self.mode7_active=(flag)
  209.     $game_system.mode7_active = flag
  210.     @mode7_active = flag
  211.   end
  212.   #--------------------------------------------------------------------------
  213.   # * Setter pour l'attribut mode7_zoom
  214.   #--------------------------------------------------------------------------
  215.   def self.mode7_zoom=(zoom_value)
  216.     unless mode7_zoom == zoom_value
  217.       if zoom_value < 0.125 || zoom_value > 8.0 then return end
  218.       @mode7_zoom = zoom_value
  219.       $game_system.mode7_zoom = @mode7_zoom
  220.       $game_player.center($game_player.x, $game_player.y)
  221.     end
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # * Incrémentation de la valeur du zoom du mode 7
  225.   #--------------------------------------------------------------------------
  226.   def self.incr_mode7_zoom(val = 0.02)
  227.     @mode7_zoom_incr += val
  228.     new_zoom = 2 ** @mode7_zoom_incr
  229.     self.mode7_zoom = new_zoom
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # * Pour aller progressivement vers une nouvelle valeur de zoom du mode 7
  233.   #--------------------------------------------------------------------------
  234.   def self.to_mode7_zoom(new_zoom, duration)
  235.     unless mode7_zoom == new_zoom
  236.       if new_zoom < 0.125 || new_zoom > 8.0 then return end
  237.       @mode7_zoom_duration = duration
  238.       target_zoom_incr = Math.log(new_zoom) / Math.log(2)
  239.       @mode7_zoom_step = (target_zoom_incr - @mode7_zoom_incr) / duration
  240.       @target_mode7_zoom = new_zoom
  241.     end
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # * Setter pour l'attribut mode7_angle
  245.   #--------------------------------------------------------------------------
  246.   def self.mode7_angle=(new_angle)
  247.     unless new_angle == @mode7_angle
  248.       @mode7_angle = [[new_angle, 0].max, 89].min
  249.       @mode7_angle_real = @mode7_angle
  250.       $game_system.mode7_angle = @mode7_angle
  251.     end
  252.   end
  253.   #--------------------------------------------------------------------------
  254.   # * Autre setter pour l'attribut mode7_angle, ne réinitialisant pas @mode7_angle_real
  255.   #--------------------------------------------------------------------------
  256.   def self.set_mode7_angle(new_angle)
  257.     unless new_angle == @mode7_angle
  258.       @mode7_angle = [[new_angle, 0].max, 89].min
  259.       $game_system.mode7_angle = @mode7_angle
  260.     end
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # * Incrémentation de la valeur de l'angle du mode 7
  264.   #--------------------------------------------------------------------------
  265.   def self.incr_mode7_angle
  266.     @mode7_angle_real += @mode7_angle_step
  267.     self.set_mode7_angle(@mode7_angle_real.to_i)
  268.   end
  269.   #--------------------------------------------------------------------------
  270.   # * Pour aller progressivement vers une nouvelle valeur de l'angle du mode 7
  271.   #--------------------------------------------------------------------------
  272.   def self.to_mode7_angle(new_angle, duration)
  273.     unless @mode7_angle == new_angle
  274.       new_angle = [[new_angle, 0].max, 89].min
  275.       @mode7_angle_duration = duration
  276.       @mode7_angle_step = (new_angle - @mode7_angle).to_f / duration
  277.       @target_mode7_angle = new_angle
  278.     end
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # * Mise à jour du mode 7
  282.   #--------------------------------------------------------------------------
  283.   def self.update_mode7
  284.     if @mode7_active
  285.       if @mode7_zoom_duration > 0
  286.         @mode7_zoom_duration -= 1
  287.         if @mode7_zoom_duration == 0
  288.           self.mode7_zoom = @target_mode7_zoom
  289.         else
  290.           self.incr_mode7_zoom(@mode7_zoom_step)
  291.         end
  292.       elsif @mode7_angle_duration > 0
  293.         @mode7_angle_duration -= 1
  294.         if @mode7_angle_duration == 0
  295.           self.mode7_angle = @target_mode7_angle
  296.         else
  297.           self.incr_mode7_angle
  298.         end
  299.       elsif @end_mode7
  300.         @spriteset.end_mode7
  301.         @end_mode7 = false
  302.       end
  303.     end
  304.   end
  305.   #--------------------------------------------------------------------------
  306.   # * Vérifie si un effet est en cours
  307.   #--------------------------------------------------------------------------
  308.   def self.effect?
  309.     return @mode7_active && (@mode7_zoom_duration > 0 ||
  310.     @mode7_angle_duration > 0 || @end_mode7)
  311.   end
  312.   #--------------------------------------------------------------------------
  313.   # * Modifie la valeur de la méthode de rafraîchissement de l'écran
  314.   #--------------------------------------------------------------------------
  315.   def self.set_mode7_scan(new_value)
  316.     new_value = [[new_value, 1].max, 3].min
  317.     unless MODE7_SCAN_STEP == new_value
  318.       self.const_set(:MODE7_SCAN_STEP, new_value)
  319.     end
  320.   end
  321.   #==============================================================================
  322.   # ** MGC::Mode7_Map
  323.   #==============================================================================
  324.   class Mode7_Map
  325.     #--------------------------------------------------------------------------
  326.     # * Attributs
  327.     #--------------------------------------------------------------------------
  328.     attr_reader :viewport, :visible, :ox, :oy, :opacity, :blend_type, :color,
  329.     :tone, :wave_amp, :wave_length, :wave_speed, :wave_phase, :zoom, :map_data,
  330.     :flags
  331.     attr_accessor :bitmaps, :flash_data
  332.     attr_reader :alpha, :parameters
  333.     attr_reader :param_tiles # [1.7]
  334.     #--------------------------------------------------------------------------
  335.     # * Constantes
  336.     #--------------------------------------------------------------------------
  337.     RENDER = Win32API.new("MGC_Mode7_Ace_1_7", "renderMode7", "l", "l") # [1.6]
  338.     #--------------------------------------------------------------------------
  339.     # * Initialisation
  340.     #--------------------------------------------------------------------------
  341.     def initialize(viewport)
  342.       @viewport = viewport
  343.       self.bitmaps = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  344.       @map_data = 0
  345.       @flags = 0
  346.       self.flash_data = nil
  347.       @cx = Graphics.width >> 1
  348.       @cy = Graphics.height >> 1
  349.       @sprite_render = Sprite.new(viewport)
  350.       @render = Bitmap.new(Graphics.width, Graphics.height)
  351.       @sprite_render.bitmap = @render
  352.       @sprite_render.x = 0
  353.       @sprite_render.y = 0
  354.       @sprite_render.z = 0
  355.       [url=home.php?mod=space&uid=98379]@zoom[/url] = 1.0
  356.       @view_limit = MODE7_VIEW_LIMIT << 5
  357.       m7_data = Table.new(6, Graphics.height) # [1.7]
  358.       @parameters = [@render, 0, map_data, bitmaps,
  359.       Cache.picture('autotiles_data'), Cache.picture('autotiles_data_small'),
  360.       Cache.picture('autotiles_data_xsmall'), 0, 0, 0, 0, 0, 0, 0, 4096,
  361.       100, $game_map.loop_horizontal?, $game_map.loop_vertical?, MODE7_SCAN_STEP,
  362.       0, m7_data, 2048, 0, MGC.mode7_data[5], MGC.mode7_data[0], 0, 0, 0, 0, 0,
  363.       0, 0, 0, 0, 0, 0]
  364.       @parameters << $game_map.tileset.flags # 36 [1.7]
  365.       @parameters << MGC::MODE7_ALWAYS_DRAW_TILES_ON_MAP # 37 [1.7]
  366.       @parameters << MGC::MODE7_TERRAIN_TAGS # 48 [1.7]
  367.       refresh_fading
  368.       MGC.mode7_data[9] = m7_data
  369.       self.alpha = 0
  370.       self.visible = true
  371.       self.zoom = 1.0
  372.       self.ox = 0
  373.       self.oy = 0
  374.       self.opacity = 255
  375.       self.blend_type = 0
  376.       self.color = Color.new
  377.       self.tone = Tone.new
  378.       self.wave_amp = 0
  379.       self.wave_length = 180
  380.       self.wave_speed = 360
  381.       self.wave_phase = 0.0
  382.       @initialization = true
  383.       @param_tiles = [Bitmap.new(32, 32), bitmaps,
  384.       Cache.picture('autotiles_data'),
  385.       Cache.picture('autotiles_data_small'),
  386.       Cache.picture('autotiles_data_xsmall'), 0, [0, 0, 0]] # [1.7]
  387.     end
  388.     #--------------------------------------------------------------------------
  389.     # * Refresh Fading
  390.     #--------------------------------------------------------------------------
  391.     def refresh_fading
  392.       fading_dist = $game_map.get_default_fading_distance << 5
  393.       fading_begin = Graphics.height + @view_limit - fading_dist
  394.       @parameters[30] = fading_begin
  395.       @parameters[31] = fading_dist
  396.       @parameters[32] = $game_map.get_default_fading_tone.red.to_i
  397.       @parameters[33] = $game_map.get_default_fading_tone.green.to_i
  398.       @parameters[34] = $game_map.get_default_fading_tone.blue.to_i
  399.       @parameters[35] = $game_map.get_default_fading_opacity
  400.     end
  401.     #--------------------------------------------------------------------------
  402.     # * Refresh all the parameters dependent on the angle of slant
  403.     #--------------------------------------------------------------------------
  404.     def refresh_alpha
  405.       # angle of slant
  406.       alpha_rad = (Math::PI * alpha) / 180
  407.       cos_alpha_real = Math.cos(alpha_rad)
  408.       sin_alpha_real = Math.sin(alpha_rad)
  409.       cos_alpha = (2048 * cos_alpha_real).to_i
  410.       sin_alpha = (2048 * sin_alpha_real).to_i
  411.       distance_h = MGC.mode7_data[5]
  412.       pivot = MGC.mode7_data[0]
  413.       # h0,  z0 : intermediate values used to calculate the slope
  414.       h0 = (-distance_h * pivot * cos_alpha) / ((distance_h << 11) +
  415.       pivot * sin_alpha) + pivot
  416.       z0 = (distance_h << 11).to_f / ((distance_h << 11) + pivot * sin_alpha)
  417.       # slope
  418.       slope_value = (1.0 - z0) / (pivot - h0)
  419.       slope_value_map = (131072 * slope_value).to_i
  420.       corrective_value = 1.0 - pivot * slope_value
  421.       corrective_value_map = (131072 * corrective_value).to_i
  422.       last_line = ((-pivot - @view_limit) * zoom).to_i
  423.       height_limit = (distance_h * last_line * cos_alpha) /
  424.       ((distance_h << 11) - last_line * sin_alpha) + pivot
  425.       height_limit = [height_limit.to_i, 0].max
  426.       parameters[21] = cos_alpha
  427.       parameters[22] = sin_alpha
  428.       parameters[25] = slope_value_map
  429.       parameters[26] = corrective_value_map
  430.       parameters[27] = height_limit
  431.       parameters[29] = MODE7_SCAN_STEP
  432.       @need_refresh = true
  433.       MGC.mode7_data[3] = cos_alpha_real
  434.       MGC.mode7_data[4] = sin_alpha_real
  435.       MGC.mode7_data[6] = slope_value
  436.       MGC.mode7_data[7] = corrective_value
  437.       MGC.mode7_data[8] = height_limit     
  438.     end
  439.     #--------------------------------------------------------------------------
  440.     # * Setter pour l'attribut map_data
  441.     #--------------------------------------------------------------------------
  442.     def map_data=(new_map_data)
  443.       @map_data = new_map_data
  444.       parameters[2] = @map_data
  445.     end
  446.     #--------------------------------------------------------------------------
  447.     # * Setter pour l'attribut flags
  448.     #--------------------------------------------------------------------------
  449.     def flags=(new_flags)
  450.       @flags = new_flags
  451.       parameters[7] = @flags
  452.     end
  453.     #--------------------------------------------------------------------------
  454.     # * Setter pour l'attribut zoom
  455.     #--------------------------------------------------------------------------
  456.     def zoom=(new_zoom)
  457.       unless zoom == new_zoom
  458.         [url=home.php?mod=space&uid=98379]@zoom[/url] = new_zoom
  459.         parameters[14] = (4096.0 / new_zoom).to_i
  460.         MGC.mode7_data[2] = new_zoom
  461.         vox = @ox
  462.         @ox = nil
  463.         self.ox = vox
  464.         voy = @oy
  465.         @oy = nil
  466.         self.oy = voy
  467.         @need_refresh = true
  468.         parameters[29] = MODE7_SCAN_STEP
  469.         @need_refresh = true
  470.         last_line = ((-parameters[24] - @view_limit) * zoom).to_i
  471.         height_limit = (parameters[23] * last_line * parameters[21]) /
  472.         ((parameters[23] << 11) - last_line * parameters[22]) + parameters[24]
  473.         parameters[27] = [height_limit.to_i, 0].max
  474.         MGC.mode7_data[8] = parameters[27]
  475.       end
  476.     end
  477.     #--------------------------------------------------------------------------
  478.     # * Setter pour l'attribut alpha
  479.     #--------------------------------------------------------------------------
  480.     def alpha=(new_alpha)
  481.       unless new_alpha == alpha
  482.         [url=home.php?mod=space&uid=6553]@alpha[/url] = new_alpha
  483.         refresh_alpha
  484.       end
  485.     end
  486.     #--------------------------------------------------------------------------
  487.     # * Setter pour l'attribut shadow_opacity
  488.     #--------------------------------------------------------------------------
  489.     def shadow_opacity=(value)
  490.       @parameters[15] = [[value, 0].max, 255].min
  491.     end
  492.     #--------------------------------------------------------------------------
  493.     # * Setter pour l'attribut visible
  494.     #--------------------------------------------------------------------------
  495.     def visible=(flag)
  496.       @visible = flag
  497.       @sprite_render.visible = flag
  498.     end
  499.     #--------------------------------------------------------------------------
  500.     # * Setter pour l'attribut ox
  501.     #--------------------------------------------------------------------------
  502.     def ox=(new_ox)
  503.       new_ox = new_ox.to_i
  504.       unless new_ox == @ox
  505.         @ox = new_ox
  506.         @need_refresh = true
  507.         parameters[8] = @ox
  508.         parameters[29] = MODE7_SCAN_STEP
  509.       end
  510.     end
  511.     #--------------------------------------------------------------------------
  512.     # * Setter pour l'attribut oy
  513.     #--------------------------------------------------------------------------
  514.     def oy=(new_oy)
  515.       new_oy = new_oy.to_i
  516.       unless new_oy == @oy
  517.         @oy = new_oy
  518.         @need_refresh = true
  519.         parameters[9] = @oy
  520.         parameters[29] = MODE7_SCAN_STEP
  521.       end
  522.     end
  523.     #--------------------------------------------------------------------------
  524.     # * Setter pour l'attribut opacity
  525.     #--------------------------------------------------------------------------
  526.     def opacity=(new_opacity)
  527.       [url=home.php?mod=space&uid=316553]@opacity[/url] = new_opacity
  528.       @sprite_render.opacity = new_opacity
  529.     end
  530.     #--------------------------------------------------------------------------
  531.     # * Setter pour l'attribut blend_type
  532.     #--------------------------------------------------------------------------
  533.     def blend_type=(new_blend_type)
  534.       @blend_type = new_blend_type
  535.       @sprite_render.blend_type = new_blend_type
  536.     end
  537.     #--------------------------------------------------------------------------
  538.     # * Setter pour l'attribut color
  539.     #--------------------------------------------------------------------------
  540.     def color=(new_color)
  541.       [url=home.php?mod=space&uid=10453]@color[/url] = new_color
  542.       @sprite_render.color = new_color
  543.     end
  544.     #--------------------------------------------------------------------------
  545.     # * Setter pour l'attribut tone
  546.     #--------------------------------------------------------------------------
  547.     def tone=(new_tone)
  548.       @tone = new_tone
  549.       @sprite_render.tone = new_tone
  550.     end
  551.     #--------------------------------------------------------------------------
  552.     # * Setter pour l'attribut wave_amp
  553.     #--------------------------------------------------------------------------
  554.     def wave_amp=(new_wave_amp)
  555.       @wave_amp = new_wave_amp
  556.       @sprite_render.wave_amp = new_wave_amp
  557.     end
  558.     #--------------------------------------------------------------------------
  559.     # * Setter pour l'attribut wave_length
  560.     #--------------------------------------------------------------------------
  561.     def wave_length=(new_wave_length)
  562.       @wave_length = new_wave_length
  563.       @sprite_render.wave_length = new_wave_length
  564.     end
  565.     #--------------------------------------------------------------------------
  566.     # * Setter pour l'attribut wave_speed
  567.     #--------------------------------------------------------------------------
  568.     def wave_speed=(new_wave_speed)
  569.       @wave_speed = new_wave_speed
  570.       @sprite_render.wave_speed = new_wave_speed
  571.     end
  572.     #--------------------------------------------------------------------------
  573.     # * Setter pour l'attribut wave_phase
  574.     #--------------------------------------------------------------------------
  575.     def wave_phase=(new_wave_phase)
  576.       @wave_phase = new_wave_phase
  577.       @sprite_render.wave_phase = new_wave_phase
  578.     end
  579.     #--------------------------------------------------------------------------
  580.     # * Libération de l'instance
  581.     #--------------------------------------------------------------------------
  582.     def dispose
  583.       @render.dispose
  584.       @sprite_render.dispose
  585.       clear_vertical_tiles # [1.7]
  586.       @param_tiles[0].dispose
  587.     end
  588.     #--------------------------------------------------------------------------
  589.     # * Suppression des tiles verticaux [1.7]
  590.     #--------------------------------------------------------------------------
  591.     def clear_vertical_tiles
  592.       if @vertical_tiles
  593.         @vertical_tiles.each {|sprite| sprite.dispose}
  594.         @vertical_tiles.clear
  595.       end
  596.     end
  597.     #--------------------------------------------------------------------------
  598.     # * Retourne true si l'instance a été libérée
  599.     #--------------------------------------------------------------------------
  600.     def disposed?
  601.       return @render.disposed?
  602.     end
  603.     #--------------------------------------------------------------------------
  604.     # * Mise à jour, appelée normalement à chaque frame
  605.     #--------------------------------------------------------------------------
  606.     def update
  607.       if @visible
  608.         if MGC.is_changing_map?
  609.           refresh_fading
  610.           MGC.end_change_map
  611.         end
  612.         if parameters[18] != MODE7_SCAN_STEP
  613.           parameters[18] = MODE7_SCAN_STEP
  614.           parameters[19] = 0
  615.           parameters[29] = 0
  616.           @need_refresh = true
  617.         end
  618.         self.alpha = MGC.mode7_angle
  619.         self.zoom = MGC.mode7_zoom
  620.         if Graphics.frame_count & 31 == 0
  621.           parameters[10] += 1
  622.           parameters[10] %= 3
  623.           parameters[29] = MODE7_SCAN_STEP
  624.           unless @need_refresh
  625.             @need_refresh_anim = true
  626.           end
  627.         end
  628.         if parameters[29] > 0 && !@need_refresh && !@need_refresh_anim
  629.           @need_refresh = true
  630.         end
  631.         begin
  632.           if @need_refresh
  633.             parameters[19] += 1
  634.             if parameters[19] == parameters[18]
  635.               parameters[19] = 0
  636.             end
  637.             parameters[11] = 0
  638.             RENDER.call(parameters.__id__)
  639.             parameters[29] -= 1
  640.             if parameters[29] == 0
  641.               @need_refresh = false
  642.             end
  643.           elsif @need_refresh_anim
  644.             parameters[19] += 1
  645.             if parameters[19] == parameters[18]
  646.               parameters[19] = 0
  647.             end
  648.             parameters[11] = 1
  649.             RENDER.call(parameters.__id__)
  650.             parameters[29] -= 1
  651.             if parameters[29] == 0
  652.               @need_refresh_anim = false
  653.             end
  654.           end
  655.           if @initialization && parameters[29] == 0
  656.             @initialization = false
  657.           end
  658.         end while @initialization
  659.         @sprite_render.update
  660.         @vertical_tiles.each {|sprite| sprite.update} # [1.7]
  661.       end
  662.     end
  663.     #--------------------------------------------------------------------------
  664.     # * Flash des couches de la tilemap
  665.     #--------------------------------------------------------------------------
  666.     def flash(color, duration)
  667.       @sprite_render.flash(color, duration)
  668.     end
  669.     #--------------------------------------------------------------------------
  670.     # * Create vertical tiles [1.7]
  671.     #--------------------------------------------------------------------------
  672.     def create_vertical_tiles
  673.       unless @vertical_tiles
  674.         @vertical_tiles = []
  675.       end
  676.       clear_vertical_tiles
  677.       @vt_checked_tiles = Table.new($game_map.width, $game_map.height,
  678.       MGC::MODE7_TERRAIN_TAGS.size)
  679.       (0...$game_map.height).each {|iy|
  680.         (0...$game_map.width).each {|ix|
  681.           (0...3).each {|il|
  682.             terrain_tag = $game_map.terrain_tag_for_layer(ix, iy, il)
  683.             if terrain_tag > 0 && MGC::MODE7_TERRAIN_TAGS.include?(terrain_tag)
  684.               tag_index = MGC::MODE7_TERRAIN_TAGS.index(terrain_tag)
  685.               unless @vt_checked_tiles[ix, iy, tag_index] == 1
  686.                 @vt_found_tiles = []
  687.                 @vt_x_min = ix
  688.                 @vt_x_max = ix
  689.                 @vt_y_min = iy
  690.                 @vt_y_max = iy
  691.                 find_linked_tiles(ix, iy, terrain_tag, tag_index)
  692.                 v_tile = MGC::Vertical_Tile.new(self, @viewport)
  693.                 v_tile.x = 1 + @vt_x_max + @vt_x_min << 5 >> 1
  694.                 v_tile.y = 1 + @vt_y_max << 5
  695.                 v_tile.refresh_tile_data(@vt_found_tiles,
  696.                 @vt_x_min, @vt_x_max, @vt_y_min, @vt_y_max)
  697.                 @vertical_tiles << v_tile
  698.                 break
  699.               end
  700.             end
  701.           }
  702.         }
  703.       }
  704.       @vt_checked_tiles = nil
  705.     end
  706.     #--------------------------------------------------------------------------
  707.     # * Find linked tiles [1.7]
  708.     # param x : Integer
  709.     # param y : Integer
  710.     # param terrain_tag : Integer
  711.     # param tag_index : Integer
  712.     #--------------------------------------------------------------------------
  713.     def find_linked_tiles(x, y, terrain_tag, tag_index)
  714.       unless @vt_checked_tiles[x, y, tag_index] == 1
  715.         @vt_checked_tiles[x, y, tag_index] = 1
  716.         found = false
  717.         (0...3).each {|il|
  718.           if $game_map.terrain_tag_for_layer(x, y, il) == terrain_tag
  719.             unless found
  720.               found_tile = [x, y, [false, false, false]]
  721.               @vt_found_tiles << found_tile
  722.               found = true
  723.             end
  724.             found_tile[2][il] = true
  725.           end
  726.         }
  727.         if found
  728.           if x > @vt_x_max
  729.             @vt_x_max = x
  730.           end
  731.           if x < @vt_x_min
  732.             @vt_x_min = x
  733.           end
  734.           if y > @vt_y_max
  735.             @vt_y_max = y
  736.           end
  737.           if y < @vt_y_min
  738.             @vt_y_min = y
  739.           end
  740.           if MGC::MODE7_VERTICAL_TILES_TYPE & 1 == 1
  741.             if y < $game_map.height - 1
  742.               find_linked_tiles(x, y + 1, terrain_tag, tag_index)
  743.             end
  744.           end
  745.           if MGC::MODE7_VERTICAL_TILES_TYPE & 2 == 2
  746.             if x < $game_map.width - 1
  747.               find_linked_tiles(x + 1, y, terrain_tag, tag_index)
  748.             end
  749.           end
  750.           if MGC::MODE7_VERTICAL_TILES_TYPE == 3
  751.             if x > 0
  752.               find_linked_tiles(x - 1, y, terrain_tag, tag_index)
  753.             end
  754.             if y > 0
  755.               find_linked_tiles(x, y - 1, terrain_tag, tag_index)
  756.             end
  757.           end
  758.         end
  759.       end
  760.     end
  761.   end
  762. end

  763. #==============================================================================
  764. # ** Game_System
  765. #==============================================================================
  766. class Game_System
  767.   #--------------------------------------------------------------------------
  768.   # * Attributs
  769.   #--------------------------------------------------------------------------
  770.   attr_accessor :mode7_zoom, :mode7_angle, :mode7_active
  771. end

  772. #==============================================================================
  773. # ** Game_Map
  774. #==============================================================================
  775. class Game_Map
  776.   attr_accessor :start_mode7, :end_mode7
  777.   #--------------------------------------------------------------------------
  778.   # * Aliased methods
  779.   #--------------------------------------------------------------------------
  780.   unless @already_aliased_mgc_m7a
  781.     alias setup_mgc_m7a setup
  782.     alias set_display_pos_mgc_m7a set_display_pos
  783.     alias scroll_down_mgc_m7a scroll_down
  784.     alias scroll_left_mgc_m7a scroll_left
  785.     alias scroll_right_mgc_m7a scroll_right
  786.     alias scroll_up_mgc_m7a scroll_up
  787.     @already_aliased_mgc_m7a = true
  788.   end
  789.   #--------------------------------------------------------------------------
  790.   # * Setup
  791.   #--------------------------------------------------------------------------
  792.   def setup(map_id)
  793.     setup_mgc_m7a(map_id)
  794.     if is_mode7?
  795.       if MGC.mode7_active
  796.         MGC.start_change_map
  797.       end
  798.       self.start_mode7 = true
  799.     else
  800.       self.end_mode7 = true
  801.     end
  802.   end
  803.   #--------------------------------------------------------------------------
  804.   # * Check if the map is configured for mode 7
  805.   #--------------------------------------------------------------------------
  806.   def is_mode7?
  807.     return MGC::MODE7_MAPS_ID.include?(@map_id) ||
  808.     $data_mapinfos[@map_id].full_name[/\[M7\]/]
  809.   end
  810.   #--------------------------------------------------------------------------
  811.   # * Get default mode7 angle
  812.   #--------------------------------------------------------------------------
  813.   def get_default_mode7_angle
  814.     if $data_mapinfos[@map_id].full_name[/\[A(\d+)\]/]
  815.       return [[$1.to_i, 0].max, 89].min
  816.     else
  817.       return MGC::MODE7_DEFAULT_ANGLE
  818.     end
  819.   end
  820.   #--------------------------------------------------------------------------
  821.   # * Get default mode7 zoom
  822.   #--------------------------------------------------------------------------
  823.   def get_default_mode7_zoom
  824.     if $data_mapinfos[@map_id].full_name[/\[Z(\d+(?:\.\d+)*)\]/]
  825.       return [[$1.to_f, 0.125].max, 8.0].min
  826.     else
  827.       return MGC::MODE7_DEFAULT_ZOOM
  828.     end
  829.   end
  830.   #--------------------------------------------------------------------------
  831.   # * Get default fading distance
  832.   #--------------------------------------------------------------------------
  833.   def get_default_fading_distance
  834.     if $data_mapinfos[@map_id].full_name[/\[FD(\d{1,3})\]/]
  835.       return [$1.to_i, 0].max
  836.     else
  837.       return MGC::MODE7_FADING_DISTANCE
  838.     end
  839.   end
  840.   #--------------------------------------------------------------------------
  841.   # * Get default fading opacity
  842.   #--------------------------------------------------------------------------
  843.   def get_default_fading_opacity
  844.     if $data_mapinfos[@map_id].full_name[/\[FO(\d{1,3})\]/]
  845.       return [[$1.to_i, 0].max, 255].min
  846.     else
  847.       return MGC::MODE7_FADING_OPACITY
  848.     end
  849.   end
  850.   #--------------------------------------------------------------------------
  851.   # * Get default fading tone
  852.   #--------------------------------------------------------------------------
  853.   def get_default_fading_tone
  854.     if $data_mapinfos[@map_id].full_name[/\[FT(\-?\d{1,3}),(\-?\d{1,3}),(\-?\d{1,3})\]/]
  855.       red = [[$1.to_i, -255].max, 255].min
  856.       green = [[$2.to_i, -255].max, 255].min
  857.       blue = [[$3.to_i, -255].max, 255].min
  858.       return Tone.new(red, green, blue)
  859.     else
  860.       return MGC::MODE7_FADING_TONE
  861.     end
  862.   end
  863.   #--------------------------------------------------------------------------
  864.   # * Set Display Position
  865.   #--------------------------------------------------------------------------
  866.   def set_display_pos(x, y)
  867.     if MGC.mode7_active
  868.       if loop_horizontal?
  869.         @display_x = (x + width) % width
  870.       else
  871.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  872.           @display_x = (width - screen_tile_x) / 2
  873.         else
  874.           x_min = screen_tile_x * (1.0 / MGC.mode7_zoom - 1.0) / 2
  875.           x_max = width + screen_tile_x * ((1.0 - 1.0 / MGC.mode7_zoom) / 2 - 1)
  876.           x = [x_min, [x, x_max].min].max
  877.           @display_x = x
  878.         end
  879.       end
  880.       if loop_vertical?
  881.         @display_y = (y + height) % height
  882.       else
  883.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  884.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  885.         else
  886.           y_min = screen_tile_y * (1.0 / MGC.mode7_zoom - 1.0) * MGC.mode7_data[1]
  887.           y_max = height + screen_tile_y *
  888.           ((1.0 - 1.0 / MGC.mode7_zoom) * (1 - MGC.mode7_data[1]) - 1)
  889.           y = [y_min, [y, y_max].min].max
  890.           @display_y = y
  891.         end
  892.       end
  893.       @parallax_x = x
  894.       @parallax_y = y
  895.     else
  896.       set_display_pos_mgc_m7a(x, y)
  897.     end
  898.   end
  899.   #--------------------------------------------------------------------------
  900.   # * Scroll Down
  901.   #--------------------------------------------------------------------------
  902.   def scroll_down(distance)
  903.     if MGC.mode7_active
  904.       if loop_vertical?
  905.         @display_y += distance
  906.         @display_y %= @map.height
  907.         @parallax_y += distance if @parallax_loop_y
  908.       else
  909.         last_y = @display_y
  910.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  911.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  912.         else
  913.           max = height + screen_tile_y *
  914.           ((1.0 - 1.0 / MGC.mode7_zoom) * (1 - MGC.mode7_data[1]) - 1)
  915.           @display_y = [@display_y + distance, max].min
  916.         end
  917.         @parallax_y += @display_y - last_y
  918.       end
  919.     else
  920.       scroll_down_mgc_m7a(distance)
  921.     end
  922.   end
  923.   #--------------------------------------------------------------------------
  924.   # * Scroll Left
  925.   #--------------------------------------------------------------------------
  926.   def scroll_left(distance)
  927.     if MGC.mode7_active
  928.       if loop_horizontal?
  929.         @display_x += @map.width - distance
  930.         @display_x %= @map.width
  931.         @parallax_x -= distance if @parallax_loop_x
  932.       else
  933.         last_x = @display_x
  934.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  935.           @display_x = (width - screen_tile_x) / 2
  936.         else
  937.           min = screen_tile_x * (1.0 / MGC.mode7_zoom - 1.0) / 2
  938.           @display_x = [@display_x - distance, min].max
  939.         end
  940.         @parallax_x += @display_x - last_x
  941.       end
  942.     else
  943.       scroll_left_mgc_m7a(distance)
  944.     end
  945.   end
  946.   #--------------------------------------------------------------------------
  947.   # * Scroll Right
  948.   #--------------------------------------------------------------------------
  949.   def scroll_right(distance)
  950.     if MGC.mode7_active
  951.       if loop_horizontal?
  952.         @display_x += distance
  953.         @display_x %= @map.width
  954.         @parallax_x += distance if @parallax_loop_x
  955.       else
  956.         last_x = @display_x
  957.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  958.           @display_x = (width - screen_tile_x) / 2
  959.         else
  960.           max = width + screen_tile_x * ((1.0 - 1.0 / MGC.mode7_zoom) / 2 - 1)
  961.           @display_x = [@display_x + distance, max].min
  962.         end
  963.         @parallax_x += @display_x - last_x
  964.       end
  965.     else
  966.       scroll_right_mgc_m7a(distance)
  967.     end
  968.   end
  969.   #--------------------------------------------------------------------------
  970.   # * Scroll Up
  971.   #--------------------------------------------------------------------------
  972.   def scroll_up(distance)
  973.     if MGC.mode7_active
  974.       if loop_vertical?
  975.         @display_y += @map.height - distance
  976.         @display_y %= @map.height
  977.         @parallax_y -= distance if @parallax_loop_y
  978.       else
  979.         last_y = @display_y
  980.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  981.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  982.         else
  983.           min = screen_tile_y * (1.0 / MGC.mode7_zoom - 1.0) * MGC.mode7_data[1]
  984.           @display_y = [@display_y - distance, min].max
  985.         end
  986.         @parallax_y += @display_y - last_y
  987.       end
  988.     else
  989.       scroll_up_mgc_m7a(distance)
  990.     end
  991.   end
  992.   #--------------------------------------------------------------------------
  993.   # * Get Terrain Tag for a layer [1.7]
  994.   #--------------------------------------------------------------------------
  995.   def terrain_tag_for_layer(x, y, layer)
  996.     return 0 unless valid?(x, y)
  997.     return tileset.flags[tile_id(x, y, layer)] >> 12
  998.   end
  999. end

  1000. #==============================================================================
  1001. # ** Game_CharacterBase
  1002. #==============================================================================
  1003. class Game_CharacterBase
  1004.   #--------------------------------------------------------------------------
  1005.   # * Public Instance Variables
  1006.   #--------------------------------------------------------------------------
  1007.   attr_accessor :sprite
  1008. end

  1009. #==============================================================================
  1010. # ** Serialisation
  1011. #==============================================================================
  1012. [:Sprite, :Viewport, :Bitmap, :Font].each {|classname|
  1013.   eval(
  1014.   "class #{classname}
  1015.     def marshal_dump
  1016.       return []
  1017.     end
  1018.     def marshal_load(array)
  1019.     end
  1020.   end")
  1021. }

  1022. #==============================================================================
  1023. # ** Sprite
  1024. #==============================================================================
  1025. class Sprite
  1026.   #--------------------------------------------------------------------------
  1027.   # * Aliased methods
  1028.   #--------------------------------------------------------------------------
  1029.   unless @already_aliased_mgc_m7a
  1030.     alias initialize_mgc_m7a initialize
  1031.     alias zoom_x_mgc_m7a= zoom_x=
  1032.     alias zoom_y_mgc_m7a= zoom_y=
  1033.     alias zoom_x_mgc_m7a zoom_x
  1034.     alias zoom_y_mgc_m7a zoom_y
  1035.     @already_aliased_mgc_m7a = true
  1036.   end
  1037.   #--------------------------------------------------------------------------
  1038.   # * Initialisation
  1039.   #--------------------------------------------------------------------------
  1040.   def initialize(*args)
  1041.     initialize_mgc_m7a(*args)
  1042.     @phase_mode7 = false
  1043.     self.zoom_x = 1.0
  1044.     self.zoom_y = 1.0
  1045.   end
  1046.   #--------------------------------------------------------------------------
  1047.   # * Setter pour l'attribut zoom_x
  1048.   #--------------------------------------------------------------------------
  1049.   def zoom_x=(new_zoom_x)
  1050.     unless @phase_mode7
  1051.       @base_zoom_x = new_zoom_x
  1052.     end
  1053.     self.zoom_x_mgc_m7a = new_zoom_x
  1054.   end
  1055.   #--------------------------------------------------------------------------
  1056.   # * Setter pour l'attribut zoom_y
  1057.   #--------------------------------------------------------------------------
  1058.   def zoom_y=(new_zoom_y)
  1059.     unless @phase_mode7
  1060.       @base_zoom_y = new_zoom_y
  1061.     end
  1062.     self.zoom_y_mgc_m7a = new_zoom_y
  1063.   end
  1064.   #--------------------------------------------------------------------------
  1065.   # * Getter pour l'attribut zoom_x
  1066.   #--------------------------------------------------------------------------
  1067.   def zoom_x
  1068.     return @base_zoom_x
  1069.   end
  1070.   #--------------------------------------------------------------------------
  1071.   # * Getter pour l'attribut zoom_y
  1072.   #--------------------------------------------------------------------------
  1073.   def zoom_y
  1074.     return @base_zoom_y
  1075.   end
  1076.   #--------------------------------------------------------------------------
  1077.   # * Valeur réelle du zoom_x en prenant en compte le zoom de la carte
  1078.   #--------------------------------------------------------------------------
  1079.   def zoom_x_real
  1080.     return zoom_x_mgc_m7a
  1081.   end
  1082.   #--------------------------------------------------------------------------
  1083.   # * Valeur réelle du zoom_y en prenant en compte le zoom de la carte
  1084.   #--------------------------------------------------------------------------
  1085.   def zoom_y_real
  1086.     return zoom_y_mgc_m7a
  1087.   end
  1088. end

  1089. #==============================================================================
  1090. # ** Sprite_Base
  1091. #==============================================================================
  1092. class Sprite_Base
  1093.   #--------------------------------------------------------------------------
  1094.   # * Aliased methods
  1095.   #--------------------------------------------------------------------------
  1096.   unless @already_aliased_mgc_m7a
  1097.     alias animation_set_sprites_mgc_m7a_aprite_base animation_set_sprites
  1098.     @already_aliased_mgc_m7a = true
  1099.   end
  1100.   #--------------------------------------------------------------------------
  1101.   # * Set Animation Sprite
  1102.   #     frame : Frame data (RPG::Animation::Frame)
  1103.   #--------------------------------------------------------------------------
  1104.   def animation_set_sprites(frame)
  1105.     if MGC.mode7_active
  1106.       cell_data = frame.cell_data
  1107.       @ani_sprites.each_with_index do |sprite, i|
  1108.         next unless sprite
  1109.         pattern = cell_data[i, 0]
  1110.         if !pattern || pattern < 0
  1111.           sprite.visible = false
  1112.           next
  1113.         end
  1114.         sprite.bitmap = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2
  1115.         sprite.visible = true
  1116.         sprite.src_rect.set(pattern % 5 * 192,
  1117.           pattern % 100 / 5 * 192, 192, 192)
  1118.         if @ani_mirror
  1119.           sprite.x = @ani_ox - cell_data[i, 1] * zoom_y_real
  1120.           sprite.y = @ani_oy + cell_data[i, 2] * zoom_y_real
  1121.           sprite.angle = (360 - cell_data[i, 4])
  1122.           sprite.mirror = (cell_data[i, 5] == 0)
  1123.         else
  1124.           sprite.x = @ani_ox + cell_data[i, 1] * zoom_y_real
  1125.           sprite.y = @ani_oy + cell_data[i, 2] * zoom_y_real
  1126.           sprite.angle = cell_data[i, 4]
  1127.           sprite.mirror = (cell_data[i, 5] == 1)
  1128.         end
  1129.         sprite.z = self.z + 300 + i
  1130.         sprite.ox = 96
  1131.         sprite.oy = 96
  1132.         sprite.zoom_x = cell_data[i, 3] * zoom_y_real / 100.0
  1133.         sprite.zoom_y = cell_data[i, 3] * zoom_y_real / 100.0
  1134.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  1135.         sprite.blend_type = cell_data[i, 7]
  1136.       end
  1137.     else
  1138.       animation_set_sprites_mgc_m7a_aprite_base(frame)
  1139.     end
  1140.   end
  1141. end

  1142. #==============================================================================
  1143. # ** Sprite_Character
  1144. #==============================================================================
  1145. class Sprite_Character < Sprite_Base
  1146.   #--------------------------------------------------------------------------
  1147.   # * Aliased methods
  1148.   #--------------------------------------------------------------------------
  1149.   unless @already_aliased_mgc_m7a
  1150.     alias initialize_mgc_m7a_aprite_character initialize
  1151.     alias update_position_mgc_m7a_aprite_character update_position
  1152.     alias update_other_mgc_m7a_aprite_character update_other
  1153.     alias update_balloon_mgc_m7a_aprite_character update_balloon
  1154.     @already_aliased_mgc_m7a = true
  1155.   end
  1156.   #--------------------------------------------------------------------------
  1157.   # * Object Initialization
  1158.   #     character : Game_Character
  1159.   #--------------------------------------------------------------------------
  1160.   def initialize(viewport, character = nil)
  1161.     initialize_mgc_m7a_aprite_character(viewport, character)
  1162.     character.sprite = self
  1163.   end
  1164.   #--------------------------------------------------------------------------
  1165.   # * Update Position
  1166.   #--------------------------------------------------------------------------
  1167.   def update_position
  1168.     if MGC.mode7_active
  1169.       old_x = x
  1170.       old_y = y
  1171.       update_mode7
  1172.       @in_mode_7 = true # [1.5]
  1173. #      move_animation(x - old_x, y - old_y)
  1174.     else
  1175.       if @in_mode_7 # [1.5]
  1176.         self.zoom_x = zoom_x
  1177.         self.zoom_y = zoom_y
  1178.         @in_mode_7 = false
  1179.       end
  1180.       update_position_mgc_m7a_aprite_character
  1181.     end
  1182.   end
  1183.   #--------------------------------------------------------------------------
  1184.   # * Update Other
  1185.   #--------------------------------------------------------------------------
  1186.   def update_other
  1187.     update_other_mgc_m7a_aprite_character
  1188.     if MGC.mode7_active && visible
  1189.       if !@force_mode7_invisible &&
  1190.         y >= MGC.mode7_data[8] &&
  1191.         (y - height * zoom_y_real) < Graphics.height
  1192.       then
  1193.         self.visible = true
  1194.         if y < Graphics.height
  1195.           dat = MGC.mode7_data[9]
  1196.           self.opacity += dat[5, y]
  1197.           self.tone.set(dat[2, y], dat[3, y], dat[4, y])
  1198.         end
  1199.       else
  1200.         self.visible = false
  1201.       end
  1202.     end
  1203.   end
  1204.   #--------------------------------------------------------------------------
  1205.   # * Update Position In Mode7
  1206.   #--------------------------------------------------------------------------
  1207.   def update_mode7
  1208.     y_screen = character.screen_y +
  1209.     (character.is_a?(Game_Vehicle) ? character.altitude : 0)
  1210.     y_init = MGC.mode7_data[2] * (y_screen - MGC.mode7_data[0])
  1211.     if y_init < - (MGC::MODE7_VIEW_LIMIT << 5) - MGC.mode7_data[0] ||
  1212.       y_init > Graphics.height
  1213.     then
  1214.       @force_mode7_invisible = true
  1215.       return
  1216.     else
  1217.       @force_mode7_invisible = false
  1218.     end
  1219.     x_init = MGC.mode7_data[2] * (character.screen_x - (Graphics.width >> 1))
  1220.     self.y = (MGC.mode7_data[0] + (MGC.mode7_data[5] * y_init *
  1221.     MGC.mode7_data[3]) / (MGC.mode7_data[5] - y_init * MGC.mode7_data[4])).to_i
  1222.     zx = MGC.mode7_data[6] * y + MGC.mode7_data[7]
  1223.     self.x = ((Graphics.width >> 1) + zx * x_init).to_i
  1224.     @phase_mode7 = true
  1225.     self.zoom_x = MGC.mode7_data[2] * zx
  1226.     self.zoom_y = zoom_x_real
  1227.     @phase_mode7 = false
  1228.     self.z = @character.screen_z + (y << 8) # [1.7]
  1229.     if character.is_a?(Game_Vehicle)
  1230.       self.y -= character.altitude * zoom_y_real
  1231.     end
  1232.   end
  1233.   #--------------------------------------------------------------------------
  1234.   # * Update Balloon Icon
  1235.   #--------------------------------------------------------------------------
  1236.   def update_balloon
  1237.     update_balloon_mgc_m7a_aprite_character
  1238.     if MGC.mode7_active && @balloon_duration > 0
  1239.       @balloon_sprite.y = y - height * zoom_y_real
  1240.       @balloon_sprite.zoom_x = zoom_x_real
  1241.       @balloon_sprite.zoom_y = zoom_y_real
  1242.     end
  1243.   end
  1244. end

  1245. #==============================================================================
  1246. # ** Spriteset_Map
  1247. #==============================================================================
  1248. class Spriteset_Map
  1249.   #--------------------------------------------------------------------------
  1250.   # * Aliased methods
  1251.   #--------------------------------------------------------------------------
  1252.   unless @already_aliased_mgc_m7a
  1253.     alias initialize_mgc_m7a initialize
  1254.     alias create_tilemap_mgc_m7a create_tilemap
  1255.     alias update_mgc_m7a update
  1256.     alias update_shadow_mgc_m7a update_shadow
  1257.     @already_aliased_mgc_m7a = true
  1258.   end
  1259.   #--------------------------------------------------------------------------
  1260.   # * Object Initialization
  1261.   #--------------------------------------------------------------------------
  1262.   def initialize
  1263.     MGC.spriteset = self
  1264.     initialize_mgc_m7a
  1265.   end
  1266.   #--------------------------------------------------------------------------
  1267.   # * Lance le mode 7
  1268.   #--------------------------------------------------------------------------
  1269.   def start_mode7
  1270.     unless @tilemap_mode7
  1271.       MGC.initialize_mode7
  1272.       @tilemap_classic = @tilemap
  1273.       @tilemap_mode7 = MGC::Mode7_Map.new(@viewport1)
  1274.       @tilemap_mode7.map_data = $game_map.data
  1275.       @tilemap = @tilemap_mode7
  1276.       load_tileset
  1277.     end
  1278.     @tilemap_mode7.create_vertical_tiles # [1.7]
  1279.     @tilemap_mode7.visible = true
  1280.     @tilemap_classic.visible = false
  1281.     @tilemap = @tilemap_mode7
  1282.     MGC.mode7_active = true
  1283.   end
  1284.   #--------------------------------------------------------------------------
  1285.   # * Met fin au mode 7
  1286.   #--------------------------------------------------------------------------
  1287.   def end_mode7
  1288.     if @tilemap_mode7
  1289.       @tilemap_mode7.visible = false
  1290.       @tilemap_classic.visible = true
  1291.       @tilemap = @tilemap_classic
  1292.       @tilemap_mode7.clear_vertical_tiles # [1.7]
  1293.     end
  1294.     MGC.mode7_active = false
  1295.   end
  1296.   #--------------------------------------------------------------------------
  1297.   # * Create Tilemap
  1298.   #--------------------------------------------------------------------------
  1299.   def create_tilemap
  1300.     create_tilemap_mgc_m7a
  1301.     unless $game_system.mode7_active
  1302.       MGC.mode7_active = false
  1303.     end
  1304.     if $game_map.is_mode7? || $game_system.mode7_active
  1305.       start_mode7
  1306.     end
  1307.   end
  1308.   #--------------------------------------------------------------------------
  1309.   # * Update
  1310.   #--------------------------------------------------------------------------
  1311.   def update
  1312.     MGC.update_mode7
  1313.     if $game_map.start_mode7
  1314.       start_mode7
  1315.       $game_map.start_mode7 = false
  1316.     elsif $game_map.end_mode7
  1317.       end_mode7
  1318.       $game_map.end_mode7 = false
  1319.     end
  1320.     update_mgc_m7a
  1321.   end
  1322.   #--------------------------------------------------------------------------
  1323.   # * Update Airship Shadow Sprite
  1324.   #--------------------------------------------------------------------------
  1325.   def update_shadow
  1326.     if MGC.mode7_active
  1327.       airship_sprite = $game_map.airship.sprite
  1328.       @shadow_sprite.x = airship_sprite.x
  1329.       @shadow_sprite.y = airship_sprite.y + $game_map.airship.altitude *
  1330.       airship_sprite.zoom_y_real
  1331.       @shadow_sprite.opacity = $game_map.airship.altitude * 8 *
  1332.       airship_sprite.opacity
  1333.       @shadow_sprite.zoom_x = airship_sprite.zoom_x_real
  1334.       @shadow_sprite.zoom_y = airship_sprite.zoom_y_real
  1335.       @shadow_sprite.update
  1336.     else
  1337.       update_shadow_mgc_m7a
  1338.     end
  1339.   end
  1340. end

  1341. #==============================================================================
  1342. # ** Scene_Map
  1343. #==============================================================================
  1344. class Scene_Map < Scene_Base
  1345.   #--------------------------------------------------------------------------
  1346.   # * Aliased methods
  1347.   #--------------------------------------------------------------------------
  1348.   unless @already_aliased_mgc_m7a
  1349.     alias update_call_menu_mgc_m7a update_call_menu
  1350.     @already_aliased_mgc_m7a = true
  1351.   end
  1352.   #--------------------------------------------------------------------------
  1353.   # * Determine if Menu is Called due to Cancel Button
  1354.   #--------------------------------------------------------------------------
  1355.   def update_call_menu
  1356.     unless MGC.effect?
  1357.       update_call_menu_mgc_m7a
  1358.     end
  1359.   end
  1360. end

  1361. #============================================================================
  1362. # ** RPG::MapInfo
  1363. #============================================================================
  1364. class RPG::MapInfo
  1365.   # defines the map name as the name without anything within brackets,
  1366.   # including brackets
  1367.   def name
  1368.     return @name.gsub(/\[.*\]/) {''}
  1369.   end
  1370.   #--------------------------------------------------------------------------
  1371.   # the original name with the codes
  1372.   def full_name
  1373.     return @name
  1374.   end
  1375. end

  1376. module MGC
  1377.   #--------------------------------------------------------------------------
  1378.   # * Constantes [1.7]
  1379.   #--------------------------------------------------------------------------
  1380.   RENDER_TILE = Win32API.new("MGC_Mode7_Ace_1_7", "renderTile", "l", "l")
  1381.   #==============================================================================
  1382.   # ** MGC::Vertical_Tile [1.7]
  1383.   #==============================================================================
  1384.   class Vertical_Tile
  1385.     #--------------------------------------------------------------------------
  1386.     # * Attributs
  1387.     #--------------------------------------------------------------------------
  1388.     attr_accessor :x, :y, :screen_x, :screen_y, :zoom
  1389.     attr_accessor :tile_width, :tile_height, :width, :height
  1390.     #--------------------------------------------------------------------------
  1391.     # * Initialisation
  1392.     # param parent : MGC::Mode7_Map
  1393.     # param viewport : Viewport
  1394.     #--------------------------------------------------------------------------
  1395.     def initialize(parent, viewport)
  1396.       @parent = parent
  1397.       @viewport = viewport
  1398.       @visible = false
  1399.       @sprite = nil
  1400.     end
  1401.     #--------------------------------------------------------------------------
  1402.     # * Refresh tile data
  1403.     # param tiles : Array<Array[Integer, Integer, Array[3]<Boolean>]>
  1404.     # param x_min : Integer
  1405.     # param x_max : Integer
  1406.     # param y_min : Integer
  1407.     # param y_max : Integer
  1408.     #--------------------------------------------------------------------------
  1409.     def refresh_tile_data(tiles, x_min, x_max, y_min, y_max)
  1410.       self.tile_width = 1 + x_max - x_min
  1411.       self.width = tile_width << 5
  1412.       self.tile_height = 1 + y_max - y_min
  1413.       self.height = tile_height << 5
  1414.       @tiles_data = Array.new(tile_width * tile_height)
  1415.       tiles.each {|tile|
  1416.         x_tile = tile[0] - x_min
  1417.         y_tile = tile[1] - y_min
  1418.         @tiles_data[x_tile + y_tile * tile_width] = tile
  1419.       }
  1420.     end
  1421.     #--------------------------------------------------------------------------
  1422.     # * Dispose
  1423.     #--------------------------------------------------------------------------
  1424.     def dispose
  1425.       if @sprite
  1426.         @sprite.bitmap.dispose
  1427.         @sprite.dispose
  1428.         @sprite = nil
  1429.       end
  1430.     end
  1431.     #--------------------------------------------------------------------------
  1432.     # * Update
  1433.     #--------------------------------------------------------------------------
  1434.     def update
  1435.       update_mode7
  1436.       update_visibility
  1437.     end
  1438.     #--------------------------------------------------------------------------
  1439.     # * Update Position In Mode7
  1440.     #--------------------------------------------------------------------------
  1441.     def update_mode7
  1442.       x_scr = 32 * $game_map.adjust_x(x.to_f / 32)
  1443.       y_scr = 32 * $game_map.adjust_y(y.to_f / 32)
  1444.       y_init = MGC.mode7_data[2] * (y_scr - MGC.mode7_data[0])
  1445.       if y_init < - (MGC::MODE7_VIEW_LIMIT << 5) - MGC.mode7_data[0] ||
  1446.         y_init > Graphics.height
  1447.       then
  1448.         @force_invisible = true
  1449.         return
  1450.       else
  1451.         @force_invisible = false
  1452.       end
  1453.       x_init = MGC.mode7_data[2] * (x_scr - (Graphics.width >> 1))
  1454.       self.screen_y = (MGC.mode7_data[0] + (MGC.mode7_data[5] * y_init *
  1455.       MGC.mode7_data[3]) / (MGC.mode7_data[5] - y_init * MGC.mode7_data[4])).to_i
  1456.       zx = MGC.mode7_data[6] * screen_y + MGC.mode7_data[7]
  1457.       self.screen_x = ((Graphics.width >> 1) + zx * x_init).to_i
  1458.       self.zoom = MGC.mode7_data[2] * zx
  1459.     end
  1460.     #--------------------------------------------------------------------------
  1461.     # * Update Visibility
  1462.     #--------------------------------------------------------------------------
  1463.     def update_visibility
  1464.       if @visible
  1465.         if !@force_invisible &&
  1466.           screen_y >= MGC.mode7_data[8] &&
  1467.           (screen_y - height * zoom) < Graphics.height &&
  1468.           (screen_x + width * zoom / 2)  >= 0 &&
  1469.           (screen_x - width * zoom / 2) < Graphics.width
  1470.         then
  1471.           if screen_y < Graphics.height
  1472.             dat = MGC.mode7_data[9]
  1473.             @sprite.opacity = 255 + dat[5, screen_y]
  1474.             @sprite.tone.set(dat[2, screen_y], dat[3, screen_y], dat[4, screen_y])
  1475.           end
  1476.           @sprite.x = screen_x
  1477.           @sprite.y = screen_y
  1478.           @sprite.z = screen_y << 8
  1479.           @sprite.zoom_x = zoom
  1480.           @sprite.zoom_y = zoom
  1481.         else
  1482.           @visible = false
  1483.           @sprite.bitmap.dispose
  1484.           @sprite.dispose
  1485.           @sprite = nil
  1486.         end
  1487.       else
  1488.         if !@force_invisible &&
  1489.           screen_y >= MGC.mode7_data[8] &&
  1490.           (screen_y - height * zoom) < Graphics.height &&
  1491.           (screen_x + width * zoom / 2)  >= 0 &&
  1492.           (screen_x - width * zoom / 2) < Graphics.width
  1493.         then
  1494.           @visible = true
  1495.           @sprite = Sprite.new(@viewport)
  1496.           @sprite.ox = tile_width * 32 / 2
  1497.           @sprite.oy = tile_height * 32
  1498.           @sprite.x = screen_x
  1499.           @sprite.y = screen_y
  1500.           @sprite.z = screen_y << 8
  1501.           @sprite.zoom_x = zoom
  1502.           @sprite.zoom_y = zoom
  1503.           @sprite.bitmap = Bitmap.new(32 * tile_width, 32 * tile_height)
  1504.           (0...tile_height).each {|iy|
  1505.             (0...tile_width).each {|ix|
  1506.               tile_data = @tiles_data[ix + iy * tile_width]
  1507.               if tile_data
  1508.                 (0...3).each {|il|
  1509.                   if tile_data[2][il]
  1510.                     @parent.param_tiles[6][il] =
  1511.                     $game_map.tile_id(tile_data[0], tile_data[1], il)
  1512.                   else
  1513.                     @parent.param_tiles[6][il] = 0
  1514.                   end
  1515.                 }
  1516.                 @parent.param_tiles[0].clear
  1517.                 MGC::RENDER_TILE.call(@parent.param_tiles.__id__)
  1518.                 @sprite.bitmap.blt(ix << 5, iy << 5, @parent.param_tiles[0],
  1519.                 @parent.param_tiles[0].rect)
  1520.               end
  1521.             }
  1522.           }
  1523.           if screen_y < Graphics.height
  1524.             dat = MGC.mode7_data[9]
  1525.             @sprite.opacity = 255 + dat[5, screen_y]
  1526.             @sprite.tone.set(dat[2, screen_y], dat[3, screen_y], dat[4, screen_y])
  1527.           end
  1528.         end
  1529.       end
  1530.     end
  1531.   end
  1532. end
复制代码

点评

可以收回,只不过收回的话不退税收,会有损失~  发表于 2014-3-25 19:22

Lv1.梦旅人

史莱姆的信徒
12-B

梦石
0
星屑
53
在线时间
368 小时
注册时间
2013-8-14
帖子
1011
2
 楼主| 发表于 2014-3-25 19:25:08 | 只看该作者
@protosssonny   p叔可以帮忙吗,还有正太果体图集哦
回复 支持 反对

使用道具 举报

Lv1.梦旅人

史莱姆的信徒
12-B

梦石
0
星屑
53
在线时间
368 小时
注册时间
2013-8-14
帖子
1011
3
 楼主| 发表于 2014-3-26 22:03:54 手机端发表。 | 只看该作者
自顶吧,
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
24 小时
注册时间
2012-2-6
帖子
9
4
发表于 2014-3-29 22:14:39 | 只看该作者
虽然连意思都没明白,但还是来顶一下lz
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1444
在线时间
1592 小时
注册时间
2010-11-6
帖子
3193

贵宾

5
发表于 2014-3-29 22:53:12 手机端发表。 | 只看该作者
不是角色控制,更改行走图?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-19 16:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表