我正在为自己构建一个API来进行2D骨架动画。
我有一个Bone课程 和一个骷髅课。
Skeleton创建一个根骨,然后通过提供父骨骼,通过Skeleton的add方法添加后续骨骼。
我现在要做的是添加动画和帧。
我在想的是一个可以加载和插入动画的类。所以这将是一个加载动画的对象。然后,它将在每个帧中接收一个Skeleton并相应地修改Skeleton。
这是一个好设计吗?动画是否应该采用Skeleton,或者Skeleton是否应该接受动画并将其应用到自身?
答案 0 :(得分:7)
最好创建一个使用Skeleton而不是相反的动画。这是因为,从逻辑上讲,对象Skeleton不需要动画生存,但动画强烈需要一个Skeleton。 所以你可以在动画本身中耦合这些元素。不要在对象中放入太多逻辑,并尝试将其放在必要的位置。
答案 1 :(得分:1)
据推测,每个骨骼都有一个2d位置/角度,动画是一组框架,每个框架都是骨骼标识符和位置/角度的集合?
然后你可以考虑像
这样的东西public class Skeleton
{
public List<Bone> Bones {get;set;}
public void Animate(Animation animation)
{
foreach(Bone bone in Bones)
{
bone.Displace(animation.Displacements.FirstOrDefault(o=>o.BoneId == bone.BoneID));
}
}
}
答案 2 :(得分:0)
我会创建一个Animation
类,其中包含std::vector<Skeleton>
数据成员,您可以使用该成员操作每个帧上的单个Skeleton
个对象,或者插入多个Skeleton
个对象。从关键帧的矢量。然后,当你“播放”动画时,你只需要迭代向量,调出每个Skeleton
对象,并将其传递给将在屏幕上显示结果的其他函数或类(或做其他任何事情) Skeleton
可用于,例如扭曲网格等。)
拥有一个动画对象可以更容易地操作动画的帧,允许你删除/替换帧等。否则,如果你试图将所有这些功能都集成到一个Skeleton对象中,那么你将会去当试图从动画序列中分别操纵骷髅的各个方面时,发现有很多包袱(即假设你需要为一段帧等改变骷髅的层次结构?等等......那将是非常容易的如果每个帧上都有一个Skeleton,但如果你有一个整体的Skelton对象则没有。)