查看: 4432|回复: 7

[原创发布] 秋千和NPC

[复制链接]
梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2017-10-9 15:25:58 | 显示全部楼层 |阅读模式

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

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

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

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

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

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


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

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

[pre lang="ruby"]#==============================================================================
# ■ Game_Character (分割定义 2)
#------------------------------------------------------------------------------
#  处理角色的类。本类作为 Game_Player 类与 Game_Event
# 类的超级类使用。
#所有包含以 【动画N】词的行走图可超4帧循环播放,素材高度与长度相等。
#==============================================================================

class Game_Character
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 跳跃中、移动中、停止中的分支
    if jumping?
      update_jump
    elsif moving?
      update_move
    else
      update_stop
    end
    # 动画计数超过最大值的情况下
    # ※最大值等于基本值减去移动速度 * 1 的值
    if @anime_count > 18 - @move_speed * 2
      # 停止动画为 OFF 并且在停止中的情况下
      if not @step_anime and @stop_count > 0
        # 还原为原来的图形
        @pattern = @original_pattern
      # 停止动画为 ON 并且在移动中的情况下
      else
        # 更新图形
         if @character_name.include?("动画")
        zhenshu = /动画/.match(@character_name).post_match
        zhenshu = zhenshu.to_f
          @pattern = (@pattern + 1) % zhenshu
        else
          @pattern = (@pattern + 1) % 4
        end
      end
      # 清除动画计数
      @anime_count = 0
    end
    # 等待中的情况下
    if @wait_count > 0
      # 减少等待计数
      @wait_count -= 1
      return
    end
    # 强制移动路线的场合
    if @move_route_forcing
      # 自定义移动
      move_type_custom
      return
    end
    # 事件执行待机中并且为锁定状态的情况下
    if @starting or lock?
      # 不做规则移动
      return
    end
    # 如果停止计数超过了一定的值(由移动频度算出)
    if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
      # 移动类型分支
      case @move_type
      when 1  # 随机
        move_type_random
      when 2  # 接近
        move_type_toward_player
      when 3  # 自定义
        move_type_custom
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新画面 (跳跃)
  #--------------------------------------------------------------------------
  def update_jump
    # 跳跃计数减 1
    @jump_count -= 1
    # 计算新坐标
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
  end
  #--------------------------------------------------------------------------
  # ● 更新画面 (移动)
  #--------------------------------------------------------------------------
  def update_move
    # 移动速度转换为地图坐标系的移动距离
    distance = 2 ** @move_speed
    # 理论坐标在实际坐标下方的情况下
    if @y * 128 > @real_y
      # 向下移动
      @real_y = [@real_y + distance, @y * 128].min
    end
    # 理论坐标在实际坐标左方的情况下
    if @x * 128 < @real_x
      # 向左移动
      @real_x = [@real_x - distance, @x * 128].max
    end
    # 理论坐标在实际坐标右方的情况下
    if @x * 128 > @real_x
      # 向右移动
      @real_x = [@real_x + distance, @x * 128].min
    end
    # 理论坐标在实际坐标上方的情况下
    if @y * 128 < @real_y
      # 向上移动
      @real_y = [@real_y - distance, @y * 128].max
    end
    # 移动时动画为 ON 的情况下
    if @walk_anime
      # 动画计数增加 1.5
      @anime_count += 1.5
    # 移动时动画为 OFF、停止时动画为 ON 的情况下
    elsif @step_anime
      # 动画计数增加 1
      @anime_count += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新画面 (停止)
  #--------------------------------------------------------------------------
  def update_stop
    # 停止时动画为 ON 的情况下
    if @step_anime
      # 动画计数增加 1
      @anime_count += 1
    # 停止时动画为 OFF 并且、现在的图像与原来的不同的情况下
    elsif @pattern != @original_pattern
      # 动画计数增加 1.5
      @anime_count += 1.5
    end
    # 事件执行待机中并且不是锁定状态的情况下
    # ※缩定、处理成立刻停止执行中的事件
    unless @starting or lock?
      # 停止计数增加 1
      @stop_count += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动类型 : 随机
  #--------------------------------------------------------------------------
  def move_type_random
    # 随机 0~5 的分支
    case rand(6)
    when 0..3  # 随机
      move_random
    when 4  # 前进一步
      move_forward
    when 5  # 暂时停止
      @stop_count = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动类型 : 接近
  #--------------------------------------------------------------------------
  def move_type_toward_player
    # 求得与主角坐标的差
    sx = @x - $game_player.x
    sy = @y - $game_player.y
    # 求得差的绝对值
    abs_sx = sx > 0 ? sx : -sx
    abs_sy = sy > 0 ? sy : -sy
    # 如果纵横共计离开 20 个元件
    if sx + sy >= 20
      # 随机
      move_random
      return
    end
    # 随机 0~5 的分支
    case rand(6)
    when 0..3  # 接近主角
      move_toward_player
    when 4  # 随机
      move_random
    when 5  # 前进一步
      move_forward
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动类型 : 自定义
  #--------------------------------------------------------------------------
  def move_type_custom
    # 如果不是停止中就中断
    if jumping? or moving?
      return
    end
    # 如果在移动指令列表最后结束还没到达就循环执行
    while @move_route_index < @move_route.list.size
      # 获取移动指令
      command = @move_route.list[@move_route_index]
      # 指令编号 0 号 (列表最后) 的情况下
      if command.code == 0
        # 选项 [反复动作] 为 ON 的情况下
        if @move_route.repeat
          # 还原为移动路线的最初索引
          @move_route_index = 0
        end
        # 选项 [反复动作] 为 OFF 的情况下
        unless @move_route.repeat
          # 强制移动路线的场合
          if @move_route_forcing and not @move_route.repeat
            # 强制解除移动路线
            @move_route_forcing = false
            # 还原为原始的移动路线
            @move_route = @original_move_route
            @move_route_index = @original_move_route_index
            @original_move_route = nil
          end
          # 清除停止计数
          @stop_count = 0
        end
        return
      end
      # 移动系指令 (向下移动~跳跃) 的情况下
      if command.code <= 14
        # 命令编号分支
        case command.code
        when 1  # 向下移动
          move_down
        when 2  # 向左移动
          move_left
        when 3  # 向右移动
          move_right
        when 4  # 向上移动
          move_up
        when 5  # 向左下移动
          move_lower_left
        when 6  # 向右下移动
          move_lower_right
        when 7  # 向左上移动
          move_upper_left
        when 8  # 向右上
          move_upper_right
        when 9  # 随机移动
          move_random
        when 10  # 接近主角
          move_toward_player
        when 11  # 远离主角
          move_away_from_player
        when 12  # 前进一步
          move_forward
        when 13  # 后退一步
          move_backward
        when 14  # 跳跃
          jump(command.parameters[0], command.parameters[1])
        end
        # 选项 [无视无法移动的情况] 为 OFF 、移动失败的情况下
        if not @move_route.skippable and not moving? and not jumping?
          return
        end
        @move_route_index += 1
        return
      end
      # 等待的情况下
      if command.code == 15
        # 设置等待计数
        @wait_count = command.parameters[0] * 2 - 1
        @move_route_index += 1
        return
      end
      # 朝向变更系指令的情况下
      if command.code >= 16 and command.code <= 26
        # 命令编号分支
        case command.code
        when 16  # 面向下
          turn_down
        when 17  # 面向左
          turn_left
        when 18  # 面向右
          turn_right
        when 19  # 面向上
          turn_up
        when 20  # 向右转 90 度
          turn_right_90
        when 21  # 向左转 90 度
          turn_left_90
        when 22  # 旋转 180 度
          turn_180
        when 23  # 从右向左转 90 度
          turn_right_or_left_90
        when 24  # 随机变换方向
          turn_random
        when 25  # 面向主角的方向
          turn_toward_player
        when 26  # 背向主角的方向
          turn_away_from_player
        end
        @move_route_index += 1
        return
      end
      # 其它指令的场合
      if command.code >= 27
        # 命令编号分支
        case command.code
        when 27  # 开关 ON
          $game_switches[command.parameters[0]] = true
          $game_map.need_refresh = true
        when 28  # 开关 OFF
          $game_switches[command.parameters[0]] = false
          $game_map.need_refresh = true
        when 29  # 更改移动速度
          @move_speed = command.parameters[0]
        when 30  # 更改移动频度
          @move_frequency = command.parameters[0]
        when 31  # 移动时动画 ON
          @walk_anime = true
        when 32  # 移动时动画 OFF
          @walk_anime = false
        when 33  # 停止时动画 ON
          @step_anime = true
        when 34  # 停止时动画 OFF
          @step_anime = false
        when 35  # 朝向固定 ON
          @direction_fix = true
        when 36  # 朝向固定 OFF
          @direction_fix = false
        when 37  # 穿透 ON
          @through = true
        when 38  # 穿透 OFF
          @through = false
        when 39  # 在最前面显示 ON
          @always_on_top = true
        when 40  # 在最前面显示 OFF
          @always_on_top = false
        when 41  # 更改图形
          @tile_id = 0
          @character_name = command.parameters[0]
          @character_hue = command.parameters[1]
          if @original_direction != command.parameters[2]
            @direction = command.parameters[2]
            @original_direction = @direction
            @prelock_direction = 0
          end
          if @original_pattern != command.parameters[3]
            @pattern = command.parameters[3]
            @original_pattern = @pattern
          end
        when 42  # 不更改不透明度
          @opacity = command.parameters[0]
        when 43  # 更改合成方式
          @blend_type = command.parameters[0]
        when 44  # 演奏 SE
          $game_system.se_play(command.parameters[0])
        when 45  # 脚本
          result = eval(command.parameters[0])
        end
        @move_route_index += 1
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 增加步数
  #--------------------------------------------------------------------------
  def increase_steps
    # 清除停止步数
    @stop_count = 0
  end
end
[/pre]


然后继续图像
添加了特定的npc,也是专属类型,只此一个。
秋千-有人.gif

然后脑洞又开始收不住了,继续添加了此npc的一些可能出现的动作。静态如下
NPC 小孩 红绿眼粉毛萝莉02行走.png

NPC 小孩 红绿眼粉毛萝莉03.png
动态……
1.gif


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

观察第一个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 塞糖

查看全部评分

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

点评

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

使用道具 举报

  /) /)<

梦石
0
星屑
4262
在线时间
4894 小时
注册时间
2009-2-16
回帖
8198

超评测评委开拓者短篇七成年组季军

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

评分

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

查看全部评分

回复

使用道具 举报

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

刚才回去把gif弄回psd看了一下,确实运动规律略生硬,就算是8帧还是能做出加速度表现的。我还以为得12帧 按照钟摆4321234这么摆动,平时一直都不画影子没注意到,多谢提醒。如果输想要表现出有最高点滞留,那就只能再多加一帧,但是这个角度变化,我感觉较为困…………我只能说试试,没准比现在效果还差。
修正了一下,但是影子只能是长条,方形不好看,感觉实际上如果有垂直光照,板凳下的影子边缘也接近圆形,因为有散射光,而不会出现标准的的正方形。
秋千-有人.gif
抓紧时间试了一下,因为这个人物小角度透视我实在不行,所以人物就没做角度变化,向前移动时只改了一点腿的位置变化,试图表现仰角变得更高。增加了2帧小角度位移。最低点通过时间不变。
明显更符合物理规律了,但是,还是变成了12帧--b本来想8帧就算了,这回没人的可惨了,还得修理一遍,而且多出了两张图,如果是8帧,可以在一张图上正好放下主角在前面推和在后面推两种情况……ORZ
秋千-有人3.gif
不过话说……我突然想起个事情,是不是…………往前移动的时候腿应该往前伸以获得更大的动能?…………我这个腿画成向后勾了…………不过那个好像是一个人玩的情况……如果后面有人推应该没事吧?





点评

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

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部