我正在尝试将C#中的Catalin Zima's 2D skeletal animation示例移植到C ++中以学习C ++。
我遇到一个奇怪的错误,我更新了一个shared_ptr的向量,我假设它与内存有关,因为我在代码的三次迭代后才遇到这个错误。
_Block_Type_Is_Valid(pHead-> nBlockUse)
在我的代码中,我使用了一个名为Transformation的类,它包含有关2D变换的数据,如平移,旋转和缩放。然后,关键帧由帧编号和一个这样的转换定义。 Keyframes的集合定义了KeyframeAnimation。最后,SkeletonAnimation是KeyframeAnimations的集合,一个用于骨架中的每个骨骼。
在我的Skeleton类中,我有一个Transformation std::vector<std::shared_ptr<Transform>> _localTransforms;
类型的向量。这个想法是从SkeletonAnimationPlayer设置的,它首先更新当前动画的转换,然后通过播放器上的Apply方法将转换设置到Skeleton上。
//SkeletonAnimationPlayer
std::vector<std::unique_ptr<KeyFrameAnimationState>> _jointAnimations;
void SkeletonAnimationPlayer::Update(float elapsedSeconds)
{
for(auto i = 0; i < _jointAnimations.size(); i++)
{
_jointAnimations[i]->Update(elapsedSeconds);
}
}
void SkeletonAnimationPlayer::Apply(Skeleton& skeleton)
{
for(auto i = 0; i < _jointAnimations.size(); i++)
{
skeleton.SetLocalTransform(i, *_jointAnimations[i]->CurrentKeyFrame);
}
}
//Skeleton
std::vector<std::shared_ptr<Transformation>> _localTransforms;
void Skeleton::SetLocalTransform(int jointIndex, Transformation& transform)
{
//When debugging this line seems to cause the error
_localTransforms[jointIndex] = std::shared_ptr<Transformation>(&transform);
}
//Main
_animationPlayer->Update(deltaTime);
_animationPlayer->Apply(*_skeleton.get());
然而,在主循环的三次迭代之后(第三次调用Apply),我收到以下错误:
_Block_Type_Is_Valid(pHead-&gt; nBlockUse)
我的问题是两部分。我这样做是正确的吗?这个错误意味着什么,为什么我收到它?
我尝试在SetLocalTransform上重置smart_ptr,但仍然收到同样的错误:
_localTransforms[jointIndex].reset(&transform);