Project1

标题: VA真·八方向行走 [打印本页]

作者: 铅笔描绘的思念    时间: 2012-7-22 16:07
标题: VA真·八方向行走
本帖最后由 铅笔描绘的思念 于 2012-7-23 11:53 编辑

因为这个帖子(><)所以就写了咱第一个脚本。。
貌似站上木有va的真八方。。就发布啦~\(≧▽≦)/~
并且还不不影响4方向哦。。只要把八方向的行走图重命名为原4方向的行走图+"_8D"放在Characters里
如果是8个角色元元的话。。那么八方向的的行走图也要是8个角色元的行走图。。角色元的index还是4方的index
类似下面:
4方向 八方向的 当然木有找到八方向的行走图就不会使用八方行走啦。。
效果截图: 。。(´Д`)不要吐槽网格。。。是有用滴。。


已知BUG一只。。。人物跟随会被拉的很远。。出现囧囧的效果。。
RUBY 代码复制
  1. #===============================================================================
  2. #  八方向行走
  3. #    by:铅笔描绘的思念
  4. #    在Characters里添加八方向行走图(命名规范:在四方向上的基础上+_8D)
  5. #    行走动画就为8方向的。否则就会原4方向的代替8方向的。
  6. #
  7. #    八方向:数字键盘方向对应的数字
  8. #     7   8   9
  9. #      ↖ ↑ ↗
  10. #     4← 0 →6
  11. #      ↙ ↓ ↘
  12. #     1   2   3
  13. #===============================================================================
  14. #==============================================================================
  15. # ■ Game_Player
  16. #==============================================================================
  17. class Game_Player < Game_Character
  18.   #--------------------------------------------------------------------------
  19.   # ● 八方向移动
  20.   #    d    :1、3、7、9 对应小键盘的四个方向
  21.   #--------------------------------------------------------------------------
  22.   def move_eight_dir(d)
  23.     move_diagonal(d + 3,2) if d == 1 || d == 3
  24.     move_diagonal(d - 3,8) if d == 7 || d == 9
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 八方向按键
  28.   #--------------------------------------------------------------------------
  29.   def move_by_input
  30.     return if !movable? || $game_map.interpreter.running?
  31.     case Input.dir8
  32.      when 1,3,7,9;  move_eight_dir(Input.dir8)
  33.      when 2,4,6,8;  move_straight(Input.dir4)
  34.     end
  35.   end
  36.   #--------------------------------------------------------------------------
  37.   # ● 斜向移动
  38.   #     horz : 横向(4 or 6)
  39.   #     vert : 纵向(2 or 8)
  40.   #--------------------------------------------------------------------------
  41.   def move_diagonal(horz, vert)
  42.     @followers.move if diagonal_passable?(@x, @y, horz, vert)
  43.     @move_succeed = diagonal_passable?(x, y, horz, vert)
  44.     last_steps = $game_party.steps
  45.     if @move_succeed
  46.       @x = $game_map.round_x_with_direction(@x, horz)
  47.       @y = $game_map.round_y_with_direction(@y, vert)
  48.       @real_x = $game_map.x_with_direction(@x, reverse_dir(horz))
  49.       @real_y = $game_map.y_with_direction(@y, reverse_dir(vert))
  50.       increase_steps
  51.       # 八方向移动正确步数计算
  52.       if $game_party.steps - last_steps == 2
  53.         $game_party.decrease_steps
  54.       end
  55.     end
  56.     set_direction(2) if horz == 4 && vert == 2
  57.     set_direction(4) if horz == 4 && vert == 8
  58.     set_direction(6) if horz == 6 && vert == 2
  59.     set_direction(8) if horz == 6 && vert == 8
  60.   end
  61. end
  62. #==============================================================================
  63. # ■ Game_Party
  64. #==============================================================================
  65. class Game_Party < Game_Unit
  66.   def decrease_steps
  67.     @steps -= 1
  68.   end
  69. end
  70. #==============================================================================
  71. # ■ Sprite_Character
  72. #==============================================================================
  73. class Sprite_Character < Sprite_Base
  74.   #--------------------------------------------------------------------------
  75.   # ● 更新源位图(Source Bitmap)
  76.   #--------------------------------------------------------------------------
  77.   alias update_bitmap_8dir update_bitmap
  78.   def update_bitmap
  79.     update_bitmap_8dir
  80.     if @tile_id > 0            
  81.       @enable_slant = false
  82.       return
  83.     end
  84.     unless graphic_changed?
  85.      @enable_slant = true
  86.    end
  87.  
  88.     begin
  89.       @character_name_slant = "#{@character_name}_8D"
  90.       Cache.character(@character_name_slant)  
  91.     rescue
  92.       @enable_slant = false
  93.     end
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 更新源矩形
  97.   #--------------------------------------------------------------------------
  98.   alias update_src_rect_8dir update_src_rect  
  99.   def update_src_rect
  100.     return if @tile_id > 0      
  101.     if @enable_slant && @character != $game_map.events
  102.       update_src_rect_for_slant
  103.     else
  104.       update_src_rect_8dir
  105.     end
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● 更新斜方向传送矩形
  109.   #--------------------------------------------------------------------------
  110.   def update_src_rect_for_slant
  111.     index = @character.character_index
  112.     pattern = @character.pattern < 3 ? @character.pattern : 1
  113.     sx = (index % 4 * 3 + pattern) * @cw
  114.     case Input.dir8 % 2
  115.     when 0  # 上下左右
  116.       if @last_slant
  117.         self.bitmap = Cache.character(@character_name)
  118.         @last_slant = false
  119.       end
  120.     else   
  121.       unless @last_slant
  122.         self.bitmap = Cache.character(@character_name_slant)
  123.         @last_slant = true
  124.       end
  125.     end
  126.       sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
  127.     self.src_rect.set(sx, sy, @cw, @ch)
  128.   end
  129. end

附件: 8fangxiang.zip (330.59 KB, 下载次数: 2225) dll自备
作者: sszny    时间: 2012-7-22 16:53
好 好 十分之好
不过怎样才能添加单方向的帧数呢 ,3帧总感觉太假啊、
作者: 荷包PIG蛋    时间: 2012-7-22 17:13
嘎嘎!!铅笔居然还是一个超级脚本触。。。
看来有空可以找You专门定制脚本了(喂喂XD
好吧。。。帮我做的那个事件标题还是谢谢你了哈~~
作者: sszny    时间: 2012-7-22 19:34
我用了之后,突然变得巨卡 (我放了不少动态景物之类的)

作者: 明特·布兰马修    时间: 2012-7-22 23:56
原创支持
不过这样的八方向会不会拖慢游戏的速度?
实用性强不?
作者: 曉磊    时间: 2012-7-23 16:50
支持楼主,太棒了,
多谢多谢啊,抱走啦~
找时间也得学学脚本什么的..总感觉好难的说~
作者: 梦到叶子了    时间: 2013-3-5 20:20
用了之后很卡,不建议使用。。。。。建议LZ优化一下 原本50帧的游戏运速,一下子降低到了10几帧。
作者: yujunliang550    时间: 2013-4-1 15:28
运行不了,只能打开工程,rgss300.dll缺少
作者: boby1999    时间: 2013-7-9 01:18
真的可以在RMVA中使用,并且与改变行走图帧数脚本不冲突。多谢!
作者: Sion    时间: 2013-12-16 20:55
本帖最后由 Sion 于 2014-4-18 13:39 编辑

帮你优化了一下:
  1. #===============================================================================
  2. #  八方向行走
  3. #    by:铅笔描绘的思念
  4. #    在Characters里添加八方向行走图(命名规范:在四方向上的基础上+_8D)
  5. #    行走动画就为8方向的。否则就会原4方向的代替8方向的。
  6. #
  7. #    八方向:数字键盘方向对应的数字
  8. #     7   8   9
  9. #      ↖ ↑ ↗
  10. #     4← 0 →6
  11. #      ↙ ↓ ↘
  12. #     1   2   3
  13. #===============================================================================

  14. class Game_Player
  15.   def move_by_input
  16.     return if !movable? || $game_map.interpreter.running?
  17.     case Input.dir8
  18.     when 2,4,6,8; move_straight(Input.dir8)
  19.     when 1; move_diagonal(4, 2)
  20.     when 3; move_diagonal(6, 2)
  21.     when 7; move_diagonal(4, 8)
  22.     when 9; move_diagonal(6, 8)
  23.     end
  24.   end
  25. end

  26. class Game_CharacterBase

  27.   def move_diagonal(horz, vert)
  28.     @move_succeed = diagonal_passable?(x, y, horz, vert)
  29.     if @move_succeed
  30.       @x = $game_map.round_x_with_direction(@x, horz)
  31.       @y = $game_map.round_y_with_direction(@y, vert)
  32.       @real_x = $game_map.x_with_direction(@x, reverse_dir(horz))
  33.       @real_y = $game_map.y_with_direction(@y, reverse_dir(vert))
  34.       increase_steps
  35.     end
  36.     if horz == 4
  37.       vert == 2 ? set_direction(1) : set_direction(7)
  38.     else
  39.       vert == 2 ? set_direction(3) : set_direction(9)
  40.     end
  41.   end
  42. end

  43. class Sprite_Character < Sprite_Base
  44.   def dispose
  45.      bitmap.dispose if @_8d
  46.      super
  47.   end
  48.   def set_character_bitmap
  49.     if File.exist?("Graphics/Characters/#{@character_name}_8D.png")
  50.       @_8d = true
  51.       bitmap1 = Cache.character(@character_name)
  52.       bitmap2 = Cache.character(@character_name + "_8D")
  53.       width = bitmap1.width
  54.       height = bitmap1.height
  55.       rect = Rect.new(0, 0, width, height)
  56.       self.bitmap = Bitmap.new(width * 2, height * 2)
  57.       self.bitmap.blt(0, 0, bitmap1, rect)
  58.       self.bitmap.blt(width, 0, bitmap2, rect)
  59.       sign = @character_name[/^[\!\$]./]
  60.       if sign && sign.include?("$")
  61.         @cw = width / 3
  62.         @ch = height / 4
  63.       else
  64.         @cw = width / 12
  65.         @ch = height / 8
  66.       end
  67.       self.ox = @cw / 2
  68.       self.oy = @ch
  69.     else
  70.       self.bitmap = Cache.character(@character_name)
  71.       sign = @character_name[/^[\!\$]./]
  72.       if sign && sign.include?("$")
  73.         @cw = bitmap.width / 3
  74.         @ch = bitmap.height / 4
  75.       else
  76.         @cw = bitmap.width / 12
  77.         @ch = bitmap.height / 8
  78.       end
  79.       self.ox = @cw / 2
  80.       self.oy = @ch
  81.     end
  82.   end

  83.   def update_src_rect
  84.     return if @tile_id != 0
  85.     index = @character.character_index
  86.     pattern = @character.pattern < 3 ? @character.pattern : 1
  87.     sx = (index % 4 * 3 + pattern) * @cw
  88.     if @character.direction % 2 == 1
  89.       sx += self.bitmap.width / 2 if @_8d
  90.       row = case @character.direction
  91.       when 1; 0
  92.       when 3; 2
  93.       when 7; 1
  94.       when 9; 3
  95.       end
  96.       sy = (index / 4 * 4 + row) * @ch
  97.     else
  98.       sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
  99.     end
  100.     self.src_rect.set(sx, sy, @cw, @ch)
  101.   end
  102. end
复制代码





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