SDL(C ++)中的动画不正确?

时间:2016-07-31 09:30:53

标签: c++ animation sdl render sdl-2

我正在尝试使用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);
}

所以任何人都知道哪里可能出错了? 谢谢!

2 个答案:

答案 0 :(得分:1)

SDL_RenderCopy

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);

希望这有帮助。