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

Project1

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

[原创发布] 秋千和NPC

[复制链接]

Lv5.捕梦者

梦石
0
星屑
34870
在线时间
4148 小时
注册时间
2007-12-15
帖子
9981
跳转到指定楼层
1
发表于 2017-10-9 15:25:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 89444640 于 2017-10-9 15:27 编辑

先是用默认的矿山原件改了个

做好后发现回头弄地图动作略麻烦,非常可能出现穿透异常。而且这个属于二次加工。还是自己画吧。

于是又做了个小的,配色使用体育彩票健身器材配色 亮色调红蓝黄,


最开始是4帧的,发现不行,连贯度太差,于是改成8帧


但是这个必须配合一个叫动画N的改造脚本
我搜了半天也没找到是我哪个帖子里面谁帮我解决的了。
脚本如下。请原作者联系我,我去标注一下,非常感谢。

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Game_Character (分割定义 2)
  3. #------------------------------------------------------------------------------
  4. #  处理角色的类。本类作为 Game_Player 类与 Game_Event
  5. # 类的超级类使用。
  6. #所有包含以 【动画N】词的行走图可超4帧循环播放,素材高度与长度相等。
  7. #==============================================================================
  8.  
  9. class Game_Character
  10.   #--------------------------------------------------------------------------
  11.   # ● 刷新画面
  12.   #--------------------------------------------------------------------------
  13.   def update
  14.     # 跳跃中、移动中、停止中的分支
  15.     if jumping?
  16.       update_jump
  17.     elsif moving?
  18.       update_move
  19.     else
  20.       update_stop
  21.     end
  22.     # 动画计数超过最大值的情况下
  23.     # ※最大值等于基本值减去移动速度 * 1 的值
  24.     if @anime_count > 18 - @move_speed * 2
  25.       # 停止动画为 OFF 并且在停止中的情况下
  26.       if not @step_anime and @stop_count > 0
  27.         # 还原为原来的图形
  28.         @pattern = @original_pattern
  29.       # 停止动画为 ON 并且在移动中的情况下
  30.       else
  31.         # 更新图形
  32.          if @character_name.include?("动画")
  33.         zhenshu = /动画/.match(@character_name).post_match
  34.         zhenshu = zhenshu.to_f
  35.           @pattern = (@pattern + 1) % zhenshu
  36.         else
  37.           @pattern = (@pattern + 1) % 4
  38.         end
  39.       end
  40.       # 清除动画计数
  41.       @anime_count = 0
  42.     end
  43.     # 等待中的情况下
  44.     if @wait_count > 0
  45.       # 减少等待计数
  46.       @wait_count -= 1
  47.       return
  48.     end
  49.     # 强制移动路线的场合
  50.     if @move_route_forcing
  51.       # 自定义移动
  52.       move_type_custom
  53.       return
  54.     end
  55.     # 事件执行待机中并且为锁定状态的情况下
  56.     if @starting or lock?
  57.       # 不做规则移动
  58.       return
  59.     end
  60.     # 如果停止计数超过了一定的值(由移动频度算出)
  61.     if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
  62.       # 移动类型分支
  63.       case @move_type
  64.       when 1  # 随机
  65.         move_type_random
  66.       when 2  # 接近
  67.         move_type_toward_player
  68.       when 3  # 自定义
  69.         move_type_custom
  70.       end
  71.     end
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 更新画面 (跳跃)
  75.   #--------------------------------------------------------------------------
  76.   def update_jump
  77.     # 跳跃计数减 1
  78.     @jump_count -= 1
  79.     # 计算新坐标
  80.     @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
  81.     @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 更新画面 (移动)
  85.   #--------------------------------------------------------------------------
  86.   def update_move
  87.     # 移动速度转换为地图坐标系的移动距离
  88.     distance = 2 ** @move_speed
  89.     # 理论坐标在实际坐标下方的情况下
  90.     if @y * 128 > @real_y
  91.       # 向下移动
  92.       @real_y = [@real_y + distance, @y * 128].min
  93.     end
  94.     # 理论坐标在实际坐标左方的情况下
  95.     if @x * 128 < @real_x
  96.       # 向左移动
  97.       @real_x = [@real_x - distance, @x * 128].max
  98.     end
  99.     # 理论坐标在实际坐标右方的情况下
  100.     if @x * 128 > @real_x
  101.       # 向右移动
  102.       @real_x = [@real_x + distance, @x * 128].min
  103.     end
  104.     # 理论坐标在实际坐标上方的情况下
  105.     if @y * 128 < @real_y
  106.       # 向上移动
  107.       @real_y = [@real_y - distance, @y * 128].max
  108.     end
  109.     # 移动时动画为 ON 的情况下
  110.     if @walk_anime
  111.       # 动画计数增加 1.5
  112.       @anime_count += 1.5
  113.     # 移动时动画为 OFF、停止时动画为 ON 的情况下
  114.     elsif @step_anime
  115.       # 动画计数增加 1
  116.       @anime_count += 1
  117.     end
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● 更新画面 (停止)
  121.   #--------------------------------------------------------------------------
  122.   def update_stop
  123.     # 停止时动画为 ON 的情况下
  124.     if @step_anime
  125.       # 动画计数增加 1
  126.       @anime_count += 1
  127.     # 停止时动画为 OFF 并且、现在的图像与原来的不同的情况下
  128.     elsif @pattern != @original_pattern
  129.       # 动画计数增加 1.5
  130.       @anime_count += 1.5
  131.     end
  132.     # 事件执行待机中并且不是锁定状态的情况下
  133.     # ※缩定、处理成立刻停止执行中的事件
  134.     unless @starting or lock?
  135.       # 停止计数增加 1
  136.       @stop_count += 1
  137.     end
  138.   end
  139.   #--------------------------------------------------------------------------
  140.   # ● 移动类型 : 随机
  141.   #--------------------------------------------------------------------------
  142.   def move_type_random
  143.     # 随机 0~5 的分支
  144.     case rand(6)
  145.     when 0..3  # 随机
  146.       move_random
  147.     when 4  # 前进一步
  148.       move_forward
  149.     when 5  # 暂时停止
  150.       @stop_count = 0
  151.     end
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ● 移动类型 : 接近
  155.   #--------------------------------------------------------------------------
  156.   def move_type_toward_player
  157.     # 求得与主角坐标的差
  158.     sx = @x - $game_player.x
  159.     sy = @y - $game_player.y
  160.     # 求得差的绝对值
  161.     abs_sx = sx > 0 ? sx : -sx
  162.     abs_sy = sy > 0 ? sy : -sy
  163.     # 如果纵横共计离开 20 个元件
  164.     if sx + sy >= 20
  165.       # 随机
  166.       move_random
  167.       return
  168.     end
  169.     # 随机 0~5 的分支
  170.     case rand(6)
  171.     when 0..3  # 接近主角
  172.       move_toward_player
  173.     when 4  # 随机
  174.       move_random
  175.     when 5  # 前进一步
  176.       move_forward
  177.     end
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ● 移动类型 : 自定义
  181.   #--------------------------------------------------------------------------
  182.   def move_type_custom
  183.     # 如果不是停止中就中断
  184.     if jumping? or moving?
  185.       return
  186.     end
  187.     # 如果在移动指令列表最后结束还没到达就循环执行
  188.     while @move_route_index < @move_route.list.size
  189.       # 获取移动指令
  190.       command = @move_route.list[@move_route_index]
  191.       # 指令编号 0 号 (列表最后) 的情况下
  192.       if command.code == 0
  193.         # 选项 [反复动作] 为 ON 的情况下
  194.         if @move_route.repeat
  195.           # 还原为移动路线的最初索引
  196.           @move_route_index = 0
  197.         end
  198.         # 选项 [反复动作] 为 OFF 的情况下
  199.         unless @move_route.repeat
  200.           # 强制移动路线的场合
  201.           if @move_route_forcing and not @move_route.repeat
  202.             # 强制解除移动路线
  203.             @move_route_forcing = false
  204.             # 还原为原始的移动路线
  205.             @move_route = @original_move_route
  206.             @move_route_index = @original_move_route_index
  207.             @original_move_route = nil
  208.           end
  209.           # 清除停止计数
  210.           @stop_count = 0
  211.         end
  212.         return
  213.       end
  214.       # 移动系指令 (向下移动~跳跃) 的情况下
  215.       if command.code <= 14
  216.         # 命令编号分支
  217.         case command.code
  218.         when 1  # 向下移动
  219.           move_down
  220.         when 2  # 向左移动
  221.           move_left
  222.         when 3  # 向右移动
  223.           move_right
  224.         when 4  # 向上移动
  225.           move_up
  226.         when 5  # 向左下移动
  227.           move_lower_left
  228.         when 6  # 向右下移动
  229.           move_lower_right
  230.         when 7  # 向左上移动
  231.           move_upper_left
  232.         when 8  # 向右上
  233.           move_upper_right
  234.         when 9  # 随机移动
  235.           move_random
  236.         when 10  # 接近主角
  237.           move_toward_player
  238.         when 11  # 远离主角
  239.           move_away_from_player
  240.         when 12  # 前进一步
  241.           move_forward
  242.         when 13  # 后退一步
  243.           move_backward
  244.         when 14  # 跳跃
  245.           jump(command.parameters[0], command.parameters[1])
  246.         end
  247.         # 选项 [无视无法移动的情况] 为 OFF 、移动失败的情况下
  248.         if not @move_route.skippable and not moving? and not jumping?
  249.           return
  250.         end
  251.         @move_route_index += 1
  252.         return
  253.       end
  254.       # 等待的情况下
  255.       if command.code == 15
  256.         # 设置等待计数
  257.         @wait_count = command.parameters[0] * 2 - 1
  258.         @move_route_index += 1
  259.         return
  260.       end
  261.       # 朝向变更系指令的情况下
  262.       if command.code >= 16 and command.code <= 26
  263.         # 命令编号分支
  264.         case command.code
  265.         when 16  # 面向下
  266.           turn_down
  267.         when 17  # 面向左
  268.           turn_left
  269.         when 18  # 面向右
  270.           turn_right
  271.         when 19  # 面向上
  272.           turn_up
  273.         when 20  # 向右转 90 度
  274.           turn_right_90
  275.         when 21  # 向左转 90 度
  276.           turn_left_90
  277.         when 22  # 旋转 180 度
  278.           turn_180
  279.         when 23  # 从右向左转 90 度
  280.           turn_right_or_left_90
  281.         when 24  # 随机变换方向
  282.           turn_random
  283.         when 25  # 面向主角的方向
  284.           turn_toward_player
  285.         when 26  # 背向主角的方向
  286.           turn_away_from_player
  287.         end
  288.         @move_route_index += 1
  289.         return
  290.       end
  291.       # 其它指令的场合
  292.       if command.code >= 27
  293.         # 命令编号分支
  294.         case command.code
  295.         when 27  # 开关 ON
  296.           $game_switches[command.parameters[0]] = true
  297.           $game_map.need_refresh = true
  298.         when 28  # 开关 OFF
  299.           $game_switches[command.parameters[0]] = false
  300.           $game_map.need_refresh = true
  301.         when 29  # 更改移动速度
  302.           @move_speed = command.parameters[0]
  303.         when 30  # 更改移动频度
  304.           @move_frequency = command.parameters[0]
  305.         when 31  # 移动时动画 ON
  306.           @walk_anime = true
  307.         when 32  # 移动时动画 OFF
  308.           @walk_anime = false
  309.         when 33  # 停止时动画 ON
  310.           @step_anime = true
  311.         when 34  # 停止时动画 OFF
  312.           @step_anime = false
  313.         when 35  # 朝向固定 ON
  314.           @direction_fix = true
  315.         when 36  # 朝向固定 OFF
  316.           @direction_fix = false
  317.         when 37  # 穿透 ON
  318.           @through = true
  319.         when 38  # 穿透 OFF
  320.           @through = false
  321.         when 39  # 在最前面显示 ON
  322.           @always_on_top = true
  323.         when 40  # 在最前面显示 OFF
  324.           @always_on_top = false
  325.         when 41  # 更改图形
  326.           @tile_id = 0
  327.           @character_name = command.parameters[0]
  328.           @character_hue = command.parameters[1]
  329.           if @original_direction != command.parameters[2]
  330.             @direction = command.parameters[2]
  331.             @original_direction = @direction
  332.             @prelock_direction = 0
  333.           end
  334.           if @original_pattern != command.parameters[3]
  335.             @pattern = command.parameters[3]
  336.             @original_pattern = @pattern
  337.           end
  338.         when 42  # 不更改不透明度
  339.           @opacity = command.parameters[0]
  340.         when 43  # 更改合成方式
  341.           @blend_type = command.parameters[0]
  342.         when 44  # 演奏 SE
  343.           $game_system.se_play(command.parameters[0])
  344.         when 45  # 脚本
  345.           result = eval(command.parameters[0])
  346.         end
  347.         @move_route_index += 1
  348.       end
  349.     end
  350.   end
  351.   #--------------------------------------------------------------------------
  352.   # ● 增加步数
  353.   #--------------------------------------------------------------------------
  354.   def increase_steps
  355.     # 清除停止步数
  356.     @stop_count = 0
  357.   end
  358. end



然后继续图像
添加了特定的npc,也是专属类型,只此一个。


然后脑洞又开始收不住了,继续添加了此npc的一些可能出现的动作。静态如下



动态……



下面是更重要的制作过程,知其然要知其所以然。
直线柱子不说了吧,秋千,这种透视摆动,实在想不出来可以用一本书+一个苹果比划,观察透视的遮挡,当秋千摆动到后面时,人物的头部 就是苹果会遮挡住很大一部分书,而且头顶所占的画面比例会变大。
当人物摆动到靠前的位置时,秋千底部会遮挡住大部分人物,但是人物是有脚的,脚会遮挡住秋千而腿部一定要找准膝盖的位置,否则会显得人物没有大腿变成扁片。而且这种透视理论上是看不到脸的,但是为了好看,要画出脸的位置,扩大下巴所占脸部的比例并且打阴影,缩小头发所占比例。

观察第一个gif,我特意把秋千降到最低点的时间缩短为0.05s,因为按照自然规律,摆锤运动到最低点时候速度最快。所以通过时间最短。

理论上,如果不考虑时间成本按照动画描绘方式,此这个动作应该需要12帧。
以横版朝向为例
1左慢 2左中 3左快 4最低点 5右快 6右中 7右慢 8右中 9右快 10最低点 11左快 12左中
这样一个循环才完成 ,但是我感觉没必要画12帧了,除非时间有的是。

人物绘制 XP默认大小的标准是,从简,便于自己绘制动作,部分动作以可绘制4帧循环为标准。

评分

参与人数 3+3 收起 理由
congwsbn + 1 塞糖
wildprophecy + 1 塞糖
moy + 1 塞糖

查看全部评分

Lv1.梦旅人

梦石
0
星屑
52
在线时间
2 小时
注册时间
2017-10-6
帖子
11
2
发表于 2017-10-9 20:55:04 | 只看该作者
矿山的那个很有rm的味道啊哈哈,话说甩这么快不怕把人甩出去吗

点评

哈哈哈安全教育是什么鬼啦,不过楼主点的像素确实挺好的  发表于 2017-10-10 22:24
这个还好啦,我本来还想画个转一圈的和转到一半动能不够掉下来的,后来想想,我又不做安全教育类游戏,就没画。  发表于 2017-10-10 09:59
大家好,我是我爱君的小小号b( ̄▽ ̄)d 
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

  /) /)<

梦石
0
星屑
4207
在线时间
4890 小时
注册时间
2009-2-16
帖子
8434

开拓者短篇七成年组季军

3
发表于 2017-10-11 10:33:10 | 只看该作者
秋千下面的阴影 1是我觉得还是方形阴影好
2是秋千在从低变高的时候阴影的移动速度是会越来越缓的 图里没体现出来

评分

参与人数 1+1 收起 理由
89444640 + 1 非常感谢指出不足之处

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
34870
在线时间
4148 小时
注册时间
2007-12-15
帖子
9981
4
 楼主| 发表于 2017-10-11 11:14:29 | 只看该作者
本帖最后由 89444640 于 2017-10-11 11:40 编辑
天使喝可乐 发表于 2017-10-11 10:33
秋千下面的阴影 1是我觉得还是方形阴影好
2是秋千在从低变高的时候阴影的移动速度是会越来越缓的 图里没体 ...

刚才回去把gif弄回psd看了一下,确实运动规律略生硬,就算是8帧还是能做出加速度表现的。我还以为得12帧 按照钟摆4321234这么摆动,平时一直都不画影子没注意到,多谢提醒。如果输想要表现出有最高点滞留,那就只能再多加一帧,但是这个角度变化,我感觉较为困…………我只能说试试,没准比现在效果还差。
修正了一下,但是影子只能是长条,方形不好看,感觉实际上如果有垂直光照,板凳下的影子边缘也接近圆形,因为有散射光,而不会出现标准的的正方形。

抓紧时间试了一下,因为这个人物小角度透视我实在不行,所以人物就没做角度变化,向前移动时只改了一点腿的位置变化,试图表现仰角变得更高。增加了2帧小角度位移。最低点通过时间不变。
明显更符合物理规律了,但是,还是变成了12帧--b本来想8帧就算了,这回没人的可惨了,还得修理一遍,而且多出了两张图,如果是8帧,可以在一张图上正好放下主角在前面推和在后面推两种情况……ORZ

不过话说……我突然想起个事情,是不是…………往前移动的时候腿应该往前伸以获得更大的动能?…………我这个腿画成向后勾了…………不过那个好像是一个人玩的情况……如果后面有人推应该没事吧?





点评

_(=ΦωΦ=」∠)_但是人在最高的时候都没变大,影子为啥要变小  发表于 2017-10-11 21:26
这样说的话,随着荡到最高点,影子不应该相对变小嘛  发表于 2017-10-11 18:59

评分

参与人数 1+1 收起 理由
天使喝可乐 + 1 醋瞎 完美的一匹

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 09:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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