Project1

标题: 角色换装系统主角被npc覆盖问题 [打印本页]

作者: cloud0001    时间: 2010-7-24 19:25
标题: 角色换装系统主角被npc覆盖问题
我用了角色换装系统,结果发现主角面向上的时候 头部会被npc的脚覆盖,请问这个问题怎么解决?下面是代码~
  1. #==============================================================================
  2. # ■ 角色装备行走图变更                                          BY:亿万星辰
  3. #------------------------------------------------------------------------------
  4. #  使用了一种特殊的方法来改变行走图,不是更换,而是在原图的基础上继续描绘新的
  5. # 层以实现层的叠加,类似暗黑里的装备帽子以后角色的行走图就多出帽子,装备盾牌以
  6. # 后就会看到角色的左手拿着盾牌。
  7. #
  8. # 介绍:
  9. # 现在默认分为5层,最下为默认的行走图,也就是数据库里角色那里设置的。之后分为头
  10. # 部、身体、左右手4层,也可自行添加,但需要一定的功底,以防备逻辑上的混乱……
  11. #
  12. # 使用说明:
  13. # 全部都是在数据库里设置,对应的武器或防具后逗号追加一个图片文件名即可,此文件
  14. # 放在graphics/characters下,至于图片的绘制,实属虐待美工…… 具体可参考范例里
  15. # 的graphics/characters目录,不过盾牌的图画的不是很合适
  16. #==============================================================================
  17. module RPG
  18.   class Weapon
  19.     def name
  20.       return @name.split(/,/)[0]
  21.     end
  22.     def part
  23.       return @name.split(/,/)[1]
  24.     end
  25.   end
  26.   
  27.   class Armor
  28.     def name
  29.       return @name.split(/,/)[0]
  30.     end
  31.     def part
  32.       return @name.split(/,/)[1]
  33.     end
  34.   end
  35. end


  36. #==============================================================================
  37. # ■ Game_Player
  38. #------------------------------------------------------------------------------
  39. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  40. # 本类的实例请参考 $game_player。
  41. #==============================================================================

  42. class Game_Player < Game_Character
  43.   attr_accessor   :part_name                # 角色 文件名
  44.   attr_accessor   :turn_z
  45.   #--------------------------------------------------------------------------
  46.   # ● 初始化对像
  47.   #--------------------------------------------------------------------------
  48.   def initialize
  49.     super
  50.     @turn_z = [0,3,4,1,2] # 优先级,靠后的显示在最前 0主身体 1武器 2盾牌 3身体 4头
  51.     @part_name = [
  52.       $game_party.actors[0].character_name,
  53.       $game_party.actors[0].weapon_id != 0 ? $data_weapons[$game_party.actors[0].weapon_id].part : "",
  54.       $game_party.actors[0].armor1_id != 0 ? $data_armors[$game_party.actors[0].armor1_id].part : "",
  55.       $game_party.actors[0].armor2_id != 0 ? $data_armors[$game_party.actors[0].armor2_id].part : "",
  56.       $game_party.actors[0].armor3_id != 0 ? $data_armors[$game_party.actors[0].armor3_id].part : ""]
  57.   end
  58.   #--------------------------------------------------------------------------
  59.   # ● 面向向下
  60.   #--------------------------------------------------------------------------
  61.   def turn_down
  62.     unless @direction_fix
  63.       @direction = 2
  64.       @stop_count = 0
  65.       @turn_z = [0,3,4,1,2] # 优先级,靠后的显示在最前
  66.     end
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # ● 面向向左
  70.   #--------------------------------------------------------------------------
  71.   def turn_left
  72.     unless @direction_fix
  73.       @direction = 4
  74.       @stop_count = 0
  75.       @turn_z = [1,0,3,4,2] # 优先级,靠后的显示在最前
  76.     end
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 面向向右
  80.   #--------------------------------------------------------------------------
  81.   def turn_right
  82.     unless @direction_fix
  83.       @direction = 6
  84.       @stop_count = 0
  85.       @turn_z = [2,0,3,4,1] # 优先级,靠后的显示在最前
  86.     end
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 面向向上
  90.   # (这里感觉不太好处理,有些时候有的图一步在角色主图前,一步在角色主图后,
  91.   # 不怎么好处理,只能麻烦美工了……比如范例里的盾牌……)
  92.   #--------------------------------------------------------------------------
  93.   def turn_up
  94.     unless @direction_fix
  95.       @direction = 8
  96.       @stop_count = 0
  97.       @turn_z = [0,1,2,3,4] # 优先级,靠后的显示在最前
  98.     end
  99.   end
  100. end

  101. #==============================================================================
  102. # ■ Sprite_Character
  103. #------------------------------------------------------------------------------
  104. #  角色显示用脚本。监视 Game_Character 类的实例、
  105. # 自动变化脚本状态。
  106. #==============================================================================

  107. class Sprite_Player < RPG::Sprite
  108.   #--------------------------------------------------------------------------
  109.   # ● 定义实例变量
  110.   #--------------------------------------------------------------------------
  111.   attr_accessor :part                # 角色
  112.   #--------------------------------------------------------------------------
  113.   # ● 初始化对像
  114.   #     viewport  : 查看端口
  115.   #     character : 角色 (Game_Character)
  116.   #--------------------------------------------------------------------------
  117.   def initialize(viewport, part)
  118.     super(viewport)
  119.     @part = part
  120.     @character = $game_player
  121.     self.z += $game_player.turn_z.index(part)
  122.     update
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 更新画面
  126.   #--------------------------------------------------------------------------
  127.   def update
  128.     super
  129.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  130.     if @tile_id != @character.tile_id or
  131.        @character_name != @character.character_name or
  132.        @character_hue != @character.character_hue
  133.       # 记忆元件 ID 与文件名、色相
  134.       @tile_id = @character.tile_id
  135.       @character_name = @character.character_name
  136.       @character_hue = @character.character_hue
  137.       # 元件 ID 为有效值的情况下
  138.       pic = @character.part_name[@part]
  139.       self.bitmap = RPG::Cache.character(pic, @character.character_hue)
  140.       @cw = bitmap.width / 4
  141.       @ch = bitmap.height / 4
  142.       self.ox = @cw / 2
  143.       self.oy = @ch
  144.     end
  145.     # 设置可视状态
  146.     self.visible = (not @character.transparent)
  147.     # 图形是角色的情况下
  148.     if @tile_id == 0
  149.       # 设置传送目标的矩形
  150.       sx = @character.pattern * @cw
  151.       sy = (@character.direction - 2) / 2 * @ch
  152.       self.src_rect.set(sx, sy, @cw, @ch)
  153.     end
  154.     # 设置脚本的坐标
  155.     self.x = @character.screen_x
  156.     self.y = @character.screen_y
  157.     self.z = @character.turn_z.index(part)
  158.     # 设置不透明度、合成方式、茂密
  159.     self.opacity = @character.opacity
  160.     self.blend_type = @character.blend_type
  161.     self.bush_depth = @character.bush_depth
  162.     # 动画
  163.     if @character.animation_id != 0
  164.       animation = $data_animations[@character.animation_id]
  165.       animation(animation, true)
  166.       @character.animation_id = 0
  167.     end
  168.   end
  169. end

  170. class Spriteset_Map
  171.   #--------------------------------------------------------------------------
  172.   # ● 初始化对像
  173.   #--------------------------------------------------------------------------
  174.   def initialize
  175.     # 生成显示端口
  176.     @viewport1 = Viewport.new(0, 0, 640, 480)
  177.     @viewport2 = Viewport.new(0, 0, 640, 480)
  178.     @viewport3 = Viewport.new(0, 0, 640, 480)
  179.     @viewport2.z = 200
  180.     @viewport3.z = 5000
  181.     # 生成元件地图
  182.     @tilemap = Tilemap.new(@viewport1)
  183.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  184.     for i in 0..6
  185.       autotile_name = $game_map.autotile_names[i]
  186.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  187.     end
  188.     @tilemap.map_data = $game_map.data
  189.     @tilemap.priorities = $game_map.priorities
  190.     # 生成远景平面
  191.     @panorama = Plane.new(@viewport1)
  192.     @panorama.z = -1000
  193.     # 生成雾平面
  194.     @fog = Plane.new(@viewport1)
  195.     @fog.z = 3000
  196.     # 生成角色活动块
  197.     @character_sprites = []
  198.     for i in $game_map.events.keys.sort
  199.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  200.       @character_sprites.push(sprite)
  201.     end
  202.     @character_sprites.push(Sprite_Player.new(@viewport1, 0)) # 主体
  203.     @character_sprites.push(Sprite_Player.new(@viewport1, 1)) # 武器
  204.     @character_sprites.push(Sprite_Player.new(@viewport1, 2)) # 盾牌
  205.     @character_sprites.push(Sprite_Player.new(@viewport1, 3)) # 身体
  206.     @character_sprites.push(Sprite_Player.new(@viewport1, 4)) # 头
  207.     # 生成天气
  208.     @weather = RPG::Weather.new(@viewport1)
  209.     # 生成图片
  210.     @picture_sprites = []
  211.     for i in 1..50
  212.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  213.         $game_screen.pictures[i]))
  214.     end
  215.     # 生成计时器块
  216.     @timer_sprite = Sprite_Timer.new
  217.     # 刷新画面
  218.     update
  219.   end
  220. end


  221. class Game_Actor < Game_Battler
  222.   #--------------------------------------------------------------------------
  223.   # ● 变更装备
  224.   #     equip_type : 装备类型
  225.   #     id    : 武器 or 防具 ID  (0 为解除装备)
  226.   #--------------------------------------------------------------------------
  227.   def equip(equip_type, id)
  228.     case equip_type
  229.     when 0  # 武器
  230.       if id == 0 or $game_party.weapon_number(id) > 0
  231.         $game_party.gain_weapon(@weapon_id, 1)
  232.         @weapon_id = id
  233.         $game_party.lose_weapon(id, 1)
  234.         $game_player.part_name[1] = @weapon_id != 0 ? $data_weapons[@weapon_id].part : ""
  235.       end
  236.     when 1  # 盾
  237.       if id == 0 or $game_party.armor_number(id) > 0
  238.         update_auto_state($data_armors[@armor1_id], $data_armors[id])
  239.         $game_party.gain_armor(@armor1_id, 1)
  240.         @armor1_id = id
  241.         $game_party.lose_armor(id, 1)
  242.         $game_player.part_name[2] = @armor1_id != 0 ? $data_armors[@armor1_id].part : ""
  243.       end
  244.     when 2  # 头
  245.       if id == 0 or $game_party.armor_number(id) > 0
  246.         update_auto_state($data_armors[@armor2_id], $data_armors[id])
  247.         $game_party.gain_armor(@armor2_id, 1)
  248.         @armor2_id = id
  249.         $game_party.lose_armor(id, 1)
  250.         $game_player.part_name[3] = @armor2_id != 0 ? $data_armors[@armor2_id].part : ""
  251.       end
  252.     when 3  # 身体
  253.       if id == 0 or $game_party.armor_number(id) > 0
  254.         update_auto_state($data_armors[@armor3_id], $data_armors[id])
  255.         $game_party.gain_armor(@armor3_id, 1)
  256.         @armor3_id = id
  257.         $game_party.lose_armor(id, 1)
  258.         $game_player.part_name[4] = @armor3_id != 0 ? $data_armors[@armor3_id].part : ""
  259.       end
  260.     when 4  # 装饰品
  261.       if id == 0 or $game_party.armor_number(id) > 0
  262.         update_auto_state($data_armors[@armor4_id], $data_armors[id])
  263.         $game_party.gain_armor(@armor4_id, 1)
  264.         @armor4_id = id
  265.         $game_party.lose_armor(id, 1)
  266.       end
  267.     end
  268.   end
  269. end
复制代码

作者: cloud0001    时间: 2010-7-31 14:29
==========================有米有人知道呀=====================




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1