我正在尝试使用SDL(c ++)为图片生成动画(320宽度,64高度),每帧64×64。
我的问题是我的整个画面(320×64)被挤压在64×64的空间中,而不是每帧显示。
我有一个AnimatedSprite类,用于使用Draw()
方法绘制动画-(BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
[super continueTrackingWithTouch:touch withEvent:event];
CGPoint lastPoint = [touch locationInView:self];
float _currentValueTemp = [self valueFromAngle];
if(_currentValueTemp <= 0.8 || _currentValueTemp >= _maximumValue){
return YES;
}
[self moveHandle:lastPoint];
[self sendActionsForControlEvents:UIControlEventValueChanged];
return YES;
}
DrawAnimatedSprite方法就是这样,
AnimatedSprite::Draw(BackBuffer& backbuffer)
{
//set frame width
this->SetFrameWidth(64);
//set x coordinate
this->SetX(frameCoordinateContainer[m_currentFrame-1]);
backbuffer.DrawAnimatedSprite(*this);
}
所以任何人都知道哪里可能出错了? 谢谢!
答案 0 :(得分:1)
int SDL_RenderCopy(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect)
您将fillRect
传递给dstrect
,而不是srcrect
。
答案 1 :(得分:1)
问题确实与你使用SDL_RenderCopy的方式有关,但是你应该提供一个srcrect和一个dstrect,一个是你想要渲染你的图像的目的地,另一个是你的图像的一部分你希望在那里渲染的纹理。
例如,如果您的精灵表是(320×64),精灵大小为(64x64)并且您想要在 fillRect的坐标(x,y)处打印屏幕上的第一帧你应该做这样的事情:
SDL_Rect clip;
clip.x = 0;
clip.y = 0;
clip.w = 64;
clip.h = 64;
SDL_Rect fillRect;
fillRect.x = animatedSprite.GetX();
fillRect.y = animatedSprite.GetY();
fillRect.w = animatedSprite.getFrameWidth();
fillRect.h = animatedSprite.GetHeight();
SDL_RenderCopy(m_pRenderer, animatedSprite.GetTexture()->GetTexture(), &clip, &fillRect);
希望这有帮助。