查看: 2787|回复: 8

[已经解决] 关于动画随着人物朝向旋转问题

[复制链接]
梦石
0
星屑
55
在线时间
461 小时
注册时间
2014-7-23
回帖
178
发表于 2016-10-13 13:16:01 | 显示全部楼层 |阅读模式

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

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

×
有没有一种让数据库的动画根据人物当前朝向而旋转动画的脚本呢?比如说一个激光的动画,是水平播放的,当人物朝向为上下时,变成的垂直播放。好复杂啊

点评

已经解决  发表于 2016-10-20 11:15
梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2016-10-13 14:09:43 | 显示全部楼层
条件分支,
假如玩家朝向上,则播放动画一,朝向下,则播放动画二,如此类推。
这个激光的动画对应制作四个。
回复

使用道具 举报

梦石
0
星屑
55
在线时间
461 小时
注册时间
2014-7-23
回帖
178
 楼主| 发表于 2016-10-13 23:00:14 | 显示全部楼层
七重 发表于 2016-10-13 14:09
条件分支,
假如玩家朝向上,则播放动画一,朝向下,则播放动画二,如此类推。
这个激光的动画对应制作四个 ...

这个办法。。。。。。。我只是用激光做比喻,是所有的动画都想让他按朝向旋转,而且不单单是玩家的朝向,事件也包括在内。。。
回复

使用道具 举报

梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2016-10-13 23:57:52 | 显示全部楼层
qq546431664 发表于 2016-10-13 23:00
这个办法。。。。。。。我只是用激光做比喻,是所有的动画都想让他按朝向旋转,而且不单单是玩家的朝向, ...


因为楼主既提到动画,又提到事件,所以有点好奇。

我查了下,楼主好像是在用ABS制作ARPG?

那么我猜现在是在制作子弹?

如果是的话。

虽然我也不是很了解abs,不过应该是不用这样麻烦的设定吧

你是打算制作什么一个什么功能需要这个设置?

如果猜错就算了。
回复

使用道具 举报

梦石
0
星屑
55
在线时间
461 小时
注册时间
2014-7-23
回帖
178
 楼主| 发表于 2016-10-14 10:50:05 | 显示全部楼层
七重 发表于 2016-10-13 23:57
因为楼主既提到动画,又提到事件,所以有点好奇。

我查了下,楼主好像是在用ABS制作ARPG?

这都被你发现了呀,其实不是麻烦的设定哦,如果实现了,打击效果将是翻倍的哦,
就像你说的目前的每个制作的子弹都能调用数据库的动画,却因为不会随着朝向而改变动画的方向,所以只能选用一些范围伤害的动画,如果是单方向调用动画的话就很奇怪。
要是真不行的话我去悬赏的问问看
回复

使用道具 举报

梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2016-10-14 11:11:07 | 显示全部楼层
qq546431664 发表于 2016-10-14 10:50
这都被你发现了呀,其实不是麻烦的设定哦,如果实现了,打击效果将是翻倍的哦,
就像你说的目前的每个制 ...

唔

我自己所见的经验的话,一般应该会把子弹制作成事件的。而不用动画控制。

这样设置的好处就是,当子弹前进的时候,实际上他的视觉效果也是随方向自动变化(因为他本质上是个设置好移动路线的事件),不需要自己另外设定。

--
楼主指出的方法我感觉是会牵动很多东西的,但是也许是我水平不够。

我也只能期待其他人给出其他解答。

点评

总之谢谢你了啊  发表于 2016-10-14 11:30
回复

使用道具 举报

梦石
0
星屑
6891
在线时间
7027 小时
注册时间
2013-11-2
回帖
1263

开拓者剧作品鉴家

发表于 2016-10-19 15:47:19 | 显示全部楼层
本帖最后由 RaidenInfinity 于 2016-10-20 11:17 编辑

[pre lang="ruby"]
#地图上动画朝向脚本
#by RaidenInfinity
class Sprite_Character < Sprite_Base
       
        def ani_four_dir #套用四朝向的动画,角色面向哪儿动画就朝向哪儿
                [58] #在这里增加想要套用的动画ID,别忘了逗号 例子:[1,2,3,4]
        end
       
        def ani_two_dir #套用二朝向的动画,面向上或下时不变,左或右等同朝右
                [] #在这里增加想要套用的动画ID,别忘了逗号 例子:[55,66,77,88]
        end
       
        #-----------------------------------------------------------------------------
        #以下的除非你知道你在干嘛,否则请勿触碰!
       
        def char_direction
                @character.direction       
        end

        def char_ani_id
                @character.animation_id
        end
       
        alias :ani_dir_animation_set_sprites :animation_set_sprites
  def animation_set_sprites(frame)
                        if ani_four_dir.include?(char_ani_id)
                                animation_set_sprites_d(frame,0)
                                return
                        elsif ani_two_dir.include?(char_ani_id)
                                animation_set_sprites_d(frame,1)
                                return                       
                        end
                        ani_dir_animation_set_sprites(frame)
  end
       
        def animation_set_sprites_d(frame,type)
    cell_data = frame.cell_data
    @ani_sprites.each_with_index do |sprite, i|
      next unless sprite
      pattern = cell_data[i, 0]
      if !pattern || pattern < 0
        sprite.visible = false
        next
      end
                        #y fix
                        a_x = @ani_ox
                        a_y = @ani_oy
                        a_y -= self.height / 2 if char_direction == 4 || char_direction == 6
                        #y fix end
      sprite.bitmap = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192,
        pattern % 100 / 5 * 192, 192, 192)
      if @ani_mirror
        sprite.x = a_x - cell_data[i, 1]
        sprite.y = a_y + cell_data[i, 2]
        sprite.angle = (360 - cell_data[i, 4])
        sprite.mirror = (cell_data[i, 5] == 0)
      else
        sprite.x = a_x + cell_data[i, 1]
        sprite.y = a_y + cell_data[i, 2]
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
      end
                        #direction change here
                        if type == 0 && char_direction != 8
                                sprite.angle = get_fdir_angle(sprite.angle)
                                coord = get_fdir_coord([sprite.x - a_x,sprite.y - a_y])
                                sprite.x = coord[0] + a_x
                                sprite.y = coord[1] + a_y
                        elsif type == 1 && (char_direction == 4 || char_direction == 6)
                                sprite.angle = get_tdir_angle(sprite.angle)
                                coord = get_tdir_coord([sprite.x - a_x,sprite.y - a_y])
                                sprite.x = coord[0] + a_x
                                sprite.y = coord[1] + a_y               
                        end
                        #direction change end
      sprite.z = self.z + 300 + i
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 100.0
      sprite.zoom_y = cell_data[i, 3] / 100.0
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
  end
       
        def get_fdir_angle(angle)
                case(char_direction)
                        when 4; angle += 90
                        when 6; angle -= 90
                        when 2; angle += 180
                end
                angle = angle - 360 if angle > 360
                angle = 360 - angle if angle < 0
                return angle
        end
       
        def get_tdir_angle(angle)
                angle -= 90
                angle = 360 - angle if angle < 0
                return angle
        end
       
        def get_fdir_coord(vec)
                return m_mult(get_std_mat(char_direction),vec)
        end
       
        def get_tdir_coord(vec)
                return m_mult(get_std_mat(6),vec)
        end
       
        def m_mult(std,vec)
                a = [0,0]
                a[0] = std[0] * vec[0] + std[1] * vec[1]
                a[1] = std[2] * vec[0] + std[3] * vec[1]
                return a
        end
       
        def get_std_mat(direction)
                case(direction)
                        when 4; return [0,1,-1,0]
                        when 6; return [0,-1,1,0]
                        when 2; return [-1,0,0,-1]
                end
                [1,0,0,1]
        end
       
end
[/pre]

MAGIC.

评分

参与人数 1星屑 +250 梦石 +1 收起 理由
怪蜀黍 + 250 + 1 楼主认可的解答

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部