From 9c1e97ff63028a88232ad886d178a7bad7a2f59d Mon Sep 17 00:00:00 2001 From: turanszkij Date: Wed, 21 Nov 2018 19:07:37 +0000 Subject: [PATCH] sprite animation refactor --- Documentation/ScriptingAPI-Documentation.md | 19 +-- Editor/Editor.cpp | 2 +- Tests/Tests.cpp | 9 +- WickedEngine/RenderPath2D.cpp | 22 ++- WickedEngine/SpriteAnim_BindLua.cpp | 180 ++++++-------------- WickedEngine/SpriteAnim_BindLua.h | 40 ++--- WickedEngine/wiSceneSystem.cpp | 6 +- WickedEngine/wiSceneSystem.h | 2 +- WickedEngine/wiSceneSystem_Serializers.cpp | 4 +- WickedEngine/wiSprite.cpp | 74 ++++---- WickedEngine/wiSprite.h | 54 +++--- WickedEngine/wiVersion.cpp | 2 +- 12 files changed, 169 insertions(+), 245 deletions(-) diff --git a/Documentation/ScriptingAPI-Documentation.md b/Documentation/ScriptingAPI-Documentation.md index 22437bd70..b95d30a05 100644 --- a/Documentation/ScriptingAPI-Documentation.md +++ b/Documentation/ScriptingAPI-Documentation.md @@ -199,7 +199,7 @@ Animate Sprites easily with this helper. - SetScaleX(float val) - SetScaleY(float val) - SetMovingTexAnim(MovingTexAnim val) -- SetDrawRecAnim(DrawRecAnim val) +- SetDrawRectAnim(DrawRectAnim val) - GetRot() : float result - GetRotation() : float result - GetOpacity() : float result @@ -209,7 +209,7 @@ Animate Sprites easily with this helper. - GetScaleX() : float result - GetScaleY() : float result - GetMovingTexAnim() : GetMovingTexAnim result -- GetDrawRecAnim() : GetDrawRecAnim result +- GetDrawRectAnim() : GetDrawRectAnim result #### MovingTexAnim Move texture continuously along the sprite. @@ -223,17 +223,10 @@ Move texture continuously along the sprite. Animate sprite frame by frame. - [constructor]DrawRecAnim() - SetOnFrameChangeWait(float val) -- SetFrameCount(float val) -- SetJumpX(float val) -- SetJumpY(float val) -- SetSizX(float val) -- SetSizY(float val) -- GetOnFrameChangeWait() : float result -- GetFrameCount() : float result -- GetJumpX() : float result -- GetJumpY() : float result -- GetSizX() : float result -- GetSizY() : float result +- SetFrameCount(int val) +- SetFrameRate(float val) +- GetFrameCount() : int result +- GetFrameRate() : float result ### Texture Just holds texture information in VRAM. diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index 9c5072610..036f10f6c 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -74,7 +74,7 @@ void EditorLoadingScreen::Load() addFont(&font); sprite = wiSprite("../logo/logo_small.png"); - sprite.anim.opa = 0.02f; + sprite.anim.opa = 1; sprite.anim.repeatable = true; sprite.params.pos = XMFLOAT3(wiRenderer::GetDevice()->GetScreenWidth()*0.5f, wiRenderer::GetDevice()->GetScreenHeight()*0.5f - font.textHeight(), 0); sprite.params.siz = XMFLOAT2(128, 128); diff --git a/Tests/Tests.cpp b/Tests/Tests.cpp index 406348222..8ac6f312b 100644 --- a/Tests/Tests.cpp +++ b/Tests/Tests.cpp @@ -134,7 +134,7 @@ TestsRenderer::TestsRenderer() sprite.params.pos = XMFLOAT3(screenW / 2, screenH / 2, 0); sprite.params.siz = XMFLOAT2(200, 100); sprite.params.pivot = XMFLOAT2(0.5f, 0.5f); - sprite.anim.rot = XM_PI / 400.0f; + sprite.anim.rot = XM_PI / 4.0f; this->addSprite(&sprite); break; } @@ -323,8 +323,9 @@ void TestsRenderer::RunSpriteTest() sprite.params.pivot = XMFLOAT2(0.5f, 0.5f); sprite.params.enableDrawRect(XMFLOAT4(0, 0, 128, 128)); sprite.params.sampleFlag = SAMPLEMODE_WRAP; - sprite.anim.drawRecAnim.frameCount = 8; - sprite.anim.drawRecAnim.jumpX = 1; - sprite.anim.drawRecAnim.onFrameChangeWait = 4; + sprite.anim = wiSprite::Anim(); + sprite.anim.drawRectAnim.frameCount = 8; + sprite.anim.drawRectAnim.frameRate = 10; + sprite.anim.repeatable = true; addSprite(&sprite); } diff --git a/WickedEngine/RenderPath2D.cpp b/WickedEngine/RenderPath2D.cpp index f8d252872..387445924 100644 --- a/WickedEngine/RenderPath2D.cpp +++ b/WickedEngine/RenderPath2D.cpp @@ -84,18 +84,28 @@ void RenderPath2D::Update(float dt) { GetGUI().Update(dt); - RenderPath::Update(dt); -} -void RenderPath2D::FixedUpdate() -{ - for (auto& x : layers) { for (auto& y : x.items) { if (y.sprite != nullptr) { - y.sprite->Update(getSpriteSpeed()); + y.sprite->Update(dt * getSpriteSpeed()); + } + } + } + + RenderPath::Update(dt); +} +void RenderPath2D::FixedUpdate() +{ + for (auto& x : layers) + { + for (auto& y : x.items) + { + if (y.sprite != nullptr) + { + y.sprite->FixedUpdate(getSpriteSpeed()); } } } diff --git a/WickedEngine/SpriteAnim_BindLua.cpp b/WickedEngine/SpriteAnim_BindLua.cpp index a5b5198b6..2b6a5d90b 100644 --- a/WickedEngine/SpriteAnim_BindLua.cpp +++ b/WickedEngine/SpriteAnim_BindLua.cpp @@ -153,10 +153,10 @@ int SpriteAnim_BindLua::SetMovingTexAnim(lua_State *L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - MovingTexData_BindLua* data = Luna::lightcheck(L, 1); + MovingTexAnim_BindLua* data = Luna::lightcheck(L, 1); if (data != nullptr) { - anim.movingTexAnim = data->data; + anim.movingTexAnim = data->anim; } else { @@ -174,10 +174,10 @@ int SpriteAnim_BindLua::SetDrawRecAnim(lua_State *L) int argc = wiLua::SGetArgCount(L); if (argc > 0) { - DrawRecData_BindLua* data = Luna::lightcheck(L, 1); + DrawRectAnim_BindLua* data = Luna::lightcheck(L, 1); if (data != nullptr) { - anim.drawRecAnim = data->data; + anim.drawRectAnim = data->anim; } else { @@ -232,12 +232,12 @@ int SpriteAnim_BindLua::GetScaleY(lua_State *L) } int SpriteAnim_BindLua::GetMovingTexAnim(lua_State *L) { - Luna::push(L, new MovingTexData_BindLua(anim.movingTexAnim)); + Luna::push(L, new MovingTexAnim_BindLua(anim.movingTexAnim)); return 1; } int SpriteAnim_BindLua::GetDrawRecAnim(lua_State *L) { - Luna::push(L, new DrawRecData_BindLua(anim.drawRecAnim)); + Luna::push(L, new DrawRectAnim_BindLua(anim.drawRectAnim)); return 1; } @@ -248,56 +248,56 @@ void SpriteAnim_BindLua::Bind() { initialized = true; Luna::Register(wiLua::GetGlobal()->GetLuaState()); - Luna::Register(wiLua::GetGlobal()->GetLuaState()); - Luna::Register(wiLua::GetGlobal()->GetLuaState()); + Luna::Register(wiLua::GetGlobal()->GetLuaState()); + Luna::Register(wiLua::GetGlobal()->GetLuaState()); } } -const char MovingTexData_BindLua::className[] = "MovingTexAnim"; +const char MovingTexAnim_BindLua::className[] = "MovingTexAnim"; -Luna::FunctionType MovingTexData_BindLua::methods[] = { - lunamethod(MovingTexData_BindLua, SetSpeedX), - lunamethod(MovingTexData_BindLua, SetSpeedY), +Luna::FunctionType MovingTexAnim_BindLua::methods[] = { + lunamethod(MovingTexAnim_BindLua, SetSpeedX), + lunamethod(MovingTexAnim_BindLua, SetSpeedY), - lunamethod(MovingTexData_BindLua, GetSpeedX), - lunamethod(MovingTexData_BindLua, GetSpeedY), + lunamethod(MovingTexAnim_BindLua, GetSpeedX), + lunamethod(MovingTexAnim_BindLua, GetSpeedY), { NULL, NULL } }; -Luna::PropertyType MovingTexData_BindLua::properties[] = { +Luna::PropertyType MovingTexAnim_BindLua::properties[] = { { NULL, NULL } }; -MovingTexData_BindLua::MovingTexData_BindLua(const wiSprite::Anim::MovingTexData& data) :data(data) +MovingTexAnim_BindLua::MovingTexAnim_BindLua(const wiSprite::Anim::MovingTexAnim& anim) :anim(anim) { } -MovingTexData_BindLua::MovingTexData_BindLua(lua_State *L) +MovingTexAnim_BindLua::MovingTexAnim_BindLua(lua_State *L) { - data = wiSprite::Anim::MovingTexData(); + anim = wiSprite::Anim::MovingTexAnim(); int argc = wiLua::SGetArgCount(L); if (argc > 0) { - data.speedX = wiLua::SGetFloat(L, 1); + anim.speedX = wiLua::SGetFloat(L, 1); if (argc > 1) { - data.speedY = wiLua::SGetFloat(L, 2); + anim.speedY = wiLua::SGetFloat(L, 2); } } } -MovingTexData_BindLua::~MovingTexData_BindLua() +MovingTexAnim_BindLua::~MovingTexAnim_BindLua() { } -int MovingTexData_BindLua::SetSpeedX(lua_State *L) +int MovingTexAnim_BindLua::SetSpeedX(lua_State *L) { int argc = wiLua::SGetArgCount(L); if (argc > 0) { - data.speedX = wiLua::SGetFloat(L, 1); + anim.speedX = wiLua::SGetFloat(L, 1); } else { @@ -305,12 +305,12 @@ int MovingTexData_BindLua::SetSpeedX(lua_State *L) } return 0; } -int MovingTexData_BindLua::SetSpeedY(lua_State *L) +int MovingTexAnim_BindLua::SetSpeedY(lua_State *L) { int argc = wiLua::SGetArgCount(L); if (argc > 0) { - data.speedY = wiLua::SGetFloat(L, 1); + anim.speedY = wiLua::SGetFloat(L, 1); } else { @@ -319,160 +319,80 @@ int MovingTexData_BindLua::SetSpeedY(lua_State *L) return 0; } -int MovingTexData_BindLua::GetSpeedX(lua_State *L) +int MovingTexAnim_BindLua::GetSpeedX(lua_State *L) { - wiLua::SSetFloat(L, data.speedX); + wiLua::SSetFloat(L, anim.speedX); return 1; } -int MovingTexData_BindLua::GetSpeedY(lua_State *L) +int MovingTexAnim_BindLua::GetSpeedY(lua_State *L) { - wiLua::SSetFloat(L, data.speedY); + wiLua::SSetFloat(L, anim.speedY); return 1; } -const char DrawRecData_BindLua::className[] = "DrawRecAnim"; +const char DrawRectAnim_BindLua::className[] = "DrawRecAnim"; -Luna::FunctionType DrawRecData_BindLua::methods[] = { - lunamethod(DrawRecData_BindLua, SetOnFrameChangeWait), - lunamethod(DrawRecData_BindLua, SetFrameCount), - lunamethod(DrawRecData_BindLua, SetJumpX), - lunamethod(DrawRecData_BindLua, SetJumpY), - lunamethod(DrawRecData_BindLua, SetSizX), - lunamethod(DrawRecData_BindLua, SetSizY), +Luna::FunctionType DrawRectAnim_BindLua::methods[] = { + lunamethod(DrawRectAnim_BindLua, SetFrameCount), + lunamethod(DrawRectAnim_BindLua, SetFrameRate), - lunamethod(DrawRecData_BindLua, GetOnFrameChangeWait), - lunamethod(DrawRecData_BindLua, GetFrameCount), - lunamethod(DrawRecData_BindLua, GetJumpX), - lunamethod(DrawRecData_BindLua, GetJumpY), - lunamethod(DrawRecData_BindLua, GetSizX), - lunamethod(DrawRecData_BindLua, GetSizY), + lunamethod(DrawRectAnim_BindLua, GetFrameCount), + lunamethod(DrawRectAnim_BindLua, GetFrameRate), { NULL, NULL } }; -Luna::PropertyType DrawRecData_BindLua::properties[] = { +Luna::PropertyType DrawRectAnim_BindLua::properties[] = { { NULL, NULL } }; -DrawRecData_BindLua::DrawRecData_BindLua(const wiSprite::Anim::DrawRecData& data) :data(data) +DrawRectAnim_BindLua::DrawRectAnim_BindLua(const wiSprite::Anim::DrawRectAnim& data) :anim(anim) { } -DrawRecData_BindLua::DrawRecData_BindLua(lua_State *L) +DrawRectAnim_BindLua::DrawRectAnim_BindLua(lua_State *L) { - data = wiSprite::Anim::DrawRecData(); + anim = wiSprite::Anim::DrawRectAnim(); } -DrawRecData_BindLua::~DrawRecData_BindLua() +DrawRectAnim_BindLua::~DrawRectAnim_BindLua() { } -int DrawRecData_BindLua::SetOnFrameChangeWait(lua_State* L) +int DrawRectAnim_BindLua::SetFrameCount(lua_State* L) { int argc = wiLua::SGetArgCount(L); if (argc > 0) { - data.onFrameChangeWait = wiLua::SGetFloat(L, 1); + anim.frameCount = wiLua::SGetInt(L, 1); } else { - wiLua::SError(L, "SetOnFrameChangeWait(float val) not enough arguments!"); + wiLua::SError(L, "SetFrameCount(int val) not enough arguments!"); } return 0; } -int DrawRecData_BindLua::SetFrameCount(lua_State* L) +int DrawRectAnim_BindLua::SetFrameRate(lua_State* L) { int argc = wiLua::SGetArgCount(L); if (argc > 0) { - data.frameCount = wiLua::SGetFloat(L, 1); + anim.frameRate = wiLua::SGetFloat(L, 1); } else { - wiLua::SError(L, "SetFrameCount(float val) not enough arguments!"); - } - return 0; -} -int DrawRecData_BindLua::SetJumpX(lua_State* L) -{ - int argc = wiLua::SGetArgCount(L); - if (argc > 0) - { - data.jumpX = wiLua::SGetFloat(L, 1); - } - else - { - wiLua::SError(L, "SetJumpX(float val) not enough arguments!"); - } - return 0; -} -int DrawRecData_BindLua::SetJumpY(lua_State* L) -{ - int argc = wiLua::SGetArgCount(L); - if (argc > 0) - { - data.jumpY = wiLua::SGetFloat(L, 1); - } - else - { - wiLua::SError(L, "SetJumpY(float val) not enough arguments!"); - } - return 0; -} -int DrawRecData_BindLua::SetSizX(lua_State* L) -{ - int argc = wiLua::SGetArgCount(L); - if (argc > 0) - { - data.sizX = wiLua::SGetFloat(L, 1); - } - else - { - wiLua::SError(L, "SetSizX(float val) not enough arguments!"); - } - return 0; -} -int DrawRecData_BindLua::SetSizY(lua_State* L) -{ - int argc = wiLua::SGetArgCount(L); - if (argc > 0) - { - data.sizY = wiLua::SGetFloat(L, 1); - } - else - { - wiLua::SError(L, "SetSizY(float val) not enough arguments!"); + wiLua::SError(L, "SetFrameRate(float val) not enough arguments!"); } return 0; } -int DrawRecData_BindLua::GetOnFrameChangeWait(lua_State* L) +int DrawRectAnim_BindLua::GetFrameCount(lua_State* L) { - wiLua::SSetFloat(L, data.onFrameChangeWait); + wiLua::SSetInt(L, anim.frameCount); return 1; } -int DrawRecData_BindLua::GetFrameCount(lua_State* L) +int DrawRectAnim_BindLua::GetFrameRate(lua_State* L) { - wiLua::SSetFloat(L, data.frameCount); - return 1; -} -int DrawRecData_BindLua::GetJumpX(lua_State* L) -{ - wiLua::SSetFloat(L, data.jumpX); - return 1; -} -int DrawRecData_BindLua::GetJumpY(lua_State* L) -{ - wiLua::SSetFloat(L, data.jumpY); - return 1; -} -int DrawRecData_BindLua::GetSizX(lua_State* L) -{ - wiLua::SSetFloat(L, data.sizX); - return 1; -} -int DrawRecData_BindLua::GetSizY(lua_State* L) -{ - wiLua::SSetFloat(L, data.sizY); + wiLua::SSetFloat(L, anim.frameRate); return 1; } \ No newline at end of file diff --git a/WickedEngine/SpriteAnim_BindLua.h b/WickedEngine/SpriteAnim_BindLua.h index f37ffe0f3..3cb25aa27 100644 --- a/WickedEngine/SpriteAnim_BindLua.h +++ b/WickedEngine/SpriteAnim_BindLua.h @@ -42,18 +42,18 @@ public: static void Bind(); }; -class MovingTexData_BindLua +class MovingTexAnim_BindLua { public: - wiSprite::Anim::MovingTexData data; + wiSprite::Anim::MovingTexAnim anim; static const char className[]; - static Luna::FunctionType methods[]; - static Luna::PropertyType properties[]; + static Luna::FunctionType methods[]; + static Luna::PropertyType properties[]; - MovingTexData_BindLua(const wiSprite::Anim::MovingTexData& data); - MovingTexData_BindLua(lua_State *L); - ~MovingTexData_BindLua(); + MovingTexAnim_BindLua(const wiSprite::Anim::MovingTexAnim& anim); + MovingTexAnim_BindLua(lua_State *L); + ~MovingTexAnim_BindLua(); int SetSpeedX(lua_State* L); int SetSpeedY(lua_State* L); @@ -62,31 +62,23 @@ public: int GetSpeedY(lua_State* L); }; -class DrawRecData_BindLua +class DrawRectAnim_BindLua { public: - wiSprite::Anim::DrawRecData data; + wiSprite::Anim::DrawRectAnim anim; static const char className[]; - static Luna::FunctionType methods[]; - static Luna::PropertyType properties[]; + static Luna::FunctionType methods[]; + static Luna::PropertyType properties[]; - DrawRecData_BindLua(const wiSprite::Anim::DrawRecData& data); - DrawRecData_BindLua(lua_State *L); - ~DrawRecData_BindLua(); + DrawRectAnim_BindLua(const wiSprite::Anim::DrawRectAnim& anim); + DrawRectAnim_BindLua(lua_State *L); + ~DrawRectAnim_BindLua(); - int SetOnFrameChangeWait(lua_State* L); int SetFrameCount(lua_State* L); - int SetJumpX(lua_State* L); - int SetJumpY(lua_State* L); - int SetSizX(lua_State* L); - int SetSizY(lua_State* L); + int SetFrameRate(lua_State* L); - int GetOnFrameChangeWait(lua_State* L); int GetFrameCount(lua_State* L); - int GetJumpX(lua_State* L); - int GetJumpY(lua_State* L); - int GetSizX(lua_State* L); - int GetSizY(lua_State* L); + int GetFrameRate(lua_State* L); }; diff --git a/WickedEngine/wiSceneSystem.cpp b/WickedEngine/wiSceneSystem.cpp index abffe79db..96160ec93 100644 --- a/WickedEngine/wiSceneSystem.cpp +++ b/WickedEngine/wiSceneSystem.cpp @@ -1547,12 +1547,12 @@ namespace wiSceneSystem MaterialComponent& material = materials[args.jobIndex]; - material.texAnimSleep -= dt * material.texAnimFrameRate; - if (material.texAnimSleep <= 0) + material.texAnimElapsedTime += dt * material.texAnimFrameRate; + if (material.texAnimElapsedTime >= 1.0f) { material.texMulAdd.z = fmodf(material.texMulAdd.z + material.texAnimDirection.x, 1); material.texMulAdd.w = fmodf(material.texMulAdd.w + material.texAnimDirection.y, 1); - material.texAnimSleep = 1.0f; + material.texAnimElapsedTime = 0.0f; material.SetDirty(); // will trigger constant buffer update later on } diff --git a/WickedEngine/wiSceneSystem.h b/WickedEngine/wiSceneSystem.h index 8e3bb3094..6236b5216 100644 --- a/WickedEngine/wiSceneSystem.h +++ b/WickedEngine/wiSceneSystem.h @@ -125,7 +125,7 @@ namespace wiSceneSystem XMFLOAT2 texAnimDirection = XMFLOAT2(0, 0); float texAnimFrameRate = 0.0f; - float texAnimSleep = 0.0f; + float texAnimElapsedTime = 0.0f; std::string baseColorMapName; std::string surfaceMapName; diff --git a/WickedEngine/wiSceneSystem_Serializers.cpp b/WickedEngine/wiSceneSystem_Serializers.cpp index 7388cfd10..68d72fbb5 100644 --- a/WickedEngine/wiSceneSystem_Serializers.cpp +++ b/WickedEngine/wiSceneSystem_Serializers.cpp @@ -95,7 +95,7 @@ namespace wiSceneSystem archive >> alphaRef; archive >> texAnimDirection; archive >> texAnimFrameRate; - archive >> texAnimSleep; + archive >> texAnimElapsedTime; archive >> baseColorMapName; archive >> surfaceMapName; @@ -142,7 +142,7 @@ namespace wiSceneSystem archive << alphaRef; archive << texAnimDirection; archive << texAnimFrameRate; - archive << texAnimSleep; + archive << texAnimElapsedTime; archive << baseColorMapName; archive << surfaceMapName; diff --git a/WickedEngine/wiSprite.cpp b/WickedEngine/wiSprite.cpp index e6bee273e..ab291f6b8 100644 --- a/WickedEngine/wiSprite.cpp +++ b/WickedEngine/wiSprite.cpp @@ -86,15 +86,20 @@ void wiSprite::DrawNormal(GRAPHICSTHREAD threadID) } } -void wiSprite::Update(float gameSpeed) +void wiSprite::FixedUpdate(float speed) { - params.pos.x += anim.vel.x*gameSpeed; - params.pos.y += anim.vel.y*gameSpeed; - params.pos.z += anim.vel.z*gameSpeed; - params.rotation += anim.rot*gameSpeed; - params.scale.x += anim.scaleX*gameSpeed; - params.scale.y += anim.scaleY*gameSpeed; - params.opacity += anim.opa*gameSpeed; + +} + +void wiSprite::Update(float dt) +{ + params.pos.x += anim.vel.x*dt; + params.pos.y += anim.vel.y*dt; + params.pos.z += anim.vel.z*dt; + params.rotation += anim.rot*dt; + params.scale.x += anim.scaleX*dt; + params.scale.y += anim.scaleY*dt; + params.opacity += anim.opa*dt; if (params.opacity >= 1) { if (anim.repeatable) { params.opacity = 0.99f; anim.opa *= -1; } else params.opacity = 1; @@ -103,7 +108,7 @@ void wiSprite::Update(float gameSpeed) if (anim.repeatable) { params.opacity = 0.01f; anim.opa *= -1; } else params.opacity = 0; } - params.fade += anim.fad*gameSpeed; + params.fade += anim.fad*dt; if (params.fade >= 1) { if (anim.repeatable) { params.fade = 0.99f; anim.fad *= -1; } else params.fade = 1; @@ -113,28 +118,39 @@ void wiSprite::Update(float gameSpeed) else params.fade = 0; } - params.texOffset.x += anim.movingTexAnim.speedX*gameSpeed; - params.texOffset.y += anim.movingTexAnim.speedY*gameSpeed; + params.texOffset.x += anim.movingTexAnim.speedX*dt; + params.texOffset.y += anim.movingTexAnim.speedY*dt; - if (anim.drawRecAnim.elapsedFrames >= anim.drawRecAnim.onFrameChangeWait) { - params.drawRect.x += params.drawRect.z*anim.drawRecAnim.jumpX; - params.drawRect.y += params.drawRect.w*anim.drawRecAnim.jumpY; + // Draw rect anim: + anim.drawRectAnim._elapsedTime += dt * anim.drawRectAnim.frameRate; + if (anim.drawRectAnim._elapsedTime >= 1.0f) + { + // Reset timer: + anim.drawRectAnim._elapsedTime = 0; - if (anim.drawRecAnim.currentFrame >= anim.drawRecAnim.frameCount) { - params.drawRect.z -= anim.drawRecAnim.sizX*anim.drawRecAnim.frameCount; - params.drawRect.w -= anim.drawRecAnim.sizY*anim.drawRecAnim.frameCount; - anim.drawRecAnim.currentFrame = 0; + // Advance total frame counter: + anim.drawRectAnim._finishedFrame++; + + // Step one frame horizontally: + params.drawRect.x += params.drawRect.z; + + if(anim.drawRectAnim._finishedFrame >= anim.drawRectAnim.frameCount) + { + // If the animation ended (we are on the last frame)... + if (anim.repeatable) + { + // restart if repeatable: + params.drawRect.x -= params.drawRect.z * anim.drawRectAnim.frameCount; + anim.drawRectAnim._finishedFrame = 0; + } + else + { + // just stay on the last frame if not repeatable: + params.drawRect.x -= params.drawRect.z; + anim.drawRectAnim._finishedFrame--; + } } - else { - params.drawRect.z += anim.drawRecAnim.sizX; - params.drawRect.w += anim.drawRecAnim.sizY; - anim.drawRecAnim.currentFrame++; - } - anim.drawRecAnim.elapsedFrames = 0; + } - else anim.drawRecAnim.elapsedFrames += gameSpeed; -} -void wiSprite::Update() -{ - Update(1); + } diff --git a/WickedEngine/wiSprite.h b/WickedEngine/wiSprite.h index 45fd18995..bf121d08b 100644 --- a/WickedEngine/wiSprite.h +++ b/WickedEngine/wiSprite.h @@ -19,8 +19,8 @@ public: void CreateReference(const std::string& newTexture, const std::string& newMask, const std::string& newNormal); void CleanUp(); - void Update(float); - void Update(); + virtual void FixedUpdate(float speed); + virtual void Update(float dt); void Draw(wiGraphicsTypes::Texture2D* refracRes, GRAPHICSTHREAD threadID); void Draw(GRAPHICSTHREAD threadID); void DrawNormal(GRAPHICSTHREAD threadID); @@ -29,39 +29,31 @@ public: wiImageParams params; - struct Anim{ - struct MovingTexData{ - float speedX,speedY; - MovingTexData(){ - speedX=speedY=0; - } + struct Anim + { + struct MovingTexAnim + { + float speedX = 0; // the speed of texture scrolling animation in horizontal direction + float speedY = 0; // the speed of texture scrolling animation in vertical direction }; - struct DrawRecData{ - float onFrameChangeWait,elapsedFrames,currentFrame,frameCount; - float jumpX,jumpY; - float sizX,sizY; + struct DrawRectAnim + { + float frameRate = 30; // target frame rate of the spritesheet animation (eg. 30, 60, etc.) + int frameCount = 1; // how many frames are in the animation in total - DrawRecData(){ - onFrameChangeWait=elapsedFrames=currentFrame=frameCount=0; - jumpX=jumpY=0; - sizX=sizY=0; - } + float _elapsedTime = 0; // internal use; you don't need to initialize + int _finishedFrame = 0; // internal use; you don't need to initialize }; - bool repeatable; - XMFLOAT3 vel; - float rot,scaleX,scaleY,opa,fad; - MovingTexData movingTexAnim; - DrawRecData drawRecAnim; - - Anim(){ - repeatable=false; - vel=XMFLOAT3(0,0,0); - rot=scaleX=scaleY=fad=0; - opa = 1; - movingTexAnim=MovingTexData(); - drawRecAnim=DrawRecData(); - } + bool repeatable = false; + XMFLOAT3 vel = XMFLOAT3(0, 0, 0); + float rot = 0; + float scaleX = 0; + float scaleY = 0; + float opa = 0; + float fad = 0; + MovingTexAnim movingTexAnim; + DrawRectAnim drawRectAnim; }; Anim anim; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index fe022cc07..a8e463d4a 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 23; // minor bug fixes, alterations, refactors, updates - const int revision = 2; + const int revision = 3; long GetVersion()