perfect the pause function.

This commit is contained in:
Nomango 2018-02-04 21:24:27 +08:00
parent f6eecee3aa
commit 6319ed7f2b
18 changed files with 308 additions and 259 deletions

View File

@ -45,13 +45,9 @@ void e2d::EAction::stop()
m_bEnding = true; m_bEnding = true;
} }
void e2d::EAction::setTarget(ENode * node) void e2d::EAction::_setTarget(ENode * node)
{ {
if (!m_pTarget && node) m_pTarget = node;
{
// 动作只能有一个目标
m_pTarget = node;
}
} }
e2d::EAction * e2d::EAction::reverse() const e2d::EAction * e2d::EAction::reverse() const

View File

@ -22,7 +22,7 @@ e2d::EActionLoop * e2d::EActionLoop::clone() const
void e2d::EActionLoop::_init() void e2d::EActionLoop::_init()
{ {
EAction::_init(); EAction::_init();
m_pAction->setTarget(m_pTarget); m_pAction->_setTarget(m_pTarget);
m_pAction->_init(); m_pAction->_init();
} }

View File

@ -35,7 +35,7 @@ void e2d::EActionSequence::_init()
{ {
for (auto action : m_vActions) for (auto action : m_vActions)
{ {
action->setTarget(m_pTarget); action->_setTarget(m_pTarget);
} }
} }
// 初始化第一个动作 // 初始化第一个动作

View File

@ -35,8 +35,8 @@ e2d::EActionTwo * e2d::EActionTwo::reverse(bool actionReverse) const
void e2d::EActionTwo::_init() void e2d::EActionTwo::_init()
{ {
EAction::_init(); EAction::_init();
m_pFirstAction->setTarget(m_pTarget); m_pFirstAction->_setTarget(m_pTarget);
m_pSecondAction->setTarget(m_pTarget); m_pSecondAction->_setTarget(m_pTarget);
m_pFirstAction->_init(); m_pFirstAction->_init();
} }

View File

@ -35,8 +35,8 @@ e2d::EActionTwoAtSameTime * e2d::EActionTwoAtSameTime::reverse(bool actionRevers
void e2d::EActionTwoAtSameTime::_init() void e2d::EActionTwoAtSameTime::_init()
{ {
EAction::_init(); EAction::_init();
m_pFirstAction->setTarget(m_pTarget); m_pFirstAction->_setTarget(m_pTarget);
m_pSecondAction->setTarget(m_pTarget); m_pSecondAction->_setTarget(m_pTarget);
m_pFirstAction->_init(); m_pFirstAction->_init();
m_pSecondAction->_init(); m_pSecondAction->_init();

View File

@ -2,12 +2,14 @@
e2d::EAnimation::EAnimation() e2d::EAnimation::EAnimation()
: m_nFrameIndex(0) : m_nFrameIndex(0)
, m_pTarget(nullptr)
{ {
} }
e2d::EAnimation::EAnimation(float invertal) e2d::EAnimation::EAnimation(float invertal)
: m_nFrameIndex(0) : m_nFrameIndex(0)
, m_fInterval(invertal) , m_fInterval(invertal)
, m_pTarget(nullptr)
{ {
} }
@ -45,7 +47,7 @@ void e2d::EAnimation::_update()
// 重新记录时间 // 重新记录时间
m_fLast += m_fInterval; m_fLast += m_fInterval;
// 加载关键帧 // 加载关键帧
reinterpret_cast<ESprite*>(m_pTarget)->loadFrom(m_vFrames[m_nFrameIndex]); m_pTarget->loadFrom(m_vFrames[m_nFrameIndex]);
m_nFrameIndex++; m_nFrameIndex++;
// 判断动作是否结束 // 判断动作是否结束
if (m_nFrameIndex == m_vFrames.size()) if (m_nFrameIndex == m_vFrames.size())
@ -62,6 +64,11 @@ void e2d::EAnimation::_reset()
m_nFrameIndex = 0; m_nFrameIndex = 0;
} }
void e2d::EAnimation::_setTarget(ENode * node)
{
m_pTarget = static_cast<ESprite*>(node);
}
void e2d::EAnimation::addKeyframe(EImage * frame) void e2d::EAnimation::addKeyframe(EImage * frame)
{ {
if (frame) if (frame)

View File

@ -50,13 +50,6 @@ bool e2d::EGame::init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR pIc
break; break;
} }
// 初始化计时
if (!ETime::__init())
{
WARN_IF(true, "ETime::__init Failed!");
break;
}
// 初始化 DirectInput // 初始化 DirectInput
if (!EInput::__init()) if (!EInput::__init())
{ {
@ -99,22 +92,32 @@ int e2d::EGame::run()
::UpdateWindow(EWindow::getHWnd()); ::UpdateWindow(EWindow::getHWnd());
// 处理窗口消息 // 处理窗口消息
EWindow::__poll(); EWindow::__poll();
// 刷新时间信息 // 初始化计时
ETime::__updateNow(); ETime::__init();
ETime::__updateLast();
while (!s_bEndGame) while (!s_bEndGame)
{ {
// 处理窗口消息 // 处理窗口消息
EWindow::__poll(); EWindow::__poll();
// 刷新时间信息 // 刷新时间
ETime::__updateNow(); ETime::__updateNow();
// 判断是否达到了刷新状态 // 判断是否达到了刷新状态
if (ETime::getDeltaTime() >= 17) if (ETime::__isReady())
{ {
ETime::__updateLast(); // 刷新时间信息 while (ETime::__isReady())
EGame::__update(); // 更新游戏内容 {
EInput::__updateDeviceState(); // 获取用户输入
ESceneManager::__update(); // 更新场景内容
ETime::__updateLast(); // 刷新时间信息
}
if (!s_bPaused)
{
ETimerManager::__update(); // 定时器管理器执行程序
EActionManager::__update(); // 动作管理器执行程序
}
ERenderer::__render(); // 渲染游戏画面 ERenderer::__render(); // 渲染游戏画面
} }
else else
@ -159,8 +162,6 @@ void e2d::EGame::uninit()
{ {
// 删除所有场景 // 删除所有场景
ESceneManager::__uninit(); ESceneManager::__uninit();
// 重置窗口属性
EWindow::__uninit();
// 关闭输入 // 关闭输入
EInput::__uninit(); EInput::__uninit();
// 关闭播放器 // 关闭播放器
@ -169,27 +170,18 @@ void e2d::EGame::uninit()
ETime::__uninit(); ETime::__uninit();
// 清空图片缓存 // 清空图片缓存
EImage::clearCache(); EImage::clearCache();
// 删除渲染相关资源
ERenderer::__discardResources();
// 刷新内存池 // 刷新内存池
EObjectManager::__flush(); EObjectManager::__flush();
// 删除渲染相关资源
ERenderer::__discardResources();
// 销毁窗口
EWindow::__uninit();
CoUninitialize(); CoUninitialize();
s_bInitialized = false; s_bInitialized = false;
} }
void e2d::EGame::__update()
{
if (s_bPaused)
return;
EInput::__updateDeviceState(); // 获取用户输入
ETimerManager::__update(); // 定时器管理器执行程序
EActionManager::__update(); // 动作管理器执行程序
ESceneManager::__update(); // 更新游戏内容
}
e2d::EString e2d::EGame::getAppName() e2d::EString e2d::EGame::getAppName()
{ {
return s_sAppName; return s_sAppName;

View File

@ -1,9 +1,23 @@
#include "..\ebase.h" #include "..\ebase.h"
#include <thread>
#include <chrono>
using namespace std::chrono;
// 游戏开始时间
static steady_clock::time_point s_tStart;
// 当前时间
static steady_clock::time_point s_tNow;
// 上一帧刷新时间
static steady_clock::time_point s_tFixedUpdate;
// 上一次更新时间
static steady_clock::time_point s_tLastUpdate;
// 上一帧与当前帧的时间间隔 // 上一帧与当前帧的时间间隔
static int s_nInterval = 0; static int s_nInterval = 0;
// 游戏开始时长 // 游戏开始时长
static float s_fTotalTime = 0; static float s_fTotalTime = 0;
// 每一帧间隔
static milliseconds s_tExceptedInvertal;
float e2d::ETime::getTotalTime() float e2d::ETime::getTotalTime()
@ -16,26 +30,10 @@ int e2d::ETime::getDeltaTime()
return s_nInterval; return s_nInterval;
} }
#if _MSC_VER > 1600
#include <thread>
#include <chrono>
using namespace std::chrono;
// 游戏开始时间
static steady_clock::time_point s_tStart;
// 当前时间
static steady_clock::time_point s_tNow;
// 上一帧刷新时间
static steady_clock::time_point s_tLast;
bool e2d::ETime::__init() bool e2d::ETime::__init()
{ {
s_tStart = s_tLast = s_tNow = steady_clock::now(); s_tStart = s_tLastUpdate = s_tFixedUpdate = s_tNow = steady_clock::now();
s_tExceptedInvertal = milliseconds(17);
return true; return true;
} }
@ -43,93 +41,35 @@ void e2d::ETime::__uninit()
{ {
} }
bool e2d::ETime::__isReady()
{
return s_tExceptedInvertal < duration_cast<milliseconds>(s_tNow - s_tFixedUpdate);
}
void e2d::ETime::__updateNow() void e2d::ETime::__updateNow()
{ {
// 刷新时间
s_tNow = steady_clock::now(); s_tNow = steady_clock::now();
s_fTotalTime = static_cast<float>(duration_cast<milliseconds>(s_tNow - s_tStart).count()) / 1000.0f;
s_nInterval = static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLast).count());
} }
void e2d::ETime::__updateLast() void e2d::ETime::__updateLast()
{ {
s_tLast = s_tNow; s_tFixedUpdate += s_tExceptedInvertal;
s_tLastUpdate = s_tNow;
s_tNow = steady_clock::now();
s_nInterval = static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tLastUpdate).count());
s_fTotalTime = static_cast<float>(duration_cast<milliseconds>(s_tNow - s_tStart).count()) / 1000.0f;
} }
void e2d::ETime::__sleep() void e2d::ETime::__sleep()
{ {
// 计算挂起时长 // 计算挂起时长
int nWaitMS = 16 - s_nInterval; int nWaitMS = 16 - static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tFixedUpdate).count());
// 挂起线程,释放 CPU 占用
if (nWaitMS > 1) if (nWaitMS > 1)
{ {
// 挂起线程,释放 CPU 占用
std::this_thread::sleep_for(milliseconds(nWaitMS)); std::this_thread::sleep_for(milliseconds(nWaitMS));
} }
} }
#else
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib")
// 时钟频率
static LARGE_INTEGER s_tFreq;
// 当前时间
static LARGE_INTEGER s_tNow;
// 游戏开始时间
static LARGE_INTEGER s_tStart;
// 上一帧画面绘制时间
static LARGE_INTEGER s_tLast;
bool e2d::ETime::__init()
{
bool bRet = false;
if (::timeBeginPeriod(1))
{
// 修改时间精度
if (::QueryPerformanceFrequency(&s_tFreq)) // 获取时钟频率
{
if (::QueryPerformanceCounter(&s_tNow)) // 刷新当前时间
{
s_tStart = s_tLast = s_tNow;
bRet = true;
}
}
}
return bRet;
}
void e2d::ETime::__uninit()
{
::timeEndPeriod(1); // 重置时间精度
}
void e2d::ETime::__updateNow()
{
::QueryPerformanceCounter(&s_tNow);
s_fTotalTime = static_cast<float>(s_tNow.QuadPart - s_tStart.QuadPart) / s_tFreq.QuadPart;
s_nInterval = static_cast<int>((s_tNow.QuadPart - s_tLast.QuadPart) * 1000LL / s_tFreq.QuadPart);
}
void e2d::ETime::__updateLast()
{
s_tLast = s_tNow;
}
void e2d::ETime::__sleep()
{
// 计算挂起时长
int nWaitMS = 16 - s_nInterval;
// 挂起线程,释放 CPU 占用
if (nWaitMS > 1)
{
::Sleep(nWaitMS);
}
}
#endif // _MSC_VER > 1600

View File

@ -102,10 +102,14 @@ bool e2d::EWindow::__init(LPCTSTR sTitle, UINT32 nWidth, UINT32 nHeight, LPCTSTR
void e2d::EWindow::__uninit() void e2d::EWindow::__uninit()
{ {
// 关闭控制台
if (::GetConsoleWindow()) if (::GetConsoleWindow())
{ {
::FreeConsole(); ::FreeConsole();
} }
// 关闭窗口
DestroyWindow(s_HWnd);
s_HWnd = nullptr;
} }
void e2d::EWindow::__poll() void e2d::EWindow::__poll()

View File

@ -39,13 +39,21 @@ void e2d::EScene::_render()
void e2d::EScene::_update() void e2d::EScene::_update()
{ {
// 执行 onUpdate 函数 if (!EGame::isPaused())
if (m_bAutoUpdate)
{ {
this->onUpdate(); // 执行 onUpdate 函数
if (m_bAutoUpdate)
{
this->onUpdate();
}
// 更新根节点
m_pRoot->_update(false);
}
else
{
// 更新根节点
m_pRoot->_update(true);
} }
// 更新根节点
m_pRoot->_update();
} }
void e2d::EScene::setAutoUpdate(bool bAutoUpdate) void e2d::EScene::setAutoUpdate(bool bAutoUpdate)

View File

@ -2,7 +2,7 @@
e2d::EButton::EButton() e2d::EButton::EButton()
: m_Callback((const BtnClkCallback &)nullptr) : m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL) , m_eBtnState(EButton::NORMAL)
, m_bEnable(true) , m_bEnable(true)
, m_bIsSelected(false) , m_bIsSelected(false)
, m_pNormal(nullptr) , m_pNormal(nullptr)
@ -14,7 +14,7 @@ e2d::EButton::EButton()
e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback) e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr) : m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL) , m_eBtnState(EButton::NORMAL)
, m_bEnable(true) , m_bEnable(true)
, m_bIsSelected(false) , m_bIsSelected(false)
, m_pNormal(nullptr) , m_pNormal(nullptr)
@ -28,7 +28,7 @@ e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback)
e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback) e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr) : m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL) , m_eBtnState(EButton::NORMAL)
, m_bEnable(true) , m_bEnable(true)
, m_bIsSelected(false) , m_bIsSelected(false)
, m_pNormal(nullptr) , m_pNormal(nullptr)
@ -43,7 +43,7 @@ e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & c
e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback) e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr) : m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL) , m_eBtnState(EButton::NORMAL)
, m_bEnable(true) , m_bEnable(true)
, m_bIsSelected(false) , m_bIsSelected(false)
, m_pNormal(nullptr) , m_pNormal(nullptr)
@ -59,7 +59,7 @@ e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const
e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback) e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr) : m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL) , m_eBtnState(EButton::NORMAL)
, m_bEnable(true) , m_bEnable(true)
, m_bIsSelected(false) , m_bIsSelected(false)
, m_pNormal(nullptr) , m_pNormal(nullptr)
@ -228,7 +228,7 @@ void e2d::EButton::onUpdate()
{ {
// 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true // 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true
m_bIsSelected = true; m_bIsSelected = true;
_setStatus(EButton::SELECTED); _setState(EButton::SELECTED);
return; return;
} }
} }
@ -237,25 +237,30 @@ void e2d::EButton::onUpdate()
{ {
if (pSelected->isPointIn(EInput::getMousePos())) if (pSelected->isPointIn(EInput::getMousePos()))
{ {
_setStatus(EButton::SELECTED); _setState(EButton::SELECTED);
return; return;
} }
} }
else if (m_pNormal->isPointIn(EInput::getMousePos())) else if (m_pNormal->isPointIn(EInput::getMousePos()))
{ {
_setStatus(EButton::MOUSEOVER); _setState(EButton::MOUSEOVER);
return; return;
} }
_setStatus(EButton::NORMAL); _setState(EButton::NORMAL);
} }
} }
void e2d::EButton::_setStatus(STATUS status) void e2d::EButton::onPause()
{ {
if (m_eStatus != status) this->onUpdate();
}
void e2d::EButton::_setState(BTN_STATE state)
{
if (m_eBtnState != state)
{ {
m_eStatus = status; m_eBtnState = state;
_updateVisiable(); _updateVisiable();
} }
} }
@ -269,11 +274,11 @@ void e2d::EButton::_updateVisiable()
if (m_bEnable) if (m_bEnable)
{ {
if (m_eStatus == EButton::SELECTED && m_pSelected) if (m_eBtnState == EButton::SELECTED && m_pSelected)
{ {
m_pSelected->setVisiable(true); m_pSelected->setVisiable(true);
} }
else if (m_eStatus == EButton::MOUSEOVER && m_pMouseover) else if (m_eBtnState == EButton::MOUSEOVER && m_pMouseover)
{ {
m_pMouseover->setVisiable(true); m_pMouseover->setVisiable(true);
} }

View File

@ -2,7 +2,7 @@
e2d::EButtonToggle::EButtonToggle() e2d::EButtonToggle::EButtonToggle()
: EButton() : EButton()
, m_bToggle(true) , m_bState(true)
, m_pNormalOn(nullptr) , m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr) , m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr) , m_pSelectedOn(nullptr)
@ -16,7 +16,7 @@ e2d::EButtonToggle::EButtonToggle()
e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback) e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback)
: EButton() : EButton()
, m_bToggle(true) , m_bState(true)
, m_pNormalOn(nullptr) , m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr) , m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr) , m_pSelectedOn(nullptr)
@ -33,7 +33,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma
e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback)
: EButton() : EButton()
, m_bToggle(true) , m_bState(true)
, m_pNormalOn(nullptr) , m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr) , m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr) , m_pSelectedOn(nullptr)
@ -52,7 +52,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma
e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback) e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, const BtnClkCallback & callback)
: EButton() : EButton()
, m_bToggle(true) , m_bState(true)
, m_pNormalOn(nullptr) , m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr) , m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr) , m_pSelectedOn(nullptr)
@ -73,7 +73,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma
e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BtnClkCallback & callback) e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, ENode * toggleOnMouseOver, ENode * toggleOffMouseOver, ENode * toggleOnSelected, ENode * toggleOffSelected, ENode * toggleOnDisabled, ENode * toggleOffDisabled, const BtnClkCallback & callback)
: EButton() : EButton()
, m_bToggle(true) , m_bState(true)
, m_pNormalOn(nullptr) , m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr) , m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr) , m_pSelectedOn(nullptr)
@ -97,7 +97,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma
void e2d::EButtonToggle::toggle() void e2d::EButtonToggle::toggle()
{ {
// 设置按钮状态 // 设置按钮状态
setToggle(!m_bToggle); setState(!m_bState);
// 执行回调函数 // 执行回调函数
if (m_Callback) if (m_Callback)
{ {
@ -105,17 +105,17 @@ void e2d::EButtonToggle::toggle()
} }
} }
bool e2d::EButtonToggle::isToggleOn() const bool e2d::EButtonToggle::getState() const
{ {
return m_bToggle; return m_bState;
} }
void e2d::EButtonToggle::setToggle(bool toggle) void e2d::EButtonToggle::setState(bool bState)
{ {
if (m_bToggle != toggle) if (m_bState != bState)
{ {
m_bToggle = toggle; m_bState = bState;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -133,10 +133,11 @@ void e2d::EButtonToggle::setNormal(ENode * normal)
if (normal) if (normal)
{ {
this->addChild(normal); this->addChild(normal);
normal->setPivot(m_fPivotX, m_fPivotY);
} }
m_pNormalOn = normal; m_pNormalOn = normal;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -154,10 +155,11 @@ void e2d::EButtonToggle::setMouseOver(ENode * mouseover)
if (mouseover) if (mouseover)
{ {
this->addChild(mouseover); this->addChild(mouseover);
mouseover->setPivot(m_fPivotX, m_fPivotY);
} }
m_pMouseoverOn = mouseover; m_pMouseoverOn = mouseover;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -175,10 +177,11 @@ void e2d::EButtonToggle::setSelected(ENode * selected)
if (selected) if (selected)
{ {
this->addChild(selected); this->addChild(selected);
selected->setPivot(m_fPivotX, m_fPivotY);
} }
m_pSelectedOn = selected; m_pSelectedOn = selected;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -196,10 +199,11 @@ void e2d::EButtonToggle::setDisabled(ENode * disabled)
if (disabled) if (disabled)
{ {
this->addChild(disabled); this->addChild(disabled);
disabled->setPivot(m_fPivotX, m_fPivotY);
} }
m_pDisabledOn = disabled; m_pDisabledOn = disabled;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -217,10 +221,11 @@ void e2d::EButtonToggle::setNormalOff(ENode * normal)
if (normal) if (normal)
{ {
this->addChild(normal); this->addChild(normal);
normal->setPivot(m_fPivotX, m_fPivotY);
} }
m_pNormalOff = normal; m_pNormalOff = normal;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -238,10 +243,11 @@ void e2d::EButtonToggle::setMouseOverOff(ENode * mouseover)
if (mouseover) if (mouseover)
{ {
this->addChild(mouseover); this->addChild(mouseover);
mouseover->setPivot(m_fPivotX, m_fPivotY);
} }
m_pMouseoverOff = mouseover; m_pMouseoverOff = mouseover;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -259,10 +265,11 @@ void e2d::EButtonToggle::setSelectedOff(ENode * selected)
if (selected) if (selected)
{ {
this->addChild(selected); this->addChild(selected);
selected->setPivot(m_fPivotX, m_fPivotY);
} }
m_pSelectedOff = selected; m_pSelectedOff = selected;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
@ -280,17 +287,57 @@ void e2d::EButtonToggle::setDisabledOff(ENode * disabled)
if (disabled) if (disabled)
{ {
this->addChild(disabled); this->addChild(disabled);
disabled->setPivot(m_fPivotX, m_fPivotY);
} }
m_pDisabledOff = disabled; m_pDisabledOff = disabled;
_updateToggle(); _updateState();
_updateVisiable(); _updateVisiable();
} }
} }
void e2d::EButtonToggle::_updateToggle() void e2d::EButtonToggle::setPivotX(float pivotX)
{ {
if (m_bToggle) ENode::setPivotX(pivotX);
if (m_pNormalOn) m_pNormalOn->setPivotX(pivotX);
if (m_pMouseoverOn) m_pMouseoverOn->setPivotX(pivotX);
if (m_pSelectedOn) m_pSelectedOn->setPivotX(pivotX);
if (m_pDisabledOn) m_pDisabledOn->setPivotX(pivotX);
if (m_pNormalOff) m_pNormalOff->setPivotX(pivotX);
if (m_pMouseoverOff) m_pMouseoverOff->setPivotX(pivotX);
if (m_pSelectedOff) m_pSelectedOff->setPivotX(pivotX);
if (m_pDisabledOff) m_pDisabledOff->setPivotX(pivotX);
}
void e2d::EButtonToggle::setPivotY(float pivotY)
{
ENode::setPivotY(pivotY);
if (m_pNormalOn) m_pNormalOn->setPivotY(pivotY);
if (m_pMouseoverOn) m_pMouseoverOn->setPivotY(pivotY);
if (m_pSelectedOn) m_pSelectedOn->setPivotY(pivotY);
if (m_pDisabledOn) m_pDisabledOn->setPivotY(pivotY);
if (m_pNormalOff) m_pNormalOff->setPivotY(pivotY);
if (m_pMouseoverOff) m_pMouseoverOff->setPivotY(pivotY);
if (m_pSelectedOff) m_pSelectedOff->setPivotY(pivotY);
if (m_pDisabledOff) m_pDisabledOff->setPivotY(pivotY);
}
void e2d::EButtonToggle::setPivot(float pivotX, float pivotY)
{
ENode::setPivot(pivotX, pivotY);
if (m_pNormalOn) m_pNormalOn->setPivot(pivotX, pivotY);
if (m_pMouseoverOn) m_pMouseoverOn->setPivot(pivotX, pivotY);
if (m_pSelectedOn) m_pSelectedOn->setPivot(pivotX, pivotY);
if (m_pDisabledOn) m_pDisabledOn->setPivot(pivotX, pivotY);
if (m_pNormalOff) m_pNormalOff->setPivot(pivotX, pivotY);
if (m_pMouseoverOff) m_pMouseoverOff->setPivot(pivotX, pivotY);
if (m_pSelectedOff) m_pSelectedOff->setPivot(pivotX, pivotY);
if (m_pDisabledOff) m_pDisabledOff->setPivot(pivotX, pivotY);
}
void e2d::EButtonToggle::_updateState()
{
if (m_bState)
{ {
m_pNormal = m_pNormalOn; m_pNormal = m_pNormalOn;
m_pMouseover = m_pMouseoverOn; m_pMouseover = m_pMouseoverOn;
@ -318,8 +365,8 @@ void e2d::EButtonToggle::_updateToggle()
void e2d::EButtonToggle::_runCallback() void e2d::EButtonToggle::_runCallback()
{ {
m_bToggle = !m_bToggle; m_bState = !m_bState;
_updateToggle(); _updateState();
if (m_Callback) if (m_Callback)
{ {

View File

@ -45,7 +45,7 @@ e2d::ENode::~ENode()
} }
} }
void e2d::ENode::_update() void e2d::ENode::_update(bool bPaused)
{ {
if (m_bTransformNeeded) if (m_bTransformNeeded)
{ {
@ -77,7 +77,7 @@ void e2d::ENode::_update()
// 访问 Order 小于零的节点 // 访问 Order 小于零的节点
if (child->getOrder() < 0) if (child->getOrder() < 0)
{ {
child->_update(); child->_update(bPaused);
} }
else else
{ {
@ -85,20 +85,29 @@ void e2d::ENode::_update()
} }
} }
// 执行 onUpdate 函数 if (bPaused)
if (m_bAutoUpdate) {
this->onPause();
}
else if (m_bAutoUpdate)
{ {
this->onUpdate(); this->onUpdate();
} }
// 访问剩余节点 // 访问剩余节点
for (; i < size; i++) for (; i < size; i++)
m_vChildren[i]->_update(); m_vChildren[i]->_update(bPaused);
} }
else else
{ {
// 执行 onUpdate 函数 if (bPaused)
this->onUpdate(); {
this->onPause();
}
else if (m_bAutoUpdate)
{
this->onUpdate();
}
} }
} }
@ -720,7 +729,7 @@ void e2d::ENode::runAction(EAction * action)
{ {
action = action->clone(); action = action->clone();
} }
action->setTarget(this); action->_setTarget(this);
EActionManager::addAction(action); EActionManager::addAction(action);
} }

View File

@ -253,6 +253,8 @@ void EMusic::_close()
{ {
if (m_pSourceVoice) if (m_pSourceVoice)
{ {
m_pSourceVoice->Stop();
m_pSourceVoice->FlushSourceBuffers();
m_pSourceVoice->DestroyVoice(); m_pSourceVoice->DestroyVoice();
m_pSourceVoice = nullptr; m_pSourceVoice = nullptr;
} }

View File

@ -4,6 +4,7 @@
namespace e2d namespace e2d
{ {
class ENode;
class EActionManager; class EActionManager;
class EActionTwo; class EActionTwo;
class EActionLoop; class EActionLoop;
@ -14,6 +15,7 @@ class ETransitionFade;
class EAction : class EAction :
public EObject public EObject
{ {
friend ENode;
friend EActionManager; friend EActionManager;
friend EActionTwo; friend EActionTwo;
friend EActionLoop; friend EActionLoop;
@ -49,11 +51,6 @@ public:
// 获取执行该动作的目标 // 获取执行该动作的目标
virtual ENode * getTarget(); virtual ENode * getTarget();
// 设置动作执行目标
virtual void setTarget(
ENode * node
);
protected: protected:
// 初始化动作 // 初始化动作
virtual void _init(); virtual void _init();
@ -70,6 +67,11 @@ protected:
// 重置动画时间 // 重置动画时间
virtual void _resetTime(); virtual void _resetTime();
// 设置动作执行目标
virtual void _setTarget(
ENode * node
);
protected: protected:
bool m_bRunning; bool m_bRunning;
bool m_bEnding; bool m_bEnding;
@ -579,9 +581,9 @@ public:
EImage * frame /* 添加关键帧 */ EImage * frame /* 添加关键帧 */
); );
// 设置每一帧的时间间隔(秒) // 设置每一帧的时间间隔
void setInterval( void setInterval(
float interval float interval /* 帧间隔(秒) */
); );
// 获取该动画的拷贝对象 // 获取该动画的拷贝对象
@ -600,9 +602,15 @@ protected:
// 重置动作 // 重置动作
virtual void _reset() override; virtual void _reset() override;
// 设置动作执行目标
virtual void _setTarget(
ENode * node
) override;
protected: protected:
float m_fInterval; float m_fInterval;
UINT m_nFrameIndex; UINT m_nFrameIndex;
ESprite* m_pTarget;
std::vector<EImage*> m_vFrames; std::vector<EImage*> m_vFrames;
}; };

View File

@ -41,10 +41,6 @@ public:
// 获取 AppName // 获取 AppName
static EString getAppName(); static EString getAppName();
private:
// 更新游戏内容
static void __update();
}; };
@ -129,6 +125,9 @@ private:
// 重置计时操作 // 重置计时操作
static void __uninit(); static void __uninit();
// 是否达到更新时间
static bool __isReady();
// 更新当前时间 // 更新当前时间
static void __updateNow(); static void __updateNow();

View File

@ -634,8 +634,11 @@ public:
// 重写这个函数,它将在每一帧画面刷新时执行 // 重写这个函数,它将在每一帧画面刷新时执行
virtual void onUpdate() {} virtual void onUpdate() {}
// 重写这个函数,它将在游戏暂停时执行
virtual void onPause() {}
// 开启或禁用 onUpdate 函数 // 开启或禁用 onUpdate 函数
virtual void setAutoUpdate( void setAutoUpdate(
bool bAutoUpdate bool bAutoUpdate
); );

View File

@ -21,6 +21,12 @@ public:
virtual ~ENode(); virtual ~ENode();
// 进入场景时执行
virtual void onEnter() {}
// 离开场景时执行
virtual void onExit() {}
// 更新节点 // 更新节点
virtual void onUpdate() {} virtual void onUpdate() {}
@ -33,11 +39,11 @@ public:
int nRelation /* 碰撞关系,取值为 ERelation::VALUE 中的一种 */ int nRelation /* 碰撞关系,取值为 ERelation::VALUE 中的一种 */
) {} ) {}
// 进入场景时执行 // 游戏暂停时的处理
virtual void onEnter() {} virtual void onPause() {}
// 离开场景时执行 // 节点被销毁时的处理
virtual void onExit() {} virtual void onDestroy() {}
// 获取节点显示状态 // 获取节点显示状态
virtual bool isVisiable() const; virtual bool isVisiable() const;
@ -331,46 +337,48 @@ public:
protected: protected:
// 更新节点 // 更新节点
virtual void _update(); void _update(
bool bPaused
);
// 渲染节点 // 渲染节点
virtual void _render(); void _render();
// 渲染几何图形 // 渲染图形
virtual void _drawShape(); void _drawShape();
// 节点被添加到场景时的执行程序 // 节点被添加到场景时的执行程序
virtual void _onEnter(); void _onEnter();
// 节点从场景中消失时的执行程序 // 节点从场景中消失时的执行程序
virtual void _onExit(); void _onExit();
// 设置节点所在场景 // 设置节点所在场景
virtual void _setParentScene( void _setParentScene(
EScene * scene EScene * scene
); );
// 对自身进行二维矩阵变换 // 对自身进行二维矩阵变换
virtual void _updateTransform(); void _updateTransform();
// 更新所有子节点矩阵 // 更新所有子节点矩阵
virtual void _updateChildrenTransform(); void _updateChildrenTransform();
// 更新所有子节点透明度 // 更新所有子节点透明度
virtual void _updateChildrenOpacity(); void _updateChildrenOpacity();
// 更新节点矩阵 // 修改节点大小
void _setSize(
float width,
float height
);
// 更新节点二维矩阵
static void _updateTransform(ENode * node); static void _updateTransform(ENode * node);
// 更新节点透明度 // 更新节点透明度
static void _updateOpacity(ENode * node); static void _updateOpacity(ENode * node);
// 修改节点大小
virtual void _setSize(
float width,
float height
);
protected: protected:
EString m_sName; EString m_sName;
size_t m_nHashName; size_t m_nHashName;
@ -624,13 +632,16 @@ public:
) override; ) override;
// 更新按钮状态 // 更新按钮状态
virtual void onUpdate(); virtual void onUpdate() override;
// 更新游戏暂停时的按钮状态
virtual void onPause() override;
protected: protected:
enum STATUS { NORMAL, MOUSEOVER, SELECTED }; enum BTN_STATE { NORMAL, MOUSEOVER, SELECTED };
// 设置按钮状态 // 设置按钮状态
virtual void _setStatus(STATUS status); virtual void _setState(BTN_STATE state);
// 刷新按钮显示 // 刷新按钮显示
virtual void _updateVisiable(); virtual void _updateVisiable();
@ -639,14 +650,14 @@ protected:
virtual void _runCallback(); virtual void _runCallback();
protected: protected:
STATUS m_eStatus; ENode * m_pNormal;
ENode * m_pNormal; ENode * m_pMouseover;
ENode * m_pMouseover; ENode * m_pSelected;
ENode * m_pSelected; ENode * m_pDisabled;
ENode * m_pDisabled; bool m_bEnable;
bool m_bEnable; bool m_bIsSelected;
bool m_bIsSelected; BTN_STATE m_eBtnState;
BtnClkCallback m_Callback; BtnClkCallback m_Callback;
}; };
@ -659,54 +670,53 @@ public:
// 创建开关按钮 // 创建开关按钮
EButtonToggle( EButtonToggle(
ENode * toggleOnNormal, ENode * onNormal,
ENode * toggleOffNormal, ENode * offNormal,
const BtnClkCallback & callback = nullptr const BtnClkCallback & callback = nullptr
); );
// 创建开关按钮 // 创建开关按钮
EButtonToggle( EButtonToggle(
ENode * toggleOnNormal, ENode * onNormal,
ENode * toggleOffNormal, ENode * offNormal,
ENode * toggleOnSelected, ENode * onSelected,
ENode * toggleOffSelected, ENode * offSelected,
const BtnClkCallback & callback = nullptr const BtnClkCallback & callback = nullptr
); );
// 创建开关按钮 // 创建开关按钮
EButtonToggle( EButtonToggle(
ENode * toggleOnNormal, ENode * onNormal,
ENode * toggleOffNormal, ENode * offNormal,
ENode * toggleOnMouseOver, ENode * onMouseOver,
ENode * toggleOffMouseOver, ENode * offMouseOver,
ENode * toggleOnSelected, ENode * onSelected,
ENode * toggleOffSelected, ENode * offSelected,
const BtnClkCallback & callback = nullptr const BtnClkCallback & callback = nullptr
); );
// 创建开关按钮 // 创建开关按钮
EButtonToggle( EButtonToggle(
ENode * toggleOnNormal, ENode * onNormal,
ENode * toggleOffNormal, ENode * offNormal,
ENode * toggleOnMouseOver, ENode * onMouseOver,
ENode * toggleOffMouseOver, ENode * offMouseOver,
ENode * toggleOnSelected, ENode * onSelected,
ENode * toggleOffSelected, ENode * offSelected,
ENode * toggleOnDisabled, ENode * onDisabled,
ENode * toggleOffDisabled, ENode * offDisabled,
const BtnClkCallback & callback = nullptr const BtnClkCallback & callback = nullptr
); );
// 切换开关状态,并执行回调函数 // 切换开关状态(执行回调函数)
void toggle(); void toggle();
// 获取开关状态 // 获取开关状态
bool isToggleOn() const; bool getState() const;
// 打开或关闭开关 // 设置开关按钮的状态(打开或关闭)
// 仅设置按钮状态,不执行回调函数 void setState(
void setToggle( bool bState
bool toggle
); );
// 设置按钮打开状态下显示的按钮 // 设置按钮打开状态下显示的按钮
@ -749,9 +759,28 @@ public:
ENode * disabled ENode * disabled
); );
// 设置中心点的横向位置
// 默认为 0, 范围 [0, 1]
virtual void setPivotX(
float pivotX
) override;
// 设置中心点的纵向位置
// 默认为 0, 范围 [0, 1]
virtual void setPivotY(
float pivotY
) override;
// 设置中心点位置
// 默认为 (0, 0), 范围 [0, 1]
virtual void setPivot(
float pivotX,
float pivotY
) override;
protected: protected:
// 刷新按钮开关 // 刷新按钮开关
virtual void _updateToggle(); virtual void _updateState();
// 执行按钮回调函数 // 执行按钮回调函数
virtual void _runCallback() override; virtual void _runCallback() override;
@ -765,7 +794,7 @@ protected:
ENode * m_pSelectedOff; ENode * m_pSelectedOff;
ENode * m_pDisabledOn; ENode * m_pDisabledOn;
ENode * m_pDisabledOff; ENode * m_pDisabledOff;
bool m_bToggle; bool m_bState;
}; };