Пример #1
0
const Graphics::Surface *RlfAnimation::getNextFrame() {
	assert(_currentFrame + 1 < (int)_frameCount);

	if (_stream) {
		applyFrameToCurrent(readNextFrame());
	} else {
		applyFrameToCurrent(_currentFrame + 1);
	}

	_currentFrame++;
	return &_currentFrameBuffer;
}
Пример #2
0
void RlfAnimation::seekToFrame(int frameNumber) {
	assert(!_stream);
	assert(frameNumber < (int)_frameCount || frameNumber >= -1);

	if (frameNumber == -1) {
		_currentFrame = -1;
		return;
	}

	int closestFrame = _currentFrame;
	int distance = (int)frameNumber - _currentFrame;
	for (uint i = 0; i < _completeFrames.size(); ++i) {
		int newDistance = (int)frameNumber - (int)(_completeFrames[i]);
		if (newDistance > 0 && (closestFrame == -1 || newDistance < distance)) {
			closestFrame = _completeFrames[i];
			distance = newDistance;
		}
	}

	for (int i = closestFrame; i <= frameNumber; ++i) {
		applyFrameToCurrent(i);
	}

	_currentFrame = frameNumber;
}
Пример #3
0
void RlfAnimation::seekToFrame(int frameNumber) {
	assert(!_stream);
	assert(frameNumber < (int)_frameCount || frameNumber >= -1);

	if (_nextFrame == frameNumber)
		return;

	if (frameNumber < 0) {
		_nextFrame = 0;
		return;
	}

	int closestFrame = _nextFrame;
	int distance = (int)frameNumber - _nextFrame;

	if (distance < 0) {
		for (uint i = 0; i < _completeFrames.size(); ++i) {
			if ((int)_completeFrames[i] > frameNumber)
				break;
			closestFrame = _completeFrames[i];
		}
	} else {
		for (uint i = 0; i < _completeFrames.size(); ++i) {
			int newDistance = (int)frameNumber - (int)(_completeFrames[i]);
			if (newDistance < 0)
				break;
			if (newDistance < distance) {
				closestFrame = _completeFrames[i];
				distance = newDistance;
			}
		}
	}

	for (int i = closestFrame; i < frameNumber; ++i) {
		applyFrameToCurrent(i);
	}

	_nextFrame = frameNumber;
}