Project1

标题: 如何让XP支持VX行走图 [打印本页]

作者: 霜冻之狼    时间: 2009-7-27 17:37
标题: 如何让XP支持VX行走图
因为写脚本的人私奔了,自己搜了半天也找不到.
要求用脚本让XP支持VX的行走图,就是3*4的那种.

放心我不发没有悬赏的提问帖......
作者: ★_茄孓    时间: 2009-7-27 17:37
本帖最后由 ★_茄孓 于 2009-7-28 18:30 编辑

话说我下午回的3个帖子都没掉了,汗```不过也好!!!
LS的做法很好``不过VX的行走图里面是分多个人物的,所以RMXP是不支持选择第几个,还需要外界设置来调用下..

范例.rar (207.3 KB, 下载次数: 310)

需要设置的地方是 数据库角色名字的地方/事件名字的地方
如果该角色或事件的行走图是RMXP默认行走图则无需设置什么
如果是RMVX行走图``
请把那张VX图看做一个坐标系以最左上角的那个动作为[0,0]看 则
角色名=[X坐标,Y坐标,X向总帧数,Y向总帧数,人物X向总帧数]
所以你要
第1个人物的话请设定
阿尔西斯=[0,0,12,8,3]
第2个人物的话请设定
阿尔西斯=[3,0,12,8,3]
第4个人物的话请设定
阿尔西斯=[9,0,12,8,3]
第5个人物的话请设定
阿尔西斯=[0,4,12,8,3]
第6个人物的话请设定
阿尔西斯=[3,4,12,8,3]
事件的设置和角色的设置一样!

复制代码到MAIN前

  1. class Game_Actor < Game_Battler
  2.   #--------------------------------------------------------------------------
  3.   # ● 定义实例变量
  4.   #--------------------------------------------------------------------------
  5.   attr_reader   :src
  6.   #--------------------------------------------------------------------------
  7.   # ● 设置
  8.   #     actor_id : 角色 ID
  9.   #--------------------------------------------------------------------------
  10.   def setup(actor_id)
  11.     actor = $data_actors[actor_id]
  12.     @actor_id = actor_id
  13.     @name = actor.name
  14.     @src = [0,0,4,4,4]
  15.     if @name.include?("=")
  16.       @src = eval(@name.split(/=/)[1])
  17.       @name = @name.split(/=/)[0]
  18.     end
  19.     @character_name = actor.character_name
  20.     @character_hue = actor.character_hue
  21.     @battler_name = actor.battler_name
  22.     @battler_hue = actor.battler_hue
  23.     @class_id = actor.class_id
  24.     @weapon_id = actor.weapon_id
  25.     @armor1_id = actor.armor1_id
  26.     @armor2_id = actor.armor2_id
  27.     @armor3_id = actor.armor3_id
  28.     @armor4_id = actor.armor4_id
  29.     @level = actor.initial_level
  30.     @exp_list = Array.new(101)
  31.     make_exp_list
  32.     @exp = @exp_list[@level]
  33.     @skills = []
  34.     @hp = maxhp
  35.     @sp = maxsp
  36.     @states = []
  37.     @states_turn = {}
  38.     @maxhp_plus = 0
  39.     @maxsp_plus = 0
  40.     @str_plus = 0
  41.     @dex_plus = 0
  42.     @agi_plus = 0
  43.     @int_plus = 0
  44.     # 学会特技
  45.     for i in 1..@level
  46.       for j in $data_classes[@class_id].learnings
  47.         if j.level == i
  48.           learn_skill(j.skill_id)
  49.         end
  50.       end
  51.     end
  52.     # 刷新自动状态
  53.     update_auto_state(nil, $data_armors[@armor1_id])
  54.     update_auto_state(nil, $data_armors[@armor2_id])
  55.     update_auto_state(nil, $data_armors[@armor3_id])
  56.     update_auto_state(nil, $data_armors[@armor4_id])
  57.   end
  58. end

  59. class Game_Event < Game_Character
  60.   #--------------------------------------------------------------------------
  61.   # ● 定义实例变量
  62.   #--------------------------------------------------------------------------
  63.   attr_reader   :name
  64.   attr_reader   :src
  65.   #--------------------------------------------------------------------------
  66.   # ● 初始化对像
  67.   #     map_id : 地图 ID
  68.   #     event  : 事件 (RPG::Event)
  69.   #--------------------------------------------------------------------------
  70.   def initialize(map_id, event)
  71.     super()
  72.     @map_id = map_id
  73.     @event = event
  74.     @name = event.name
  75.     @src = [0,0,4,4,4]
  76.     if @name.include?("=")
  77.       @src = eval(@name.split(/=/)[1])
  78.       @name = @name.split(/=/)[0]
  79.     end  
  80.     @id = @event.id
  81.     @erased = false
  82.     @starting = false
  83.     @through = true
  84.     # 初期位置的移动
  85.     moveto(@event.x, @event.y)
  86.     refresh
  87.   end
  88. end

  89. class Sprite_Character < RPG::Sprite
  90.   #--------------------------------------------------------------------------
  91.   # ● 更新画面
  92.   #--------------------------------------------------------------------------
  93.   def update
  94.     super
  95.     if @character != nil
  96.       if @character.is_a?(Game_Player)
  97.       @bitmap_x = $game_party.actors[0].src[0].to_i
  98.       @bitmap_y = $game_party.actors[0].src[1].to_i
  99.       @bitmap_width_pattern = $game_party.actors[0].src[2].to_i
  100.       @bitmap_height_pattern = $game_party.actors[0].src[3].to_i
  101.     elsif @character.is_a?(Game_Event)
  102.       @bitmap_x = @character.src[0].to_i
  103.       @bitmap_y = @character.src[1].to_i
  104.       @bitmap_width_pattern = @character.src[2].to_i
  105.       @bitmap_height_pattern = @character.src[3].to_i
  106.     end
  107.     end
  108.     if @tile_id != @character.tile_id or
  109.        @character_name != @character.character_name or
  110.        @character_hue != @character.character_hue
  111.       @tile_id = @character.tile_id
  112.       @character_name = @character.character_name
  113.       @character_hue = @character.character_hue
  114.       if @tile_id >= 384
  115.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  116.           @tile_id, @character.character_hue)
  117.         self.src_rect.set(0, 0, 32, 32)
  118.         self.ox = 16
  119.         self.oy = 32
  120.       else
  121.         self.bitmap = RPG::Cache.character(@character.character_name,
  122.           @character.character_hue)
  123.         @cw = bitmap.width / @bitmap_width_pattern
  124.         @ch = bitmap.height / @bitmap_height_pattern
  125.         self.ox = @cw / 2
  126.         self.oy = @ch
  127.       end
  128.     end
  129.     self.visible = (not @character.transparent)
  130.     if @tile_id == 0
  131.       sx = @character.pattern * @cw + @bitmap_x * 32
  132.       sy = (@character.direction - 2) / 2 * @ch + @bitmap_y * 32
  133.       self.src_rect.set(sx, sy, @cw, @ch)
  134.     end
  135.     self.x = @character.screen_x
  136.     self.y = @character.screen_y
  137.     self.z = @character.screen_z(@ch)
  138.     self.opacity = @character.opacity
  139.     self.blend_type = @character.blend_type
  140.     self.bush_depth = @character.bush_depth
  141.     if @character.animation_id != 0
  142.       animation = $data_animations[@character.animation_id]
  143.       animation(animation, true)
  144.       @character.animation_id = 0
  145.     end
  146.   end
  147. end

  148. class Game_Character
  149.   #--------------------------------------------------------------------------
  150.   # ● 刷新画面
  151.   #--------------------------------------------------------------------------
  152.   def update
  153.     if jumping?
  154.       update_jump
  155.     elsif moving?
  156.       update_move
  157.     else
  158.       update_stop
  159.     end
  160.     if @anime_count > 18 - @move_speed * 2
  161.       if not @step_anime and @stop_count > 0
  162.         @pattern = @original_pattern
  163.       else
  164.         @bitmap_pattern = $game_party.actors[0].src[4].to_i
  165.         @pattern = (@pattern + 1) % @bitmap_pattern
  166.       end
  167.       @anime_count = 0
  168.     end
  169.     if @wait_count > 0
  170.       @wait_count -= 1
  171.       return
  172.     end
  173.     if @move_route_forcing
  174.       move_type_custom
  175.       return
  176.     end
  177.     if @starting or lock?
  178.       return
  179.     end
  180.     if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
  181.       case @move_type
  182.       when 1  
  183.         move_type_random
  184.       when 2
  185.         move_type_toward_player
  186.       when 3  
  187.         move_type_custom
  188.       end
  189.     end
  190.   end
  191. end
复制代码

作者: darkten    时间: 2009-7-27 18:02
把行走图拼成XP格式不就完事了吗?

提示:可以用PS的批处理一次过处理大小相同的行走图...
作者: gushanyingxue    时间: 2009-7-27 18:05
哦,这个我知道啊。因为VX用的4*3的行走图,XP用的4*4,列数不一样的……要用ps把XP少的一列补上就行了。
类似于XP:迈左脚,停,迈右脚,停
      VX:迈左脚,停,迈右脚
就是酱。
作者: 霜冻之狼    时间: 2009-7-27 18:07
这么说......没有脚本解决的办法了吗?
作者: gushanyingxue    时间: 2009-7-27 18:11
呃,一时匆忙,误解了LZ的意思……抱歉啊……
话说本人是脚本小白……:L
帮顶ing……
作者: darkten    时间: 2009-7-27 18:17
这么说......没有脚本解决的办法了吗?
霜冻之狼 发表于 2009-7-27 18:07

这类脚本我没见过,但不能断定没有...
祝你早日找到...
作者: 后知后觉    时间: 2009-7-27 18:43
XP的行走图是一个人一个文件
而VX的是N个人的合在一个文件里
好像是8个 一排4个 有2排 - -
要这样支持的话在数据库里设置又会称谓另外一个头痛的事情了
如果把VX的图也弄成一个人一个文件的话 那还不如就干脆多添加一列

硬要改脚本的话
Game_Character 2里的
        @pattern = (@pattern + 1) % 4
和Sprite_Character里的
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
做点手脚就好了吧~
character我还没怎么研究过 初步估计就这样~
作者: cfancy    时间: 2009-7-27 18:56
觉得PS一下算了~~~~
脚本的话应该会涉及到许多地方吧
我也是脚步盲~~~
作者: 凌辰    时间: 2009-7-27 19:02
话说我从一开始就知道楼主在求脚本……不然我早转区了- -
作者: goahead    时间: 2009-7-28 15:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: redant    时间: 2009-7-28 23:02
人物跟随呢?

如果单纯一个人的话 只在class Sprite_Character里 用split(/★/)[1] 就能
事件的没试过

一用跟随 就出问题 不知道是不是我跟随脚本的问题……
作者: ★_茄孓    时间: 2009-7-29 10:23
人物跟随应该会出问题,要看如何创建那人物的..不同的方法可能有不同的结果..因为我只写了$game_party.actors[0]做为主角,其他队员如果知道的话也是一样..
作者: Goldencolor    时间: 2009-7-29 10:31
本帖最后由 Goldencolor 于 2009-7-29 10:32 编辑

我记得日本有一个脚本就可以实现这个功能但是现在我找不到脚本,大概名字叫做XPVX通用脚本
作者: 玄月    时间: 2009-7-29 14:24
或者利用真八方行走图,把原来八个方向改成4个方向,原来8帧改为3帧 = =
作者: ★_茄孓    时间: 2009-7-29 14:56
或者利用真八方行走图,把原来八个方向改成4个方向,原来8帧改为3帧 = =
玄月 发表于 2009-7-29 14:24

那就是某楼的写法了,说了除非你要VX每个人物在拆下来...那样的话有点麻烦啊
所以我写的方法就是直接在角色名字那里设置
作者: goahead    时间: 2009-7-29 15:09
提示: 作者被禁止或删除 内容自动屏蔽




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