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

View File

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

View File

@ -35,7 +35,7 @@ void e2d::EActionSequence::_init()
{
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()
{
EAction::_init();
m_pFirstAction->setTarget(m_pTarget);
m_pSecondAction->setTarget(m_pTarget);
m_pFirstAction->_setTarget(m_pTarget);
m_pSecondAction->_setTarget(m_pTarget);
m_pFirstAction->_init();
}

View File

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

View File

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

View File

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

View File

@ -1,9 +1,23 @@
#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 float s_fTotalTime = 0;
// 每一帧间隔
static milliseconds s_tExceptedInvertal;
float e2d::ETime::getTotalTime()
@ -16,26 +30,10 @@ int e2d::ETime::getDeltaTime()
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()
{
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;
}
@ -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()
{
// 刷新时间
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()
{
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()
{
// 计算挂起时长
int nWaitMS = 16 - s_nInterval;
// 挂起线程,释放 CPU 占用
int nWaitMS = 16 - static_cast<int>(duration_cast<milliseconds>(s_tNow - s_tFixedUpdate).count());
if (nWaitMS > 1)
{
// 挂起线程,释放 CPU 占用
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()
{
// 关闭控制台
if (::GetConsoleWindow())
{
::FreeConsole();
}
// 关闭窗口
DestroyWindow(s_HWnd);
s_HWnd = nullptr;
}
void e2d::EWindow::__poll()

View File

@ -39,13 +39,21 @@ void e2d::EScene::_render()
void e2d::EScene::_update()
{
// 执行 onUpdate 函数
if (m_bAutoUpdate)
if (!EGame::isPaused())
{
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)

View File

@ -2,7 +2,7 @@
e2d::EButton::EButton()
: m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL)
, m_eBtnState(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, m_pNormal(nullptr)
@ -14,7 +14,7 @@ e2d::EButton::EButton()
e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL)
, m_eBtnState(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, 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)
: m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL)
, m_eBtnState(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, 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)
: m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL)
, m_eBtnState(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, 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)
: m_Callback((const BtnClkCallback &)nullptr)
, m_eStatus(EButton::NORMAL)
, m_eBtnState(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, m_pNormal(nullptr)
@ -228,7 +228,7 @@ void e2d::EButton::onUpdate()
{
// 鼠标左键按下,且位于按钮内时,标记 m_bIsSelected 为 true
m_bIsSelected = true;
_setStatus(EButton::SELECTED);
_setState(EButton::SELECTED);
return;
}
}
@ -237,25 +237,30 @@ void e2d::EButton::onUpdate()
{
if (pSelected->isPointIn(EInput::getMousePos()))
{
_setStatus(EButton::SELECTED);
_setState(EButton::SELECTED);
return;
}
}
else if (m_pNormal->isPointIn(EInput::getMousePos()))
{
_setStatus(EButton::MOUSEOVER);
_setState(EButton::MOUSEOVER);
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();
}
}
@ -269,11 +274,11 @@ void e2d::EButton::_updateVisiable()
if (m_bEnable)
{
if (m_eStatus == EButton::SELECTED && m_pSelected)
if (m_eBtnState == EButton::SELECTED && m_pSelected)
{
m_pSelected->setVisiable(true);
}
else if (m_eStatus == EButton::MOUSEOVER && m_pMouseover)
else if (m_eBtnState == EButton::MOUSEOVER && m_pMouseover)
{
m_pMouseover->setVisiable(true);
}

View File

@ -2,7 +2,7 @@
e2d::EButtonToggle::EButtonToggle()
: EButton()
, m_bToggle(true)
, m_bState(true)
, m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr)
@ -16,7 +16,7 @@ e2d::EButtonToggle::EButtonToggle()
e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNormal, const BtnClkCallback & callback)
: EButton()
, m_bToggle(true)
, m_bState(true)
, m_pNormalOn(nullptr)
, m_pMouseoverOn(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)
: EButton()
, m_bToggle(true)
, m_bState(true)
, m_pNormalOn(nullptr)
, m_pMouseoverOn(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)
: EButton()
, m_bToggle(true)
, m_bState(true)
, m_pNormalOn(nullptr)
, m_pMouseoverOn(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)
: EButton()
, m_bToggle(true)
, m_bState(true)
, m_pNormalOn(nullptr)
, m_pMouseoverOn(nullptr)
, m_pSelectedOn(nullptr)
@ -97,7 +97,7 @@ e2d::EButtonToggle::EButtonToggle(ENode * toggleOnNormal, ENode * toggleOffNorma
void e2d::EButtonToggle::toggle()
{
// 设置按钮状态
setToggle(!m_bToggle);
setState(!m_bState);
// 执行回调函数
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;
_updateToggle();
m_bState = bState;
_updateState();
_updateVisiable();
}
}
@ -133,10 +133,11 @@ void e2d::EButtonToggle::setNormal(ENode * normal)
if (normal)
{
this->addChild(normal);
normal->setPivot(m_fPivotX, m_fPivotY);
}
m_pNormalOn = normal;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -154,10 +155,11 @@ void e2d::EButtonToggle::setMouseOver(ENode * mouseover)
if (mouseover)
{
this->addChild(mouseover);
mouseover->setPivot(m_fPivotX, m_fPivotY);
}
m_pMouseoverOn = mouseover;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -175,10 +177,11 @@ void e2d::EButtonToggle::setSelected(ENode * selected)
if (selected)
{
this->addChild(selected);
selected->setPivot(m_fPivotX, m_fPivotY);
}
m_pSelectedOn = selected;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -196,10 +199,11 @@ void e2d::EButtonToggle::setDisabled(ENode * disabled)
if (disabled)
{
this->addChild(disabled);
disabled->setPivot(m_fPivotX, m_fPivotY);
}
m_pDisabledOn = disabled;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -217,10 +221,11 @@ void e2d::EButtonToggle::setNormalOff(ENode * normal)
if (normal)
{
this->addChild(normal);
normal->setPivot(m_fPivotX, m_fPivotY);
}
m_pNormalOff = normal;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -238,10 +243,11 @@ void e2d::EButtonToggle::setMouseOverOff(ENode * mouseover)
if (mouseover)
{
this->addChild(mouseover);
mouseover->setPivot(m_fPivotX, m_fPivotY);
}
m_pMouseoverOff = mouseover;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -259,10 +265,11 @@ void e2d::EButtonToggle::setSelectedOff(ENode * selected)
if (selected)
{
this->addChild(selected);
selected->setPivot(m_fPivotX, m_fPivotY);
}
m_pSelectedOff = selected;
_updateToggle();
_updateState();
_updateVisiable();
}
}
@ -280,17 +287,57 @@ void e2d::EButtonToggle::setDisabledOff(ENode * disabled)
if (disabled)
{
this->addChild(disabled);
disabled->setPivot(m_fPivotX, m_fPivotY);
}
m_pDisabledOff = disabled;
_updateToggle();
_updateState();
_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_pMouseover = m_pMouseoverOn;
@ -318,8 +365,8 @@ void e2d::EButtonToggle::_updateToggle()
void e2d::EButtonToggle::_runCallback()
{
m_bToggle = !m_bToggle;
_updateToggle();
m_bState = !m_bState;
_updateState();
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)
{
@ -77,7 +77,7 @@ void e2d::ENode::_update()
// 访问 Order 小于零的节点
if (child->getOrder() < 0)
{
child->_update();
child->_update(bPaused);
}
else
{
@ -85,20 +85,29 @@ void e2d::ENode::_update()
}
}
// 执行 onUpdate 函数
if (m_bAutoUpdate)
if (bPaused)
{
this->onPause();
}
else if (m_bAutoUpdate)
{
this->onUpdate();
}
// 访问剩余节点
for (; i < size; i++)
m_vChildren[i]->_update();
m_vChildren[i]->_update(bPaused);
}
else
{
// 执行 onUpdate 函数
this->onUpdate();
if (bPaused)
{
this->onPause();
}
else if (m_bAutoUpdate)
{
this->onUpdate();
}
}
}
@ -720,7 +729,7 @@ void e2d::ENode::runAction(EAction * action)
{
action = action->clone();
}
action->setTarget(this);
action->_setTarget(this);
EActionManager::addAction(action);
}

View File

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

View File

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

View File

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

View File

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

View File

@ -21,6 +21,12 @@ public:
virtual ~ENode();
// 进入场景时执行
virtual void onEnter() {}
// 离开场景时执行
virtual void onExit() {}
// 更新节点
virtual void onUpdate() {}
@ -33,11 +39,11 @@ public:
int nRelation /* 碰撞关系,取值为 ERelation::VALUE 中的一种 */
) {}
// 进入场景时执行
virtual void onEnter() {}
// 游戏暂停时的处理
virtual void onPause() {}
// 离开场景时执行
virtual void onExit() {}
// 节点被销毁时的处理
virtual void onDestroy() {}
// 获取节点显示状态
virtual bool isVisiable() const;
@ -331,46 +337,48 @@ public:
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
);
// 对自身进行二维矩阵变换
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 _updateOpacity(ENode * node);
// 修改节点大小
virtual void _setSize(
float width,
float height
);
protected:
EString m_sName;
size_t m_nHashName;
@ -624,13 +632,16 @@ public:
) override;
// 更新按钮状态
virtual void onUpdate();
virtual void onUpdate() override;
// 更新游戏暂停时的按钮状态
virtual void onPause() override;
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();
@ -639,14 +650,14 @@ protected:
virtual void _runCallback();
protected:
STATUS m_eStatus;
ENode * m_pNormal;
ENode * m_pMouseover;
ENode * m_pSelected;
ENode * m_pDisabled;
bool m_bEnable;
bool m_bIsSelected;
BtnClkCallback m_Callback;
ENode * m_pNormal;
ENode * m_pMouseover;
ENode * m_pSelected;
ENode * m_pDisabled;
bool m_bEnable;
bool m_bIsSelected;
BTN_STATE m_eBtnState;
BtnClkCallback m_Callback;
};
@ -659,54 +670,53 @@ public:
// 创建开关按钮
EButtonToggle(
ENode * toggleOnNormal,
ENode * toggleOffNormal,
ENode * onNormal,
ENode * offNormal,
const BtnClkCallback & callback = nullptr
);
// 创建开关按钮
EButtonToggle(
ENode * toggleOnNormal,
ENode * toggleOffNormal,
ENode * toggleOnSelected,
ENode * toggleOffSelected,
ENode * onNormal,
ENode * offNormal,
ENode * onSelected,
ENode * offSelected,
const BtnClkCallback & callback = nullptr
);
// 创建开关按钮
EButtonToggle(
ENode * toggleOnNormal,
ENode * toggleOffNormal,
ENode * toggleOnMouseOver,
ENode * toggleOffMouseOver,
ENode * toggleOnSelected,
ENode * toggleOffSelected,
ENode * onNormal,
ENode * offNormal,
ENode * onMouseOver,
ENode * offMouseOver,
ENode * onSelected,
ENode * offSelected,
const BtnClkCallback & callback = nullptr
);
// 创建开关按钮
EButtonToggle(
ENode * toggleOnNormal,
ENode * toggleOffNormal,
ENode * toggleOnMouseOver,
ENode * toggleOffMouseOver,
ENode * toggleOnSelected,
ENode * toggleOffSelected,
ENode * toggleOnDisabled,
ENode * toggleOffDisabled,
ENode * onNormal,
ENode * offNormal,
ENode * onMouseOver,
ENode * offMouseOver,
ENode * onSelected,
ENode * offSelected,
ENode * onDisabled,
ENode * offDisabled,
const BtnClkCallback & callback = nullptr
);
// 切换开关状态,并执行回调函数
// 切换开关状态(执行回调函数)
void toggle();
// 获取开关状态
bool isToggleOn() const;
bool getState() const;
// 打开或关闭开关
// 仅设置按钮状态,不执行回调函数
void setToggle(
bool toggle
// 设置开关按钮的状态(打开或关闭)
void setState(
bool bState
);
// 设置按钮打开状态下显示的按钮
@ -749,9 +759,28 @@ public:
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:
// 刷新按钮开关
virtual void _updateToggle();
virtual void _updateState();
// 执行按钮回调函数
virtual void _runCallback() override;
@ -765,7 +794,7 @@ protected:
ENode * m_pSelectedOff;
ENode * m_pDisabledOn;
ENode * m_pDisabledOff;
bool m_bToggle;
bool m_bState;
};