aboutsummaryrefslogtreecommitdiff
path: root/engines/zvision/render_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/zvision/render_manager.cpp')
-rw-r--r--engines/zvision/render_manager.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/engines/zvision/render_manager.cpp b/engines/zvision/render_manager.cpp
index 7855dc3903..b8dcd0dd87 100644
--- a/engines/zvision/render_manager.cpp
+++ b/engines/zvision/render_manager.cpp
@@ -40,6 +40,10 @@ RenderManager::RenderManager(OSystem *system, const Common::Rect workingWindow)
_workingHeight(workingWindow.height()),
_workingWindow(workingWindow),
_currentBackground(0),
+ _backgroundWidth(0),
+ _backgroundHeight(0),
+ _backgroundInverseVelocity(0),
+ _accumulatedVelocityMilliseconds(0),
_renderTable(workingWindow.width(), workingWindow.height()) {
}
@@ -56,6 +60,24 @@ void RenderManager::renderSubRectToScreen(uint16 *buffer, uint32 imageWidth, uin
uint32 temp = imageHeight;
imageHeight = imageWidth;
imageWidth = temp;
+void RenderManager::update(uint deltaTimeInMillis) {
+ // An inverse velocity of 0 would be infinitely fast, so we'll let 0 mean no velocity.
+ if (_backgroundInverseVelocity == 0)
+ return;
+
+ _accumulatedVelocityMilliseconds += deltaTimeInMillis;
+
+ int absVelocity = abs(_backgroundInverseVelocity);
+
+ uint numberOfSteps = 0;
+ while (_accumulatedVelocityMilliseconds >= absVelocity) {
+ _accumulatedVelocityMilliseconds -= absVelocity;
+ numberOfSteps++;
+ }
+
+ // Choose the direction of movement using the sign of the velocity
+ moveBackground(_backgroundInverseVelocity < 0 ? -numberOfSteps : numberOfSteps);
+}
}
// If subRect is empty, use the entire image
@@ -178,6 +200,46 @@ void RenderManager::setBackgroundImage(const Common::String &fileName) {
_currentBackground = file;
renderImageToScreen(*_currentBackground, 0, 0, Common::Rect(), true);
+void RenderManager::setBackgroundPosition(int offset) {
+ if (_renderTable.getRenderState() == RenderTable::TILT) {
+ _backgroundOffset = Common::Point(0, offset);
+ } else {
+ _backgroundOffset = Common::Point(offset, 0);
+ }
+}
+
+void RenderManager::setBackgroundVelocity(int velocity) {
+ // setBackgroundVelocity(0) will be called quite often, so make sure
+ // _backgroundInverseVelocity isn't already 0 to prevent an extraneous assignment
+ if (velocity == 0) {
+ if (_backgroundInverseVelocity != 0) {
+ _backgroundInverseVelocity = 0;
+ }
+ } else {
+ _backgroundInverseVelocity = 1000 / velocity;
+ }
+}
+
+void RenderManager::moveBackground(int offset) {
+ if (_renderTable.getRenderState() == RenderTable::TILT) {
+ _backgroundOffset += Common::Point(0, offset);
+ } else {
+ _backgroundOffset += Common::Point(offset, 0);
+ }
+
+ // Make sure the offset is within image bounds
+ if (_backgroundOffset.x < 0)
+ _backgroundOffset.x += _backgroundWidth;
+ if (_backgroundOffset.x > _backgroundWidth)
+ _backgroundOffset.x -= _backgroundWidth;
+ if (_backgroundOffset.y < 0)
+ _backgroundOffset.y += _backgroundHeight;
+ if (_backgroundOffset.y > _backgroundHeight)
+ _backgroundOffset.y -= _backgroundHeight;
+
+ _currentBackground->seek(0);
+ // Purposely make the subRectangle empty. renderImageToScreen will then set the width and height automatically.
+ renderImageToScreen(*_currentBackground, 0, 0, Common::Rect(_backgroundOffset.x, _backgroundOffset.y, _backgroundOffset.x, _backgroundOffset.y), true);
}
} // End of namespace ZVision