新增EMsgManager

This commit is contained in:
Nomango 2017-10-13 11:42:36 +08:00
parent 465b8d3384
commit 50d9575631
63 changed files with 553 additions and 4982 deletions

2
.gitignore vendored
View File

@ -3,6 +3,8 @@ Easy2D/Win32/
Easy2D/x64/
/Win32/
/x64/
Debug/
Release/
backup/
*.lnk
.vs

156
Demo/Demo.vcxproj Normal file
View File

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Demo</RootNamespace>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<LibraryPath>$(MSBuildProjectDirectory)\..\Win32;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

22
Demo/Demo.vcxproj.filters Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
</Project>

24
Demo/main.cpp Normal file
View File

@ -0,0 +1,24 @@
#include "..\Easy2D\easy2d.h"
#pragma comment(lib, "d2d1.lib")
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
EApp app;
if (app.init(L"Easy2D Demo", 640, 480))
{
auto scene = new EScene();
auto node = new ENode();
node->setPos(50, 80);
node->setSize(30, 180);
scene->add(node);
app.enterScene(scene);
app.run();
}
return 0;
}

View File

@ -1,38 +1,38 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.12
VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Easy2D", "Easy2D\Easy2D.vcxproj", "{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo\Demo.vcxproj", "{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
DebugW|x64 = DebugW|x64
DebugW|x86 = DebugW|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
ReleaseW|x64 = ReleaseW|x64
ReleaseW|x86 = ReleaseW|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.ActiveCfg = Debug|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Build.0 = Debug|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x64.Deploy.0 = Debug|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.ActiveCfg = Debug|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Build.0 = Debug|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x64.ActiveCfg = DebugW|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x64.Build.0 = DebugW|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x86.ActiveCfg = DebugW|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.DebugW|x86.Build.0 = DebugW|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Debug|x86.Deploy.0 = Debug|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.ActiveCfg = Release|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x64.Build.0 = Release|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.ActiveCfg = Release|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.Release|x86.Build.0 = Release|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x64.ActiveCfg = ReleaseW|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x64.Build.0 = ReleaseW|x64
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x86.ActiveCfg = ReleaseW|Win32
{FF7F943D-A89C-4E6C-97CF-84F7D8FF8EDF}.ReleaseW|x86.Build.0 = ReleaseW|Win32
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x64.ActiveCfg = Debug|x64
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x64.Build.0 = Debug|x64
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x86.ActiveCfg = Debug|Win32
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Debug|x86.Build.0 = Debug|Win32
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x64.ActiveCfg = Release|x64
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x64.Build.0 = Release|x64
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.ActiveCfg = Release|Win32
{9D85A92F-BCCE-4EF0-BAD3-601C0086661C}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,85 +0,0 @@
#include "..\easy2d.h"
#include <assert.h>
Action::Action() :
m_bRunning(true),
m_bWaiting(false),
m_bEnding(false),
m_bInit(false),
m_pTargetSprite(nullptr),
m_pParentScene(nullptr)
{
// 默认动作 15ms 运行一次
setInterval(15);
}
Action::~Action()
{
}
bool Action::isRunning()
{
return m_bRunning && !m_bWaiting;
}
bool Action::isEnding()
{
return m_bEnding;
}
void Action::start()
{
m_bRunning = true;
}
void Action::resume()
{
m_bRunning = true;
}
void Action::pause()
{
m_bRunning = false;
}
void Action::stop()
{
m_bEnding = true;
}
void Action::wait()
{
m_bWaiting = true;
}
void Action::notify()
{
m_bWaiting = false;
}
void Action::setInterval(LONGLONG milliSeconds)
{
// 设置动作的时间间隔
m_nAnimationInterval = milliSeconds;
}
Action * Action::reverse() const
{
assert(0);
return nullptr;
}
Sprite * Action::getTarget()
{
return m_pTargetSprite;
}
void Action::_init()
{
m_bInit = true;
}
void Action::_reset()
{
m_bInit = false;
m_bEnding = false;
}

View File

@ -1,31 +0,0 @@
#include "..\easy2d.h"
ActionCallback::ActionCallback(const std::function<void()>& callback) :
m_Callback(callback)
{
}
ActionCallback::~ActionCallback()
{
}
ActionCallback * ActionCallback::copy() const
{
return new ActionCallback(m_Callback);
}
void ActionCallback::_init()
{
Action::_init();
}
void ActionCallback::_exec(std::chrono::steady_clock::time_point nNow)
{
m_Callback();
this->stop();
}
void ActionCallback::_reset()
{
Action::_reset();
}

View File

@ -1,39 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
ActionDelay::ActionDelay(float duration)
{
setInterval(LONGLONG(duration * 1000));
}
ActionDelay::~ActionDelay()
{
}
ActionDelay * ActionDelay::copy() const
{
return new ActionDelay(m_nAnimationInterval / 1000.0f);
}
void ActionDelay::_init()
{
Action::_init();
// 记录当前时间
m_nLast = steady_clock::now();
}
void ActionDelay::_exec(steady_clock::time_point nNow)
{
// 判断时间间隔是否足够
if (duration_cast<milliseconds>(nNow - m_nLast).count() > m_nAnimationInterval)
{
this->stop();
}
}
void ActionDelay::_reset()
{
Action::_reset();
// 记录当前时间
m_nLast = steady_clock::now();
}

View File

@ -1,83 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
ActionFrames::ActionFrames() :
m_nFrameIndex(0)
{
// 帧动画默认 .5s 刷新一次
setInterval(500);
}
ActionFrames::ActionFrames(LONGLONG frameDelay) :
m_nFrameIndex(0)
{
setInterval(frameDelay);
}
ActionFrames::~ActionFrames()
{
for (auto frame : m_vFrames)
{
frame->autoRelease();
frame->release();
}
}
void ActionFrames::_init()
{
Action::_init();
// 记录当前时间
m_nLast = steady_clock::now();
}
void ActionFrames::_exec(steady_clock::time_point nNow)
{
// 判断时间间隔是否足够
while (duration_cast<milliseconds>(nNow - m_nLast).count() > m_nAnimationInterval)
{
// 重新记录时间
m_nLast += milliseconds(m_nAnimationInterval);
m_pTargetSprite->setImage(m_vFrames[m_nFrameIndex]);
m_nFrameIndex++;
// 判断动作是否结束
if (m_nFrameIndex == m_vFrames.size())
{
this->stop();
break;
}
}
}
void ActionFrames::_reset()
{
Action::_reset();
m_nFrameIndex = 0;
// 记录当前时间
m_nLast = steady_clock::now();
}
void ActionFrames::addFrame(Image * frame)
{
if (frame)
{
m_vFrames.push_back(frame);
frame->retain();
}
}
ActionFrames * ActionFrames::copy() const
{
auto a = new ActionFrames(this->m_nAnimationInterval);
for (auto f : m_vFrames)
{
a->addFrame(f);
}
return a;
}
ActionFrames * ActionFrames::reverse() const
{
auto a = this->copy();
a->m_vFrames.reserve(m_vFrames.size());
return a;
}

View File

@ -1,51 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
ActionMoveBy::ActionMoveBy(float duration, CVector vec) :
Animation(duration)
{
m_MoveVector = vec;
}
ActionMoveBy::~ActionMoveBy()
{
}
void ActionMoveBy::_init()
{
Animation::_init();
m_BeginPos = m_pTargetSprite->getPos();
}
void ActionMoveBy::_exec(steady_clock::time_point nNow)
{
while (Animation::_isDelayEnough(nNow))
{
// 计算移动位置
float scale = float(m_nDuration) / m_nTotalDuration;
// 移动 Sprite
m_pTargetSprite->setPos(int(m_BeginPos.x + m_MoveVector.x * scale),
int(m_BeginPos.y + m_MoveVector.y * scale));
// 判断动作是否结束
if (_isEnd())
{
this->stop();
break;
}
}
}
void ActionMoveBy::_reset()
{
Animation::_reset();
}
ActionMoveBy * ActionMoveBy::copy() const
{
return new ActionMoveBy(m_nAnimationInterval / 1000.0f, m_MoveVector);
}
ActionMoveBy * ActionMoveBy::reverse() const
{
return new ActionMoveBy(m_nTotalDuration / 1000.0f, CVector(-m_MoveVector.x, -m_MoveVector.y));
}

View File

@ -1,27 +0,0 @@
#include "..\easy2d.h"
ActionMoveTo::ActionMoveTo(float duration, CPoint pos) :
ActionMoveBy(duration, CVector())
{
m_EndPos = pos;
}
ActionMoveTo::~ActionMoveTo()
{
}
ActionMoveTo * ActionMoveTo::copy() const
{
return new ActionMoveTo(m_nAnimationInterval / 1000.0f, m_EndPos);
}
void ActionMoveTo::_init()
{
ActionMoveBy::_init();
m_MoveVector = m_EndPos - m_BeginPos;
}
void ActionMoveTo::_reset()
{
ActionMoveBy::_reset();
}

View File

@ -1,39 +0,0 @@
#include "..\easy2d.h"
ActionNeverStop::ActionNeverStop(Action * action) :
m_Action(action)
{
m_Action->retain();
}
ActionNeverStop::~ActionNeverStop()
{
SafeRelease(m_Action);
}
ActionNeverStop * ActionNeverStop::copy() const
{
return new ActionNeverStop(m_Action->copy());
}
void ActionNeverStop::_init()
{
Action::_init();
m_Action->m_pTargetSprite = m_pTargetSprite;
m_Action->_init();
}
void ActionNeverStop::_exec(std::chrono::steady_clock::time_point nNow)
{
m_Action->_exec(nNow);
if (m_Action->isEnding())
{
m_Action->_reset();
}
}
void ActionNeverStop::_reset()
{
Action::_reset();
}

View File

@ -1,50 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
ActionOpacityBy::ActionOpacityBy(float duration, float opacity) :
Animation(duration)
{
m_nVariation = opacity;
}
ActionOpacityBy::~ActionOpacityBy()
{
}
void ActionOpacityBy::_init()
{
Animation::_init();
m_nBeginVal = m_pTargetSprite->getOpacity();
}
void ActionOpacityBy::_exec(steady_clock::time_point nNow)
{
while (Animation::_isDelayEnough(nNow))
{
// 计算移动位置
float scale = float(m_nDuration) / m_nTotalDuration;
// 移动 Sprite
m_pTargetSprite->setOpacity(m_nBeginVal + m_nVariation * scale);
// 判断动作是否结束
if (_isEnd())
{
this->stop();
break;
}
}
}
void ActionOpacityBy::_reset()
{
Animation::_reset();
}
ActionOpacityBy * ActionOpacityBy::copy() const
{
return new ActionOpacityBy(m_nAnimationInterval / 1000.0f, m_nVariation);
}
ActionOpacityBy * ActionOpacityBy::reverse() const
{
return new ActionOpacityBy(m_nTotalDuration / 1000.0f, -m_nVariation);
}

View File

@ -1,27 +0,0 @@
#include "..\easy2d.h"
ActionOpacityTo::ActionOpacityTo(float duration, float opacity) :
ActionOpacityBy(duration, 0)
{
m_nEndVal = opacity;
}
ActionOpacityTo::~ActionOpacityTo()
{
}
ActionOpacityTo * ActionOpacityTo::copy() const
{
return new ActionOpacityTo(m_nAnimationInterval / 1000.0f, m_nEndVal);
}
void ActionOpacityTo::_init()
{
ActionOpacityBy::_init();
m_nVariation = m_nEndVal - m_nBeginVal;
}
void ActionOpacityTo::_reset()
{
ActionOpacityBy::_reset();
}

View File

@ -1,52 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
ActionScaleBy::ActionScaleBy(float duration, float scaleX, float scaleY) :
Animation(duration)
{
m_nVariationX = scaleX;
m_nVariationY = scaleY;
}
ActionScaleBy::~ActionScaleBy()
{
}
void ActionScaleBy::_init()
{
Animation::_init();
m_nBeginScaleX = m_pTargetSprite->getScaleX();
m_nBeginScaleY = m_pTargetSprite->getScaleY();
}
void ActionScaleBy::_exec(steady_clock::time_point nNow)
{
while (Animation::_isDelayEnough(nNow))
{
// 计算移动位置
float scale = float(m_nDuration) / m_nTotalDuration;
// 移动 Sprite
m_pTargetSprite->setScale(m_nBeginScaleX + m_nVariationX * scale, m_nBeginScaleX + m_nVariationX * scale);
// 判断动作是否结束
if (_isEnd())
{
this->stop();
break;
}
}
}
void ActionScaleBy::_reset()
{
Animation::_reset();
}
ActionScaleBy * ActionScaleBy::copy() const
{
return new ActionScaleBy(m_nAnimationInterval / 1000.0f, m_nVariationX, m_nVariationY);
}
ActionScaleBy * ActionScaleBy::reverse() const
{
return new ActionScaleBy(m_nTotalDuration / 1000.0f, -m_nVariationX, -m_nVariationY);
}

View File

@ -1,29 +0,0 @@
#include "..\easy2d.h"
ActionScaleTo::ActionScaleTo(float duration, float scaleX, float scaleY) :
ActionScaleBy(duration, 0, 0)
{
m_nEndScaleX = scaleX;
m_nEndScaleY = scaleY;
}
ActionScaleTo::~ActionScaleTo()
{
}
ActionScaleTo * ActionScaleTo::copy() const
{
return new ActionScaleTo(m_nAnimationInterval / 1000.0f, m_nEndScaleX, m_nEndScaleY);
}
void ActionScaleTo::_init()
{
ActionScaleBy::_init();
m_nVariationX = m_nEndScaleX - m_nBeginScaleX;
m_nVariationY = m_nEndScaleY - m_nBeginScaleY;
}
void ActionScaleTo::_reset()
{
ActionScaleBy::_reset();
}

View File

@ -1,105 +0,0 @@
#include "..\easy2d.h"
#include <stdarg.h>
ActionSequence::ActionSequence() :
m_nActionIndex(0)
{
}
ActionSequence::ActionSequence(int number, Action * action1, ...) :
m_nActionIndex(0)
{
va_list params;
va_start(params, number);
while (number > 0)
{
this->addAction(va_arg(params, Action*));
number--;
}
va_end(params);
}
ActionSequence::~ActionSequence()
{
for (auto action : m_vActions)
{
SafeRelease(action);
}
}
void ActionSequence::_init()
{
Action::_init();
// 将所有动作与目标绑定
for (auto action : m_vActions)
{
action->m_pTargetSprite = m_pTargetSprite;
}
// 初始化第一个动作
m_vActions[0]->_init();
}
void ActionSequence::_exec(std::chrono::steady_clock::time_point nNow)
{
m_vActions[m_nActionIndex]->_exec(nNow);
if (m_vActions[m_nActionIndex]->isEnding())
{
m_nActionIndex++;
if (m_nActionIndex == m_vActions.size())
{
this->stop();
}
else
{
m_vActions[m_nActionIndex]->_init();
}
}
}
void ActionSequence::_reset()
{
Action::_reset();
for (auto action : m_vActions)
{
action->_reset();
}
m_nActionIndex = 0;
}
void ActionSequence::addAction(Action * action)
{
m_vActions.push_back(action);
action->retain();
}
ActionSequence * ActionSequence::copy() const
{
auto a = new ActionSequence();
for (auto action : m_vActions)
{
a->addAction(action->copy());
}
return a;
}
ActionSequence * ActionSequence::reverse(bool actionReverse) const
{
auto a = new ActionSequence();
for (auto action : a->m_vActions)
{
if (actionReverse)
{
a->addAction(action->reverse());
}
else
{
a->addAction(action->copy());
}
}
// 将动作顺序逆序排列
a->m_vActions.reserve(m_vActions.size());
return a;
}

View File

@ -1,70 +0,0 @@
#include "..\easy2d.h"
ActionTwo::ActionTwo(Action * actionFirst, Action * actionSecond) :
m_FirstAction(actionFirst),
m_SecondAction(actionSecond)
{
m_FirstAction->retain();
m_SecondAction->retain();
}
ActionTwo::~ActionTwo()
{
SafeRelease(m_FirstAction);
SafeRelease(m_SecondAction);
}
ActionTwo * ActionTwo::copy() const
{
return new ActionTwo(m_FirstAction->copy(), m_SecondAction->copy());
}
ActionTwo * ActionTwo::reverse(bool actionReverse) const
{
if (actionReverse)
{
return new ActionTwo(m_SecondAction->reverse(), m_FirstAction->reverse());
}
else
{
return new ActionTwo(m_SecondAction->copy(), m_FirstAction->copy());
}
}
void ActionTwo::_init()
{
Action::_init();
m_FirstAction->m_pTargetSprite = m_pTargetSprite;
m_SecondAction->m_pTargetSprite = m_pTargetSprite;
m_FirstAction->_init();
}
void ActionTwo::_exec(std::chrono::steady_clock::time_point nNow)
{
if (!m_FirstAction->isEnding())
{
m_FirstAction->_exec(nNow);
if (m_FirstAction->isEnding())
{
// 返回 true 表示第一个动作已经结束
m_SecondAction->_init();
}
}
else if (!m_SecondAction->isEnding())
{
m_SecondAction->_exec(nNow);
}
else
{
this->stop();
}
}
void ActionTwo::_reset()
{
Action::_reset();
m_FirstAction->_reset();
m_SecondAction->_reset();
}

View File

@ -1,45 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
Animation::Animation(float duration)
{
m_nDuration = 0;
m_nTotalDuration = UINT(duration * 1000);
}
Animation::~Animation()
{
}
bool Animation::_isEnd() const
{
return m_nDuration >= m_nTotalDuration;
}
void Animation::_init()
{
Action::_init();
// 记录当前时间
m_nLast = steady_clock::now();
}
bool Animation::_isDelayEnough(steady_clock::time_point nNow)
{
// 判断时间间隔是否足够
if (duration_cast<milliseconds>(nNow - m_nLast).count() > m_nAnimationInterval)
{
// 重新记录时间
m_nLast += milliseconds(m_nAnimationInterval);
m_nDuration += m_nAnimationInterval;
return true;
}
return false;
}
void Animation::_reset()
{
Action::_reset();
m_nDuration = 0;
// 记录当前时间
m_nLast = steady_clock::now();
}

View File

@ -1,5 +1,6 @@
#include "..\ebase.h"
#include "..\Win\winbase.h"
#include "..\etools.h"
#include <stack>
#include <chrono>
#include <thread>
@ -18,7 +19,7 @@ std::stack<e2d::EScene*> s_SceneStack;
e2d::EApp::EApp()
: m_bRunning(false)
, m_ClearColor(EColor::White)
, m_ClearColor(EColor::Black)
, m_bSaveScene(true)
, m_pCurrentScene(nullptr)
, m_pNextScene(nullptr)
@ -46,72 +47,74 @@ bool e2d::EApp::init(e2d::EString title, e2d::ESize size, bool bShowConsole /* =
bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShowConsole /* = false */)
{
m_sTitle = title;
HRESULT hr;
hr = CoInitialize(NULL);
if (SUCCEEDED(hr))
{
// 关闭控制台.
if (bShowConsole)
// 关闭控制台
if (!bShowConsole)
{
HWND hwnd = FindWindow(L"ConsoleWindowClass", NULL);
HWND consoleHWnd = FindWindow(L"ConsoleWindowClass", NULL);
if (hwnd)
if (consoleHWnd)
{
ShowWindow(hwnd, SW_HIDE);
ShowWindow(consoleHWnd, SW_HIDE);
}
}
// 初始化 device-indpendent 资源
// 比如 Direct2D factory.
hr = _createDeviceIndependentResources();
}
if (SUCCEEDED(hr))
{
// 初始化 device-indpendent 资源
// 比如 Direct2D factory.
hr = _createDeviceIndependentResources();
// 注册窗口类
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = EApp::WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG_PTR);
wcex.hInstance = HINST_THISCOMPONENT;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
wcex.lpszClassName = L"E2DApp";
if (SUCCEEDED(hr))
RegisterClassEx(&wcex);
// Because the CreateWindow function takes its size in pixels,
// obtain the system DPI and use it to scale the window size.
FLOAT dpiX, dpiY;
// The factory returns the current system DPI. This is also the value it will use
// to create its own windows.
GetFactory()->GetDesktopDpi(&dpiX, &dpiY);
m_sTitle = title;
// Create the window.
GetHWnd() = CreateWindow(
L"E2DApp",
m_sTitle.c_str(),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<UINT>(ceil(width * dpiX / 96.f)),
static_cast<UINT>(ceil(height * dpiY / 96.f)),
NULL,
NULL,
HINST_THISCOMPONENT,
this
);
hr = GetHWnd() ? S_OK : E_FAIL;
if (FAILED(hr))
{
// 注册窗口类
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = EApp::WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(LONG_PTR);
wcex.hInstance = HINST_THISCOMPONENT;
wcex.hbrBackground = NULL;
wcex.lpszMenuName = NULL;
wcex.hCursor = LoadCursor(NULL, IDI_APPLICATION);
wcex.lpszClassName = L"E2DApp";
RegisterClassEx(&wcex);
// Because the CreateWindow function takes its size in pixels,
// obtain the system DPI and use it to scale the window size.
FLOAT dpiX, dpiY;
// The factory returns the current system DPI. This is also the value it will use
// to create its own windows.
GetFactory()->GetDesktopDpi(&dpiX, &dpiY);
// Create the window.
GetHWnd() = CreateWindow(
L"E2DApp",
m_sTitle.c_str(),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<UINT>(ceil(width * dpiX / 96.f)),
static_cast<UINT>(ceil(height * dpiY / 96.f)),
NULL,
NULL,
HINST_THISCOMPONENT,
this
);
hr = GetHWnd() ? S_OK : E_FAIL;
UnregisterClass(L"E2DApp", HINST_THISCOMPONENT);
MessageBox(nullptr, L"Create Window Failed!", L"Error", MB_OK);
}
}
@ -126,6 +129,9 @@ bool e2d::EApp::init(e2d::EString title, UINT32 width, UINT32 height, bool bShow
// 运行游戏
void e2d::EApp::run()
{
ASSERT(m_pNextScene != nullptr);
// 进入第一个场景
_enterNextScene();
// 显示窗口
ShowWindow(GetHWnd(), SW_SHOWNORMAL);
UpdateWindow(GetHWnd());
@ -181,7 +187,7 @@ void e2d::EApp::_mainLoop()
{
// 记录当前时间
nLast = nNow;
//
// 执行游戏控制
_onControl();
// 刷新游戏画面
_onRender();
@ -213,7 +219,7 @@ void e2d::EApp::_onControl()
//KeyMsg::__exec(); // 键盘按键检测
//Timer::__exec(); // 定时器执行程序
//ActionManager::__exec(); // 动作管理器执行程序
//EObjectManager::__flush(); // 刷新内存池
EObjectManager::__flush(); // 刷新内存池
}
// This method discards device-specific
@ -233,7 +239,7 @@ bool e2d::EApp::_onRender()
GetRenderTarget()->Clear(D2D1::ColorF(m_ClearColor));
m_pCurrentScene->_onDraw(); // 绘制当前场景
m_pCurrentScene->_onRender(); // 绘制当前场景
hr = GetRenderTarget()->EndDraw();
}
@ -474,7 +480,7 @@ HRESULT e2d::EApp::_createDeviceIndependentResources()
if (FAILED(hr))
{
MessageBox(nullptr, L"Create Device Independent Resources Fail!", L"Error", MB_OK);
MessageBox(nullptr, L"Create Device Independent Resources Failed!", L"Error", MB_OK);
}
return hr;
@ -506,6 +512,11 @@ HRESULT e2d::EApp::_createDeviceResources()
);
}
if (FAILED(hr))
{
MessageBox(nullptr, L"Create Device Resources Failed!", L"Error", MB_OK);
}
return hr;
}
@ -537,10 +548,10 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
if (message == WM_CREATE)
{
LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
EApp *pEApp = (EApp *)pcs->lpCreateParams;
e2d::EApp *pEApp = (e2d::EApp *)pcs->lpCreateParams;
::SetWindowLongPtrW(
GetHWnd(),
hWnd,
GWLP_USERDATA,
PtrToUlong(pEApp)
);
@ -549,9 +560,9 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
}
else
{
EApp *pEApp = reinterpret_cast<EApp *>(static_cast<LONG_PTR>(
e2d::EApp *pEApp = reinterpret_cast<e2d::EApp *>(static_cast<LONG_PTR>(
::GetWindowLongPtrW(
GetHWnd(),
hWnd,
GWLP_USERDATA
)));
@ -572,6 +583,23 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
} while (msg.wParam != WA_ACTIVE);
}
}*/
case WM_LBUTTONUP:
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
case WM_MBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_RBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_MOUSEMOVE:
case WM_MOUSEWHEEL:
{
EMsgManager::setMouseMsg(message);
}
result = 0;
break;
case WM_SIZE:
{
UINT width = LOWORD(lParam);
@ -584,7 +612,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_DISPLAYCHANGE:
{
InvalidateRect(GetHWnd(), NULL, FALSE);
InvalidateRect(hWnd, NULL, FALSE);
}
result = 0;
wasHandled = true;
@ -593,7 +621,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
case WM_PAINT:
{
pEApp->_onRender();
ValidateRect(GetHWnd(), NULL);
ValidateRect(hWnd, NULL);
}
result = 0;
wasHandled = true;
@ -611,7 +639,7 @@ LRESULT e2d::EApp::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
if (!wasHandled)
{
result = DefWindowProc(GetHWnd(), message, wParam, lParam);
result = DefWindowProc(hWnd, message, wParam, lParam);
}
}

View File

@ -25,12 +25,12 @@ void e2d::EScene::_exec()
}
}
void e2d::EScene::_onDraw()
void e2d::EScene::_onRender()
{
// 绘制所有节点
for (auto child : m_vChildren)
{
child->_onDraw();
child->_onRender();
}
}
@ -46,7 +46,7 @@ void e2d::EScene::onExit()
{
}
void e2d::EScene::add(ENode * child, int zOrder)
void e2d::EScene::add(ENode * child, int zOrder /* = 0 */)
{
// 断言添加的节点非空
ASSERT(child != nullptr);
@ -80,7 +80,7 @@ void e2d::EScene::add(ENode * child, int zOrder)
}
}
bool e2d::EScene::del(ENode * child)
bool e2d::EScene::del(ENode * child, bool autoRelease /* = true */)
{
if (child == nullptr) return false;
@ -91,6 +91,7 @@ bool e2d::EScene::del(ENode * child)
// 找到相同节点
if (*iter == child)
{
if (autoRelease) (*iter)->autoRelease();
// 对象的引用计数减一
(*iter)->release();
// 去掉该节点

View File

@ -1,34 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="DebugW|Win32">
<Configuration>DebugW</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="DebugW|x64">
<Configuration>DebugW</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseW|Win32">
<Configuration>ReleaseW</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="ReleaseW|x64">
<Configuration>ReleaseW</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
@ -43,25 +27,12 @@
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>false</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
@ -69,25 +40,12 @@
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>false</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
@ -99,74 +57,38 @@
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|Win32'" Label="PropertySheets">
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|x64'" Label="PropertySheets">
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetName>Easy2Dd</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetName>Easy2Ddw</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetName>Easy2Dd</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|x64'">
<LinkIncremental>true</LinkIncremental>
<TargetName>Easy2Ddw</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Easy2D</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Easy2Dw</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Easy2D</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|x64'">
<LinkIncremental>false</LinkIncremental>
<TargetName>Easy2Dw</TargetName>
<OutDir>$(SolutionDir)$(Platform)\</OutDir>
@ -179,31 +101,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat>
<MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<ProjectReference>
<LinkLibraryDependencies>false</LinkLibraryDependencies>
</ProjectReference>
<Lib>
<AdditionalDependencies>
</AdditionalDependencies>
<AdditionalLibraryDirectories>
</AdditionalLibraryDirectories>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
<MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
@ -223,27 +121,6 @@
</ProjectReference>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat>
<MinimalRebuild>false</MinimalRebuild>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<Lib>
<AdditionalLibraryDirectories>
</AdditionalLibraryDirectories>
<AdditionalDependencies>
</AdditionalDependencies>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugW|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
@ -265,30 +142,6 @@
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<Lib>
<AdditionalLibraryDirectories>
</AdditionalLibraryDirectories>
<AdditionalDependencies>
</AdditionalDependencies>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
@ -315,30 +168,6 @@
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
<DebugInformationFormat>None</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
<Lib>
<AdditionalLibraryDirectories>
</AdditionalLibraryDirectories>
<AdditionalDependencies>
</AdditionalDependencies>
</Lib>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseW|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
@ -367,6 +196,8 @@
<ClCompile Include="Base\EObject.cpp" />
<ClCompile Include="Base\EScene.cpp" />
<ClCompile Include="Node\ENode.cpp" />
<ClCompile Include="Tool\EMouseListener.cpp" />
<ClCompile Include="Tool\EMsgManager.cpp" />
<ClCompile Include="Tool\EObjectManager.cpp" />
<ClCompile Include="Win\winbase.cpp" />
</ItemGroup>

View File

@ -1,72 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="源文件\Base">
<UniqueIdentifier>{261633d3-3814-40c7-bd6d-201ede6c6ade}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\Win">
<Filter Include="Win">
<UniqueIdentifier>{2f0f3d30-bfc2-4aea-a170-258bbaacaa79}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\Node">
<Filter Include="Tool">
<UniqueIdentifier>{42d46a92-c043-4667-8c20-358319e5c313}</UniqueIdentifier>
</Filter>
<Filter Include="Node">
<UniqueIdentifier>{51864c81-02ee-4043-bf09-9ce3cbe5b6da}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\Tool">
<UniqueIdentifier>{42d46a92-c043-4667-8c20-358319e5c313}</UniqueIdentifier>
<Filter Include="Base">
<UniqueIdentifier>{261633d3-3814-40c7-bd6d-201ede6c6ade}</UniqueIdentifier>
</Filter>
<Filter Include="Tool\Listener">
<UniqueIdentifier>{bdc55351-669e-4ee5-ba0b-ee0e4b628fea}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Win\winbase.cpp">
<Filter>源文件\Win</Filter>
<Filter>Win</Filter>
</ClCompile>
<ClCompile Include="Base\EObject.cpp">
<Filter>源文件\Base</Filter>
<Filter>Base</Filter>
</ClCompile>
<ClCompile Include="Base\EApp.cpp">
<Filter>源文件\Base</Filter>
<Filter>Base</Filter>
</ClCompile>
<ClCompile Include="Node\ENode.cpp">
<Filter>源文件\Node</Filter>
<Filter>Node</Filter>
</ClCompile>
<ClCompile Include="Tool\EObjectManager.cpp">
<Filter>源文件\Tool</Filter>
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="Base\EScene.cpp">
<Filter>源文件\Base</Filter>
<Filter>Base</Filter>
</ClCompile>
<ClCompile Include="Tool\EMsgManager.cpp">
<Filter>Tool</Filter>
</ClCompile>
<ClCompile Include="Tool\EMouseListener.cpp">
<Filter>Tool\Listener</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="easy2d.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="ecommon.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="emacros.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Win\winbase.h">
<Filter>源文件\Win</Filter>
</ClInclude>
<ClInclude Include="ebase.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="enodes.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="etools.h">
<Filter>头文件</Filter>
<Filter>Win</Filter>
</ClInclude>
<ClInclude Include="etools.h" />
<ClInclude Include="enodes.h" />
<ClInclude Include="emacros.h" />
<ClInclude Include="ecommon.h" />
<ClInclude Include="ebase.h" />
<ClInclude Include="easy2d.h" />
</ItemGroup>
</Project>

View File

@ -1,321 +0,0 @@
/******************************************************
* EasyX Library for C++ (Ver:20170827(beta))
* http://www.easyx.cn
*
* EasyX.h
* VC
******************************************************/
#pragma once
#ifndef WINVER
#define WINVER 0x0400 // Specifies that the minimum required platform is Windows 95 and Windows NT 4.0.
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500 // Specifies that the minimum required platform is Windows 2000.
#endif
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410 // Specifies that the minimum required platform is Windows 98.
#endif
#ifndef __cplusplus
#error EasyX is only for C++
#endif
#include <windows.h>
#include <tchar.h>
// 绘图窗口初始化参数
#define SHOWCONSOLE 1 // 创建图形窗口时,保留控制台的显示
#define NOCLOSE 2 // 没有关闭功能
#define NOMINIMIZE 4 // 没有最小化功能
// 颜色
#define BLACK 0
#define BLUE 0xAA0000
#define GREEN 0x00AA00
#define CYAN 0xAAAA00
#define RED 0x0000AA
#define MAGENTA 0xAA00AA
#define BROWN 0x0055AA
#define LIGHTGRAY 0xAAAAAA
#define DARKGRAY 0x555555
#define LIGHTBLUE 0xFF5555
#define LIGHTGREEN 0x55FF55
#define LIGHTCYAN 0xFFFF55
#define LIGHTRED 0x5555FF
#define LIGHTMAGENTA 0xFF55FF
#define YELLOW 0x55FFFF
#define WHITE 0xFFFFFF
// 定义颜色转换宏
#define BGR(color) ( (((color) & 0xFF) << 16) | ((color) & 0xFF00FF00) | (((color) & 0xFF0000) >> 16) )
class IMAGE;
// 定义线的样式
class LINESTYLE
{
public:
LINESTYLE();
LINESTYLE(const LINESTYLE &style);
LINESTYLE& operator = (const LINESTYLE &style); // 赋值运算符重载函数
virtual ~LINESTYLE();
DWORD style;
DWORD thickness;
DWORD *puserstyle;
DWORD userstylecount;
};
class FILLSTYLE
{
public:
FILLSTYLE();
FILLSTYLE(const FILLSTYLE &style);
FILLSTYLE& operator = (const FILLSTYLE &style); // 赋值运算符重载函数
virtual ~FILLSTYLE();
int style; // 填充形式
long hatch; // 填充图案样式
IMAGE* ppattern; // 填充图像
};
// 定义图像对象
class IMAGE
{
public:
int getwidth() const; // 获取对象的宽度
int getheight() const; // 获取对象的高度
private:
int width, height; // 对象的宽高
HBITMAP m_hBmp;
HDC m_hMemDC;
int m_MemCurX; // 当前点X坐标
int m_MemCurY; // 当前点Y坐标
float m_data[6];
COLORREF m_LineColor; // 当前线条颜色
COLORREF m_FillColor; // 当前填充颜色
COLORREF m_TextColor; // 当前文字颜色
COLORREF m_BkColor; // 当前背景颜色
DWORD* m_pBuffer; // 绘图区的内存
LINESTYLE m_LineStyle; // 画线样式
FILLSTYLE m_FillStyle; // 填充样式
virtual void SetDefault(); // 设置为默认状态
public:
IMAGE(int _width = 0, int _height = 0); // 创建图像
IMAGE(const IMAGE &img); // 拷贝构造函数
IMAGE& operator = (const IMAGE &img); // 赋值运算符重载函数
virtual ~IMAGE();
virtual void Resize(int _width, int _height); // 调整尺寸
};
// 绘图模式相关函数
HWND initgraph(int width, int height, int flag = NULL); // 初始化图形环境
void closegraph(); // 关闭图形环境
// 绘图环境设置
void cleardevice(); // 清屏
void setcliprgn(HRGN hrgn); // 设置当前绘图设备的裁剪区
void clearcliprgn(); // 清除裁剪区的屏幕内容
void getlinestyle(LINESTYLE* pstyle); // 获取当前画线样式
void setlinestyle(const LINESTYLE* pstyle); // 设置当前画线样式
void setlinestyle(int style, int thickness = 1, const DWORD *puserstyle = NULL, DWORD userstylecount = 0); // 设置当前画线样式
void getfillstyle(FILLSTYLE* pstyle); // 获取当前填充样式
void setfillstyle(const FILLSTYLE* pstyle); // 设置当前填充样式
void setfillstyle(int style, long hatch = NULL, IMAGE* ppattern = NULL); // 设置当前填充样式
void setfillstyle(BYTE* ppattern8x8); // 设置当前填充样式
void setorigin(int x, int y); // 设置坐标原点
void getaspectratio(float *pxasp, float *pyasp); // 获取当前缩放因子
void setaspectratio(float xasp, float yasp); // 设置当前缩放因子
int getrop2(); // 获取前景的二元光栅操作模式
void setrop2(int mode); // 设置前景的二元光栅操作模式
int getpolyfillmode(); // 获取多边形填充模式
void setpolyfillmode(int mode); // 设置多边形填充模式
void graphdefaults(); // 重置所有绘图设置为默认值
COLORREF getlinecolor(); // 获取当前线条颜色
void setlinecolor(COLORREF color); // 设置当前线条颜色
COLORREF gettextcolor(); // 获取当前文字颜色
void settextcolor(COLORREF color); // 设置当前文字颜色
COLORREF getfillcolor(); // 获取当前填充颜色
void setfillcolor(COLORREF color); // 设置当前填充颜色
COLORREF getbkcolor(); // 获取当前绘图背景色
void setbkcolor(COLORREF color); // 设置当前绘图背景色
int getbkmode(); // 获取背景混合模式
void setbkmode(int mode); // 设置背景混合模式
// 颜色模型转换函数
COLORREF RGBtoGRAY(COLORREF rgb);
void RGBtoHSL(COLORREF rgb, float *H, float *S, float *L);
void RGBtoHSV(COLORREF rgb, float *H, float *S, float *V);
COLORREF HSLtoRGB(float H, float S, float L);
COLORREF HSVtoRGB(float H, float S, float V);
// 绘图函数
COLORREF getpixel(int x, int y); // 获取点的颜色
void putpixel(int x, int y, COLORREF color); // 画点
void moveto(int x, int y); // 移动当前点(绝对坐标)
void moverel(int dx, int dy); // 移动当前点(相对坐标)
void line(int x1, int y1, int x2, int y2); // 画线
void linerel(int dx, int dy); // 画线(至相对坐标)
void lineto(int x, int y); // 画线(至绝对坐标)
void rectangle (int left, int top, int right, int bottom); // 画矩形
void fillrectangle (int left, int top, int right, int bottom); // 画填充矩形(有边框)
void solidrectangle(int left, int top, int right, int bottom); // 画填充矩形(无边框)
void clearrectangle(int left, int top, int right, int bottom); // 清空矩形区域
void circle (int x, int y, int radius); // 画圆
void fillcircle (int x, int y, int radius); // 画填充圆(有边框)
void solidcircle(int x, int y, int radius); // 画填充圆(无边框)
void clearcircle(int x, int y, int radius); // 清空圆形区域
void ellipse (int left, int top, int right, int bottom); // 画椭圆
void fillellipse (int left, int top, int right, int bottom); // 画填充椭圆(有边框)
void solidellipse(int left, int top, int right, int bottom); // 画填充椭圆(无边框)
void clearellipse(int left, int top, int right, int bottom); // 清空椭圆形区域
void roundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // 画圆角矩形
void fillroundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // 画填充圆角矩形(有边框)
void solidroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // 画填充圆角矩形(无边框)
void clearroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight); // 清空圆角矩形区域
void arc (int left, int top, int right, int bottom, double stangle, double endangle); // 画椭圆弧(起始角度和终止角度为弧度制)
void pie (int left, int top, int right, int bottom, double stangle, double endangle); // 画椭圆扇形(起始角度和终止角度为弧度制)
void fillpie (int left, int top, int right, int bottom, double stangle, double endangle); // 画填充椭圆扇形(有边框)
void solidpie(int left, int top, int right, int bottom, double stangle, double endangle); // 画填充椭圆扇形(无边框)
void clearpie(int left, int top, int right, int bottom, double stangle, double endangle); // 清空椭圆扇形区域
void polyline (const POINT *points, int num); // 画多条连续的线
void polygon (const POINT *points, int num); // 画多边形
void fillpolygon (const POINT *points, int num); // 画填充的多边形(有边框)
void solidpolygon(const POINT *points, int num); // 画填充的多边形(无边框)
void clearpolygon(const POINT *points, int num); // 清空多边形区域
void floodfill(int x, int y, int border); // 填充区域
// 文字相关函数
void outtext(LPCTSTR str); // 在当前位置输出字符串
void outtext(TCHAR c); // 在当前位置输出字符
void outtextxy(int x, int y, LPCTSTR str); // 在指定位置输出字符串
void outtextxy(int x, int y, TCHAR c); // 在指定位置输出字符
int textwidth(LPCTSTR str); // 获取字符串占用的像素宽
int textwidth(TCHAR c); // 获取字符占用的像素宽
int textheight(LPCTSTR str); // 获取字符串占用的像素高
int textheight(TCHAR c); // 获取字符占用的像素高
int drawtext(LPCTSTR str, RECT* pRect, UINT uFormat); // 在指定区域内以指定格式输出字符串
int drawtext(TCHAR c, RECT* pRect, UINT uFormat); // 在指定区域内以指定格式输出字符
// 设置当前字体样式(详见帮助)
// nHeight: 字符的平均高度;
// nWidth: 字符的平均宽度(0 表示自适应)
// lpszFace: 字体名称;
// nEscapement: 字符串的书写角度(单位 0.1 度)
// nOrientation: 每个字符的书写角度(单位 0.1 度)
// nWeight: 字符的笔画粗细(0 表示默认粗细)
// bItalic: 是否斜体;
// bUnderline: 是否下划线;
// bStrikeOut: 是否删除线;
// fbCharSet: 指定字符集;
// fbOutPrecision: 指定文字的输出精度;
// fbClipPrecision: 指定文字的剪辑精度;
// fbQuality: 指定文字的输出质量;
// fbPitchAndFamily: 指定以常规方式描述字体的字体系列。
void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace);
void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut);
void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace, int nEscapement, int nOrientation, int nWeight, bool bItalic, bool bUnderline, bool bStrikeOut, BYTE fbCharSet, BYTE fbOutPrecision, BYTE fbClipPrecision, BYTE fbQuality, BYTE fbPitchAndFamily);
void settextstyle(const LOGFONT *font); // 设置当前字体样式
void gettextstyle(LOGFONT *font); // 获取当前字体样式
// 图像处理函数
void loadimage(IMAGE *pDstImg, LPCTSTR pImgFile, int nWidth = 0, int nHeight = 0, bool bResize = false); // 从图片文件获取图像(bmp/jpg/gif/emf/wmf)
void loadimage(IMAGE *pDstImg, LPCTSTR pResType, LPCTSTR pResName, int nWidth = 0, int nHeight = 0, bool bResize = false); // 从资源文件获取图像(bmp/jpg/gif/emf/wmf)
void saveimage(LPCTSTR pImgFile, IMAGE* pImg = NULL); // 保存图像
void getimage(IMAGE *pDstImg, int srcX, int srcY, int srcWidth, int srcHeight); // 从当前绘图设备获取图像
void putimage(int dstX, int dstY, const IMAGE *pSrcImg, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕
void putimage(int dstX, int dstY, int dstWidth, int dstHeight, const IMAGE *pSrcImg, int srcX, int srcY, DWORD dwRop = SRCCOPY); // 绘制图像到屏幕(指定宽高)
void rotateimage(IMAGE *dstimg, IMAGE *srcimg, double radian, COLORREF bkcolor = BLACK, bool autosize = false, bool highquality = true);// 旋转图像
void Resize(IMAGE* pImg, int width, int height); // 调整绘图设备的大小
DWORD* GetImageBuffer(IMAGE* pImg = NULL); // 获取绘图设备的显存指针
IMAGE* GetWorkingImage(); // 获取当前绘图设备
void SetWorkingImage(IMAGE* pImg = NULL); // 设置当前绘图设备
HDC GetImageHDC(IMAGE* pImg = NULL); // 获取绘图设备句柄(HDC)
// 其它函数
int getwidth(); // 获取绘图区宽度
int getheight(); // 获取绘图区高度
int getx(); // 获取当前 x 坐标
int gety(); // 获取当前 y 坐标
void BeginBatchDraw(); // 开始批量绘制
void FlushBatchDraw(); // 执行未完成的绘制任务
void FlushBatchDraw(int left, int top, int right, int bottom); // 执行指定区域内未完成的绘制任务
void EndBatchDraw(); // 结束批量绘制,并执行未完成的绘制任务
void EndBatchDraw(int left, int top, int right, int bottom); // 结束批量绘制,并执行指定区域内未完成的绘制任务
HWND GetHWnd(); // 获取绘图窗口句柄(HWND)
TCHAR* GetEasyXVer(); // 获取 EasyX 当前版本
// 获取用户输入
bool InputBox(LPTSTR pString, int nMaxCount, LPCTSTR pPrompt = NULL, LPCTSTR pTitle = NULL, LPCTSTR pDefault = NULL, int width = 0, int height = 0, bool bOnlyOK = true);
// 鼠标消息
// 支持如下消息:
// WM_MOUSEMOVE 鼠标移动
// WM_MOUSEWHEEL 鼠标滚轮拨动
// WM_LBUTTONDOWN 左键按下
// WM_LBUTTONUP 左键弹起
// WM_LBUTTONDBLCLK 左键双击
// WM_MBUTTONDOWN 中键按下
// WM_MBUTTONUP 中键弹起
// WM_MBUTTONDBLCLK 中键双击
// WM_RBUTTONDOWN 右键按下
// WM_RBUTTONUP 右键弹起
// WM_RBUTTONDBLCLK 右键双击
struct MOUSEMSG
{
UINT uMsg; // 当前鼠标消息
bool mkCtrl; // Ctrl 键是否按下
bool mkShift; // Shift 键是否按下
bool mkLButton; // 鼠标左键是否按下
bool mkMButton; // 鼠标中键是否按下
bool mkRButton; // 鼠标右键是否按下
short x; // 当前鼠标 x 坐标
short y; // 当前鼠标 y 坐标
short wheel; // 鼠标滚轮滚动值 (120 的倍数)
};
bool MouseHit(); // 检查是否存在鼠标消息
MOUSEMSG GetMouseMsg(); // 获取一个鼠标消息。如果没有,就等待
void FlushMouseMsgBuffer(); // 清空鼠标消息缓冲区

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,314 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
#include <conio.h>
// 按键监听回调函数的容器
static std::vector<KeyMsg*> s_vListeners;
// 虚拟键值的定义
const VK_KEY KeyMsg::A = 'A';
const VK_KEY KeyMsg::B = 'B';
const VK_KEY KeyMsg::C = 'C';
const VK_KEY KeyMsg::D = 'D';
const VK_KEY KeyMsg::E = 'E';
const VK_KEY KeyMsg::F = 'F';
const VK_KEY KeyMsg::G = 'G';
const VK_KEY KeyMsg::H = 'H';
const VK_KEY KeyMsg::I = 'I';
const VK_KEY KeyMsg::J = 'J';
const VK_KEY KeyMsg::K = 'K';
const VK_KEY KeyMsg::L = 'L';
const VK_KEY KeyMsg::M = 'M';
const VK_KEY KeyMsg::N = 'N';
const VK_KEY KeyMsg::O = 'O';
const VK_KEY KeyMsg::P = 'P';
const VK_KEY KeyMsg::Q = 'Q';
const VK_KEY KeyMsg::R = 'R';
const VK_KEY KeyMsg::S = 'S';
const VK_KEY KeyMsg::T = 'T';
const VK_KEY KeyMsg::U = 'U';
const VK_KEY KeyMsg::V = 'V';
const VK_KEY KeyMsg::W = 'W';
const VK_KEY KeyMsg::X = 'X';
const VK_KEY KeyMsg::Y = 'Y';
const VK_KEY KeyMsg::Z = 'Z';
const VK_KEY KeyMsg::NUM_0 = '0';
const VK_KEY KeyMsg::NUM_1 = '1';
const VK_KEY KeyMsg::NUM_2 = '2';
const VK_KEY KeyMsg::NUM_3 = '3';
const VK_KEY KeyMsg::NUM_4 = '4';
const VK_KEY KeyMsg::NUM_5 = '5';
const VK_KEY KeyMsg::NUM_6 = '6';
const VK_KEY KeyMsg::NUM_7 = '7';
const VK_KEY KeyMsg::NUM_8 = '8';
const VK_KEY KeyMsg::NUM_9 = '9';
const VK_KEY KeyMsg::NUMPAD_0 = VK_NUMPAD0;
const VK_KEY KeyMsg::NUMPAD_1 = VK_NUMPAD1;
const VK_KEY KeyMsg::NUMPAD_2 = VK_NUMPAD2;
const VK_KEY KeyMsg::NUMPAD_3 = VK_NUMPAD3;
const VK_KEY KeyMsg::NUMPAD_4 = VK_NUMPAD4;
const VK_KEY KeyMsg::NUMPAD_5 = VK_NUMPAD5;
const VK_KEY KeyMsg::NUMPAD_6 = VK_NUMPAD6;
const VK_KEY KeyMsg::NUMPAD_7 = VK_NUMPAD7;
const VK_KEY KeyMsg::NUMPAD_8 = VK_NUMPAD8;
const VK_KEY KeyMsg::NUMPAD_9 = VK_NUMPAD9;
const VK_KEY KeyMsg::Enter = VK_RETURN;
const VK_KEY KeyMsg::Space = VK_SPACE;
const VK_KEY KeyMsg::Ctrl = VK_CONTROL;
const VK_KEY KeyMsg::LCtrl = VK_LCONTROL;
const VK_KEY KeyMsg::RCtrl = VK_RCONTROL;
const VK_KEY KeyMsg::Shift = VK_SHIFT;
const VK_KEY KeyMsg::LShift = VK_LSHIFT;
const VK_KEY KeyMsg::RShift = VK_RSHIFT;
const VK_KEY KeyMsg::Up = VK_UP;
const VK_KEY KeyMsg::Down = VK_DOWN;
const VK_KEY KeyMsg::Left = VK_LEFT;
const VK_KEY KeyMsg::Right = VK_RIGHT;
const VK_KEY KeyMsg::Esc = VK_ESCAPE;
const VK_KEY KeyMsg::F1 = VK_F1;
const VK_KEY KeyMsg::F2 = VK_F2;
const VK_KEY KeyMsg::F3 = VK_F3;
const VK_KEY KeyMsg::F4 = VK_F4;
const VK_KEY KeyMsg::F5 = VK_F5;
const VK_KEY KeyMsg::F6 = VK_F6;
const VK_KEY KeyMsg::F7 = VK_F7;
const VK_KEY KeyMsg::F8 = VK_F8;
const VK_KEY KeyMsg::F9 = VK_F9;
const VK_KEY KeyMsg::F10 = VK_F10;
const VK_KEY KeyMsg::F11 = VK_F11;
const VK_KEY KeyMsg::F12 = VK_F12;
static VK_KEY convert(int ascii);
KeyMsg::KeyMsg(TString name, const KEY_CALLBACK & callback) :
m_sName(name),
m_callback(callback),
m_pParentScene(nullptr),
m_bRunning(true),
m_bWaiting(false)
{
}
KeyMsg::~KeyMsg()
{
}
void KeyMsg::onKbHit(VK_KEY key)
{
m_callback(key);
}
void KeyMsg::start()
{
m_bRunning = true;
}
void KeyMsg::stop()
{
m_bRunning = false;
}
void KeyMsg::wait()
{
m_bWaiting = true;
}
void KeyMsg::notify()
{
m_bWaiting = false;
}
void KeyMsg::__exec()
{
if (_kbhit()) // 检测有无按键消息
{
VK_KEY key = convert(_getch()); // 获取键盘消息
for (auto l : s_vListeners) // 分发该消息
{
if (!l->m_bWaiting && l->m_bRunning)
{
l->onKbHit(key); // 执行按键回调函数
}
}
}
}
void KeyMsg::addListener(TString name, const KEY_CALLBACK & callback)
{
// 创建新的监听对象
auto listener = new KeyMsg(name, callback);
// 绑定在场景上
listener->m_pParentScene = EApp::getLoadingScene();
// 添加新的按键回调函数
s_vListeners.push_back(listener);
}
void KeyMsg::startListener(TString name)
{
// 查找名称相同的监听器
for (auto l : s_vListeners)
{
if (l->m_sName == name && l->m_pParentScene == EApp::getCurrentScene())
{
l->start();
}
}
}
void KeyMsg::stopListener(TString name)
{
// 查找名称相同的监听器
for (auto l : s_vListeners)
{
if (l->m_sName == name && l->m_pParentScene == EApp::getCurrentScene())
{
l->stop();
}
}
}
void KeyMsg::delListener(TString name)
{
// 创建迭代器
std::vector<KeyMsg*>::iterator iter;
// 循环遍历所有监听器
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
// 查找相同名称的监听器
if ((*iter)->m_sName == name && (*iter)->m_pParentScene == EApp::getCurrentScene())
{
// 删除该定时器
delete (*iter);
iter = s_vListeners.erase(iter);
}
else
{
iter++;
}
}
}
void KeyMsg::notifyAllSceneListeners(EScene * scene)
{
for (auto l : s_vListeners)
{
if (l->m_pParentScene == scene)
{
l->notify();
}
}
}
void KeyMsg::waitAllSceneListeners(EScene * scene)
{
for (auto l : s_vListeners)
{
if (l->m_pParentScene == scene)
{
l->wait();
}
}
}
void KeyMsg::clearAllSceneListeners(EScene * scene)
{
// 创建迭代器
std::vector<KeyMsg*>::iterator iter;
// 循环遍历所有监听器
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
// 查找相同名称的监听器
if ((*iter)->m_pParentScene == scene)
{
// 删除该定时器
delete (*iter);
iter = s_vListeners.erase(iter);
}
else
{
iter++;
}
}
}
void KeyMsg::clearAllListeners()
{
// 删除所有监听器
for (auto l : s_vListeners)
{
delete l;
}
// 清空容器
s_vListeners.clear();
}
bool KeyMsg::isKeyDown(VK_KEY key)
{
// 获取 key 的按下情况
return (GetAsyncKeyState(key) & 0x8000);
}
VK_KEY convert(int ascii)
{
// 字母键
if (ascii >= 'a' && ascii <= 'z')
{
return VK_KEY(ascii - ('a' - 'A'));
}
else if (ascii >= 'A' && ascii <= 'Z')
{
return VK_KEY(ascii);
}
// 数字键
else if (ascii >= '0' && ascii <= '9')
{
return VK_KEY(ascii);
}
// 回车、空格、Esc键
else if (ascii == 0x0D || ascii == 0x20 || ascii == 0x1B)
{
return VK_KEY(ascii);
}
// 功能键
else if (ascii == 0 || ascii == 0xE0)
{
switch (_getch())
{
case 72:
return KeyMsg::Up;
case 75:
return KeyMsg::Left;
case 77:
return KeyMsg::Right;
case 80:
return KeyMsg::Down;
case 59:
return KeyMsg::F1;
case 60:
return KeyMsg::F2;
case 61:
return KeyMsg::F3;
case 62:
return KeyMsg::F4;
case 63:
return KeyMsg::F5;
case 64:
return KeyMsg::F6;
case 65:
return KeyMsg::F7;
case 66:
return KeyMsg::F8;
case 67:
return KeyMsg::F9;
case 133:
return KeyMsg::F10;
case 134:
return KeyMsg::F11;
default:
return 0;
}
}
return 0;
}

View File

@ -1,223 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
// 鼠标监听回调函数的容器
static std::vector<MouseMsg*> s_vListeners;
// 鼠标消息
static MOUSEMSG s_mouseMsg;
void MouseMsg::__exec()
{
// 获取鼠标消息
while (MouseHit())
{
// 获取鼠标消息
s_mouseMsg = GetMouseMsg();
// 执行场景程序
EApp::get()->getCurrentScene()->_exec();
// 执行鼠标监听回调函数
for (auto l : s_vListeners) // 循环遍历所有的鼠标监听
{
if (!l->m_bWaiting && l->m_bRunning)
{
l->onMouseMsg(); // 执行回调函数
}
}
}
}
MouseMsg::MouseMsg() :
m_callback([]() {}),
m_pParentScene(nullptr),
m_bRunning(true),
m_bWaiting(false)
{
}
MouseMsg::MouseMsg(TString name, const MOUSE_CALLBACK & callback) :
m_sName(name),
m_callback(callback),
m_pParentScene(nullptr),
m_bRunning(true),
m_bWaiting(false)
{
}
MouseMsg::~MouseMsg()
{
}
void MouseMsg::onMouseMsg()
{
m_callback();
}
void MouseMsg::addListener(TString name, const MOUSE_CALLBACK & callback)
{
// 创建新的监听对象
auto listener = new MouseMsg(name, callback);
// 绑定在场景上
listener->m_pParentScene = EApp::getLoadingScene();
// 添加新的按键回调函数
s_vListeners.push_back(listener);
}
void MouseMsg::startListener(TString name)
{
// 查找名称相同的监听器
for (auto l : s_vListeners)
{
if (l->m_sName == name && l->m_pParentScene == EApp::getCurrentScene())
{
l->start();
}
}
}
void MouseMsg::stopListener(TString name)
{
// 查找名称相同的监听器
for (auto l : s_vListeners)
{
if (l->m_sName == name && l->m_pParentScene == EApp::getCurrentScene())
{
l->stop();
}
}
}
void MouseMsg::delListener(TString name)
{
// 创建迭代器
std::vector<MouseMsg*>::iterator iter;
// 循环遍历所有监听器
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
// 查找相同名称的监听器
if ((*iter)->m_sName == name && (*iter)->m_pParentScene == EApp::getCurrentScene())
{
// 删除该定时器
delete (*iter);
iter = s_vListeners.erase(iter);
}
else
{
iter++;
}
}
}
void MouseMsg::start()
{
m_bRunning = true;
}
void MouseMsg::stop()
{
m_bRunning = false;
}
void MouseMsg::wait()
{
m_bWaiting = true;
}
void MouseMsg::notify()
{
m_bWaiting = false;
}
void MouseMsg::clearAllListeners()
{
// 删除所有监听器
for (auto l : s_vListeners)
{
delete l;
}
// 清空容器
s_vListeners.clear();
}
void MouseMsg::notifyAllSceneListeners(EScene * scene)
{
for (auto l : s_vListeners)
{
if (l->m_pParentScene == scene)
{
l->notify();
}
}
}
void MouseMsg::waitAllSceneListeners(EScene * scene)
{
for (auto l : s_vListeners)
{
if (l->m_pParentScene == scene)
{
l->wait();
}
}
}
void MouseMsg::clearAllSceneListeners(EScene * scene)
{
// 创建迭代器
std::vector<MouseMsg*>::iterator iter;
// 循环遍历所有监听器
for (iter = s_vListeners.begin(); iter != s_vListeners.end();)
{
// 查找相同名称的监听器
if ((*iter)->m_pParentScene == scene)
{
// 删除该定时器
delete (*iter);
iter = s_vListeners.erase(iter);
}
else
{
iter++;
}
}
}
bool MouseMsg::isLButtonDown()
{
return s_mouseMsg.mkLButton;
}
bool MouseMsg::isRButtonDown()
{
return s_mouseMsg.mkRButton;
}
bool MouseMsg::isMButtonDown()
{
return s_mouseMsg.mkMButton;
}
int MouseMsg::getX()
{
return s_mouseMsg.x;
}
int MouseMsg::getY()
{
return s_mouseMsg.y;
}
CPoint MouseMsg::getPos()
{
return CPoint(s_mouseMsg.x, s_mouseMsg.y);
}
int MouseMsg::getWheel()
{
return s_mouseMsg.wheel;
}
MouseMsg::MESSAGE MouseMsg::getMsg()
{
return MESSAGE(s_mouseMsg.uMsg);
}

View File

@ -1,190 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
BatchNode::BatchNode()
{
}
BatchNode::~BatchNode()
{
clearAllChildren();
}
bool BatchNode::_exec(bool active)
{
// 批量节点是否显示
if (!m_bDisplay)
{
return false;
}
// 逆序遍历所有子节点
for (int i = int(m_vChildren.size() - 1); i >= 0; i--)
{
if (m_vChildren[i]->_exec(active))
{
active = false;
}
}
// 若子节点取得了画面焦点,则该节点也取得了焦点
return !active;
}
void BatchNode::_onDraw()
{
// 节点是否显示
if (!m_bDisplay)
{
return;
}
for (auto child : m_vChildren)
{
// 绘制子节点
child->_onDraw();
}
}
void BatchNode::add(Node * child, int z_Order)
{
if (child == nullptr) return;
// 设置节点的父场景
child->setParentScene(this->getParentScene());
// 设置节点在批量节点中的 z 轴顺序
child->setZOrder(z_Order);
// 对象的引用计数加一
child->retain();
// 修改子节点位置
child->move(getPos());
// 按 z 轴顺序插入节点
size_t size = m_vChildren.size();
for (unsigned i = 0; i <= size; i++)
{
if (i != size)
{
if (z_Order < m_vChildren.at(i)->getZOrder())
{
m_vChildren.insert(m_vChildren.begin() + i, child);
break;
}
}
else
{
m_vChildren.push_back(child);
break;
}
}
}
bool BatchNode::del(Node * child)
{
if (child == nullptr) return false;
// 寻找是否有相同节点
std::vector<Node*>::iterator iter;
for (iter = m_vChildren.begin(); iter != m_vChildren.end(); iter++)
{
// 找到相同节点
if ((*iter) == child)
{
// 对象的引用计数减一
(*iter)->release();
// 去掉该节点
m_vChildren.erase(iter);
return true;
}
}
return false;
}
int BatchNode::getCount()
{
return (int)m_vChildren.size();
}
std::vector<Node*>& BatchNode::getChildren()
{
return m_vChildren;
}
void BatchNode::clearAllChildren()
{
// 所有节点的引用计数减一
for (auto child : m_vChildren)
{
child->autoRelease();
child->release();
}
// 清空储存节点的容器
m_vChildren.clear();
}
void BatchNode::setX(int x)
{
// 计算相对移动位置
int var = x - getX();
// 移动所有子节点的位置
for (auto child : m_vChildren)
{
child->move(var, 0);
}
Node::setX(x);
}
void BatchNode::setY(int y)
{
// 计算相对移动位置
int var = y - getY();
// 移动所有子节点的位置
for (auto child : m_vChildren)
{
child->move(0, var);
}
Node::setY(y);
}
void BatchNode::setPos(int x, int y)
{
// 计算相对移动位置
CPoint var(x - getX(), y - getY());
// 移动所有子节点的位置
for (auto child : m_vChildren)
{
child->move(var);
}
Node::setPos(x, y);
}
void BatchNode::setPos(CPoint p)
{
// 计算相对移动位置
CPoint var(p - getPos());
// 移动所有子节点的位置
for (auto child : m_vChildren)
{
child->move(var);
}
Node::setPos(p);
}
void BatchNode::move(int x, int y)
{
// 移动所有子节点的位置
for (auto child : m_vChildren)
{
child->move(x, y);
}
Node::move(x, y);
}
void BatchNode::move(CVector v)
{
// 移动所有子节点的位置
for (auto child : m_vChildren)
{
child->move(v);
}
Node::move(v);
}

View File

@ -1,260 +0,0 @@
#include "..\easy2d.h"
BatchSprite::BatchSprite()
{
}
BatchSprite::~BatchSprite()
{
}
void BatchSprite::addSprite(Sprite * sprite, int z_Order)
{
if (sprite == nullptr) return;
// 设置节点的父场景
sprite->setParentScene(this->getParentScene());
// 设置节点在批量节点中的 z 轴顺序
sprite->setZOrder(z_Order);
// 对象的引用计数加一
sprite->retain();
// 按 z 轴顺序插入节点
size_t size = m_vSprites.size();
for (unsigned i = 0; i <= size; i++)
{
if (i != size)
{
if (z_Order < m_vSprites.at(i)->getZOrder())
{
m_vSprites.insert(m_vSprites.begin() + i, sprite);
break;
}
}
else
{
m_vSprites.push_back(sprite);
break;
}
}
}
bool BatchSprite::delSprite(Sprite * sprite)
{
if (sprite == nullptr) return false;
// 寻找是否有相同节点
std::vector<Sprite*>::iterator iter;
for (iter = m_vSprites.begin(); iter != m_vSprites.end(); iter++)
{
// 找到相同节点
if ((*iter) == sprite)
{
// 对象的引用计数减一
(*iter)->release();
// 去掉该节点
m_vSprites.erase(iter);
return true;
}
}
return false;
}
int BatchSprite::getCount()
{
return (int)m_vSprites.size();
}
std::vector<Sprite*>& BatchSprite::getChildren()
{
return m_vSprites;
}
void BatchSprite::clearAllSprites()
{
// 所有节点的引用计数减一
for (auto s : m_vSprites)
{
s->release();
}
// 清空储存节点的容器
m_vSprites.clear();
}
bool BatchSprite::_exec(bool active)
{
// 批量节点是否显示
if (!m_bDisplay)
{
return false;
}
// 逆序遍历所有子节点
for (int i = int(m_vSprites.size() - 1); i >= 0; i--)
{
if (m_vSprites[i]->_exec(active))
{
active = false;
}
}
// 若子节点取得了画面焦点,则该节点也取得了焦点
return !active;
}
void BatchSprite::_onDraw()
{
// 节点是否显示
if (!m_bDisplay)
{
return;
}
// 在相对位置绘制子节点
for (auto sprite : m_vSprites)
{
// 将子节点移动到相对位置
sprite->move(getX(), getY());
// 绘制子节点
sprite->_onDraw();
// 将子节点移回原位
sprite->move(-getX(), -getY());
}
}
Sprite * BatchSprite::isCollisionWith(Sprite * sprite)
{
for (int i = int(m_vSprites.size() - 1); i >= 0; i--)
{
if (m_vSprites[i]->isCollisionWith(sprite))
{
return m_vSprites[i];
}
}
return nullptr;
}
Sprite * BatchSprite::isPointIn(CPoint point)
{
for (int i = int(m_vSprites.size() - 1); i >= 0; i--)
{
if (m_vSprites[i]->isPointIn(point))
{
return m_vSprites[i];
}
}
return nullptr;
}
void BatchSprite::addAction(Action * action)
{
Sprite::addAction(action);
}
float BatchSprite::getScaleX() const
{
return m_fScaleX;
}
float BatchSprite::getScaleY() const
{
return m_fScaleY;
}
float BatchSprite::getOpacity() const
{
return m_nAlpha / 255.0f;
}
void BatchSprite::setScale(float scaleX, float scaleY)
{
m_fScaleX = scaleX;
m_fScaleY = scaleY;
for (auto s : m_vSprites)
{
s->setScale(scaleX, scaleY);
}
}
void BatchSprite::setOpacity(float opacity)
{
m_nAlpha = BYTE(min(max(opacity, 0), 1) * 255);
for (auto s : m_vSprites)
{
s->setOpacity(opacity);
}
}
void BatchSprite::setImage(Image * image)
{
for (auto s : m_vSprites)
{
s->setImage(image);
}
}
void BatchSprite::setX(int x)
{
// 计算相对移动位置
int var = x - getX();
// 移动所有子节点的位置
for (auto s : m_vSprites)
{
s->move(var, 0);
}
RectNode::setX(x);
}
void BatchSprite::setY(int y)
{
// 计算相对移动位置
int var = y - getY();
// 移动所有子节点的位置
for (auto s : m_vSprites)
{
s->move(0, var);
}
RectNode::setY(y);
}
void BatchSprite::setPos(int x, int y)
{
// 计算相对移动位置
CPoint var(x - getX(), y - getY());
// 移动所有子节点的位置
for (auto s : m_vSprites)
{
s->move(var);
}
RectNode::setPos(x, y);
}
void BatchSprite::setPos(CPoint p)
{
// 计算相对移动位置
CPoint var(p - getPos());
// 移动所有子节点的位置
for (auto s : m_vSprites)
{
s->move(var);
}
RectNode::setPos(p);
}
void BatchSprite::move(int x, int y)
{
// 移动所有子节点的位置
for (auto s : m_vSprites)
{
s->move(x, y);
}
RectNode::move(x, y);
}
void BatchSprite::move(CVector v)
{
// 移动所有子节点的位置
for (auto s : m_vSprites)
{
s->move(v);
}
RectNode::move(v);
}

View File

@ -1,80 +0,0 @@
#include "..\..\easy2d.h"
#include "..\..\EasyX\easyx.h"
Button::Button() :
m_bEnable(true)
{
}
Button::~Button()
{
}
bool Button::_exec(bool active)
{
// 按钮是否启用
if (!m_bEnable)
{
return false;
}
return MouseNode::_exec(active);
}
void Button::_onDraw()
{
// 按钮是否启用
if (!m_bEnable)
{
// 未启用时,绘制 Disable 状态
_onDisable();
return;
}
MouseNode::_onDraw();
}
bool Button::isEnable()
{
return m_bEnable;
}
void Button::setEnable(bool enable)
{
m_bEnable = enable;
}
void Button::setX(int x)
{
MouseNode::setX(x);
_resetPosition();
}
void Button::setY(int y)
{
MouseNode::setY(y);
_resetPosition();
}
void Button::setPos(int x, int y)
{
MouseNode::setPos(x, y);
_resetPosition();
}
void Button::setPos(CPoint p)
{
MouseNode::setPos(p);
_resetPosition();
}
void Button::move(int x, int y)
{
MouseNode::move(x, y);
_resetPosition();
}
void Button::move(CVector v)
{
MouseNode::move(v);
_resetPosition();
}

View File

@ -1,172 +0,0 @@
#include "..\..\easy2d.h"
ImageButton::ImageButton() :
m_pNormalImage(nullptr),
m_pMouseInImage(nullptr),
m_pSelectedImage(nullptr),
m_pUnableImage(nullptr)
{
}
ImageButton::ImageButton(LPCTSTR image) :
ImageButton()
{
setNormal(new Image(image)); // 设置按钮在正常状态时的图片
}
ImageButton::ImageButton(Image * image) :
ImageButton()
{
setNormal(image); // 设置按钮在正常状态时的图片
}
ImageButton::~ImageButton()
{
// 所有图片的引用计数减一
SafeRelease(m_pNormalImage);
SafeRelease(m_pMouseInImage);
SafeRelease(m_pSelectedImage);
SafeRelease(m_pUnableImage);
}
void ImageButton::_setStatus(Status status)
{
if (m_eStatus != status)
{
if (status == MOUSEIN)
{
if (m_pMouseInImage) setRect(m_pMouseInImage->getRect());
}
else if (status == SELECTED)
{
if (m_pSelectedImage) setRect(m_pSelectedImage->getRect());
}
else
{
setRect(m_pNormalImage->getRect());
}
}
MouseNode::_setStatus(status);
}
void ImageButton::_onNormal()
{
if (m_pNormalImage)
{
m_pNormalImage->_onDraw();
}
}
void ImageButton::_onMouseIn()
{
if (m_pMouseInImage)
{
m_pMouseInImage->_onDraw();
}
else
{
_onNormal();
}
}
void ImageButton::_onSelected()
{
if (m_pSelectedImage)
{
m_pSelectedImage->_onDraw();
}
else
{
_onNormal();
}
}
void ImageButton::_onDisable()
{
if (m_pUnableImage)
{
m_pUnableImage->_onDraw();
}
else
{
_onNormal();
}
}
void ImageButton::setNormal(Image * image)
{
if (image)
{
// 原图片引用计数减一
SafeRelease(m_pNormalImage);
// 修改图片
m_pNormalImage = image;
// 现图片引用计数加一
m_pNormalImage->retain();
// 根据图片宽高设定按钮大小
setSize(m_pNormalImage->getSize());
// 重新计算图片位置
_resetPosition();
}
}
void ImageButton::setMouseIn(Image * image)
{
if (image)
{
SafeRelease(m_pMouseInImage);
m_pMouseInImage = image;
m_pMouseInImage->retain();
_resetPosition();
}
}
void ImageButton::setSelected(Image * image)
{
if (image)
{
SafeRelease(m_pSelectedImage);
m_pSelectedImage = image;
m_pSelectedImage->retain();
_resetPosition();
}
}
void ImageButton::setUnable(Image * image)
{
if (image)
{
SafeRelease(m_pUnableImage);
m_pUnableImage = image;
m_pUnableImage->retain();
_resetPosition();
}
}
void ImageButton::_resetPosition()
{
if (m_pNormalImage)
{
// 根据按钮位置和图片宽高设置图片位置居中显示
m_pNormalImage->setPos(getX(), getY());
}
if (m_pMouseInImage)
{
m_pMouseInImage->setPos(
getX() + (getWidth() - m_pMouseInImage->getWidth()) / 2,
getY() + (getHeight() - m_pMouseInImage->getHeight()) / 2);
}
if (m_pSelectedImage)
{
m_pSelectedImage->setPos(
getX() + (getWidth() - m_pSelectedImage->getWidth()) / 2,
getY() + (getHeight() - m_pSelectedImage->getHeight()) / 2);
}
if (m_pUnableImage)
{
m_pUnableImage->setPos(
getX() + (getWidth() - m_pUnableImage->getWidth()) / 2,
getY() + (getHeight() - m_pUnableImage->getHeight()) / 2);
}
}

View File

@ -1,172 +0,0 @@
#include "..\..\easy2d.h"
TextButton::TextButton() :
m_pNormalText(nullptr),
m_pMouseInText(nullptr),
m_pSelectedText(nullptr),
m_pUnableText(nullptr)
{
}
TextButton::TextButton(TString text) :
TextButton()
{
setNormal(new Text(text)); // 设置按钮在正常状态时的文字
}
TextButton::TextButton(Text * text) :
TextButton()
{
setNormal(text); // 设置按钮在正常状态时的文字
}
TextButton::~TextButton()
{
// 所有文本的引用计数减一
SafeRelease(m_pNormalText);
SafeRelease(m_pMouseInText);
SafeRelease(m_pSelectedText);
SafeRelease(m_pUnableText);
}
void TextButton::_setStatus(Status status)
{
if (m_eStatus != status)
{
if (status == MOUSEIN)
{
if (m_pMouseInText) setRect(m_pMouseInText->getRect());
}
else if (status == SELECTED)
{
if (m_pSelectedText) setRect(m_pSelectedText->getRect());
}
else
{
setRect(m_pNormalText->getRect());
}
}
MouseNode::_setStatus(status);
}
void TextButton::_onNormal()
{
if (m_pNormalText)
{
m_pNormalText->_onDraw();
}
}
void TextButton::_onMouseIn()
{
if (m_pMouseInText)
{
m_pMouseInText->_onDraw();
}
else
{
_onNormal();
}
}
void TextButton::_onSelected()
{
if (m_pSelectedText)
{
m_pSelectedText->_onDraw();
}
else
{
_onNormal();
}
}
void TextButton::_onDisable()
{
if (m_pUnableText)
{
m_pUnableText->_onDraw();
}
else
{
_onNormal();
}
}
void TextButton::setNormal(Text * text)
{
if (text)
{
// 原文本引用计数减一
SafeRelease(m_pNormalText);
// 修改文本
m_pNormalText = text;
// 现文本引用计数加一
m_pNormalText->retain();
// 根据文字宽高设定按钮大小
setSize(m_pNormalText->getSize());
// 重新计算文本位置
_resetPosition();
}
}
void TextButton::setMouseIn(Text * text)
{
if (text)
{
SafeRelease(m_pMouseInText);
m_pMouseInText = text;
m_pMouseInText->retain();
_resetPosition();
}
}
void TextButton::setSelected(Text * text)
{
if (text)
{
SafeRelease(m_pSelectedText);
m_pSelectedText = text;
m_pSelectedText->retain();
_resetPosition();
}
}
void TextButton::setUnable(Text * text)
{
if (text)
{
SafeRelease(m_pUnableText);
m_pUnableText = text;
m_pUnableText->retain();
_resetPosition();
}
}
void TextButton::_resetPosition()
{
if (m_pNormalText)
{
// 根据按钮位置和文字宽高设置文字位置居中显示
m_pNormalText->setPos(getX() , getY());
}
if (m_pMouseInText)
{
m_pMouseInText->setPos(
getX() + (getWidth() - m_pMouseInText->getWidth()) / 2,
getY() + (getHeight() - m_pMouseInText->getHeight()) / 2);
}
if (m_pSelectedText)
{
m_pSelectedText->setPos(
getX() + (getWidth() - m_pSelectedText->getWidth()) / 2,
getY() + (getHeight() - m_pSelectedText->getHeight()) / 2);
}
if (m_pUnableText)
{
m_pUnableText->setPos(
getX() + (getWidth() - m_pUnableText->getWidth()) / 2,
getY() + (getHeight() - m_pUnableText->getHeight()) / 2);
}
}

View File

@ -1,4 +1,5 @@
#include "..\enodes.h"
#include "..\Win\winbase.h"
e2d::ENode::ENode()
: m_nZOrder(0)
@ -27,8 +28,20 @@ bool e2d::ENode::_exec(bool active)
return false;
}
void e2d::ENode::_onDraw()
void e2d::ENode::_onRender()
{
D2D1_RECT_F rectangle = D2D1::RectF(
m_Rect.left,
m_Rect.top,
m_Rect.right,
m_Rect.bottom
);
ID2D1SolidColorBrush* m_pLightSlateGrayBrush;
GetRenderTarget()->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::LightSlateGray),
&m_pLightSlateGrayBrush
);
GetRenderTarget()->FillRectangle(&rectangle, m_pLightSlateGrayBrush);
}
int e2d::ENode::getX() const

View File

@ -1,251 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
#include <map>
using namespace std;
// 图片缓存
static map<TString, CImage*> s_mCImages;
// 从图片缓存中读取图片
static CImage* GetCImage(TString name, bool fromRes = false);
// 对 PNG 图像进行像素转换
static void CrossImage(CImage &img);
Image::Image() :
m_pCImage(nullptr),
m_nAlpha(255),
m_fScaleX(1),
m_fScaleY(1)
{
}
Image::Image(LPCTSTR ImageFile) :
Image()
{
setImage(ImageFile); // 设置图片资源
}
Image::Image(LPCTSTR ImageFile, int x, int y, int width, int height) :
Image()
{
setImage(ImageFile, x, y, width, height); // 设置图片资源和裁剪大小
}
Image::~Image()
{
}
void Image::_onDraw()
{
// display 属性为 false或未设置图片资源时不绘制该图片
if (!m_bDisplay || !m_pCImage)
{
return;
}
// 绘制图片
if (m_pCImage->GetBPP() == 32)
{
m_pCImage->AlphaBlend(GetImageHDC(), m_Rect, m_SrcRect, m_nAlpha, AC_SRC_OVER);
}
else
{
m_pCImage->Draw(GetImageHDC(), m_Rect, m_SrcRect);
}
}
float Image::getScaleX() const
{
return m_fScaleX;
}
float Image::getScaleY() const
{
return m_fScaleY;
}
float Image::getOpacity() const
{
return m_nAlpha / 255.0f;
}
bool Image::setImage(LPCTSTR ImageFile)
{
m_pCImage = GetCImage(ImageFile);
if (m_pCImage)
{
reset();
return true;
}
return false;
}
bool Image::setImage(LPCTSTR ImageFile, int x, int y, int width, int height)
{
if (!setImage(ImageFile))
{
return false;
}
// 裁剪图片大小
crop(x, y, width, height);
return true;
}
bool Image::setImageFromRes(LPCTSTR pResName)
{
m_pCImage = GetCImage(pResName, true);
if (m_pCImage)
{
reset();
return true;
}
return false;
}
bool Image::setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height)
{
if (!setImageFromRes(pResName))
{
return false;
}
// 裁剪图片大小
crop(x, y, width, height);
return true;
}
void Image::crop(int x, int y, int width, int height)
{
width = min(max(width, 0), m_pCImage->GetWidth() - x);
height = min(max(height, 0), m_pCImage->GetHeight() - y);
// 设置源矩形的位置和大小(用于裁剪)
m_SrcRect.SetRect(x, y, x + width, y + height);
// 设置目标矩形(即绘制到窗口的位置和大小)
setSize(int(width * m_fScaleX), int(height * m_fScaleY));
}
void Image::stretch(int width, int height)
{
// 设置目标矩形的位置和大小(即绘制到窗口的位置和大小,用于拉伸图片)
setSize(max(width, 0), max(height, 0));
// 重置比例缩放属性
m_fScaleX = 1;
m_fScaleY = 1;
}
void Image::setScale(float scaleX, float scaleY)
{
m_fScaleX = max(scaleX, 0);
m_fScaleY = max(scaleY, 0);
setSize(int(m_SrcRect.Width() * scaleX), int(m_SrcRect.Height() * scaleY));
}
void Image::setOpacity(float value)
{
if (m_pCImage->GetBPP() == 32)
{
m_nAlpha = BYTE(min(max(value, 0), 1) * 255);
}
}
void Image::setTransparentColor(COLORREF value)
{
// 设置透明色
m_pCImage->SetTransparentColor(value);
}
void Image::reset()
{
// 设置目标矩形(即绘制到窗口的位置和大小)
setSize(m_pCImage->GetWidth(), m_pCImage->GetHeight());
// 设置源矩形(即截取图片的大小)
m_SrcRect.SetRect(0, 0, m_pCImage->GetWidth(), m_pCImage->GetHeight());
// 重置缩放属性
m_fScaleX = 1;
m_fScaleY = 1;
// 重置透明度
m_nAlpha = 255;
}
bool Image::preload(LPCTSTR fileName, bool fromRes)
{
// 判断图片是否已经加载
if (s_mCImages.find(fileName) != s_mCImages.end())
{
return true;
}
// 加载图片
CImage* cImage = nullptr;
if (fromRes)
{
cImage = new CImage();
// 从资源加载图片(不支持 PNG
cImage->LoadFromResource(GetModuleHandle(NULL), fileName);
}
else
{
//判断图片路径是否存在
if (!PathFileExists(fileName))
{
return false;
}
cImage = new CImage();
cImage->Load(fileName);
}
// 加载失败
if (!cImage || cImage->IsNull())
{
return false;
}
// 确认该图像包含 Alpha 通道
if (cImage->GetBPP() == 32)
{
// 透明图片处理
CrossImage(*cImage);
}
s_mCImages.insert(map<TString, CImage*>::value_type(fileName, cImage));
return true;
}
void Image::saveScreenshot()
{
TString savePath;
// 获取保存位置
if (FileUtils::getSaveFilePath(savePath, _T("截图保存到"), _T("jpg")))
{
// 保存窗口截图
IMAGE image;
getimage(&image, 0, 0, EApp::getWidth(), EApp::getHeight());
saveimage(savePath.c_str(), &image);
}
}
// 对 PNG 图像进行像素转换
void CrossImage(CImage &img)
{
// 进行像素转换
for (int i = 0; i < img.GetWidth(); i++)
{
for (int j = 0; j < img.GetHeight(); j++)
{
UCHAR *cr = (UCHAR*)img.GetPixelAddress(i, j);
cr[0] = cr[0] * cr[3] / 255;
cr[1] = cr[1] * cr[3] / 255;
cr[2] = cr[2] * cr[3] / 255;
}
}
}
CImage* GetCImage(TString name, bool fromRes)
{
if (Image::preload(name.c_str()))
{
return s_mCImages.at(name);
}
else
{
return nullptr;
}
}

View File

@ -1,27 +0,0 @@
#include "..\easy2d.h"
Layer::Layer() :
m_bBlock(true)
{
}
Layer::~Layer()
{
}
int Layer::getBlock() const
{
return m_bBlock;
}
void Layer::setBlock(bool block)
{
m_bBlock = block;
}
bool Layer::_exec(bool active)
{
// 若图层阻塞消息,则永远取得画面焦点
return BatchNode::_exec(active) || m_bBlock;
}

View File

@ -1,174 +0,0 @@
#include "..\easy2d.h"
MouseNode::MouseNode() :
m_bBlock(true),
m_bTarget(false),
m_ClickCallback([]() {}),
m_OnMouseInCallback([]() {}),
m_OnMouseOutCallback([]() {}),
m_OnSelectCallback([]() {}),
m_OnUnselectCallback([]() {})
{
}
MouseNode::~MouseNode()
{
}
bool MouseNode::_exec(bool active)
{
// 若 display 属性为 false退出函数
if (!m_bDisplay)
{
return false;
}
// 若画面已取得焦点,重置按钮属性并退出
if (!active)
{
reset();
return false;
}
// 判断节点当前的状态
// 若节点未取得焦点,则重新判断节点状态
if (!m_bTarget)
{
// 若鼠标位置在节点所在的矩形区域中
if (_isMouseIn())
{
// 状态设为 MOUSEIN
_setStatus(MOUSEIN);
// 若此时按下鼠标左键
if (MouseMsg::getMsg() == MouseMsg::LBUTTON_DOWN)
{
m_bTarget = true; // 取得焦点标记
_setStatus(SELECTED); // 状态设为 SELECTED
}
// 若节点阻塞鼠标消息,则取得画面焦点
if (m_bBlock) return true;
}
else
{
reset(); // 恢复默认状态
}
}
else
{
// 节点取得焦点时鼠标左键抬起
if (MouseMsg::getMsg() == MouseMsg::LBUTTON_UP)
{
// 若左键抬起时鼠标仍在节点内
if (_isMouseIn())
{
m_ClickCallback(); // 执行回调函数
}
reset(); // 恢复默认状态
}
// 若节点阻塞鼠标消息,则取得画面焦点
if (m_bBlock) return true;
}
return false;
}
void MouseNode::_onDraw()
{
// 节点是否显示
if (!m_bDisplay)
{
return;
}
// 节点是否被选中
if (m_eStatus == SELECTED)
{
_onSelected();
}
else
{
// 鼠标是否在节点上
if (m_eStatus == MOUSEIN)
{
_onMouseIn();
}
else
{
_onNormal();
}
}
}
bool MouseNode::_isMouseIn()
{
return isPointIn(MouseMsg::getPos());
}
void MouseNode::_setStatus(Status status)
{
if (m_eStatus != status)
{
// 退出某个状态的回调函数
if (m_eStatus == MOUSEIN)
{
m_OnMouseOutCallback();
}
else if (m_eStatus == SELECTED)
{
m_OnUnselectCallback();
}
// 进入某个状态的回调函数
if (status == MOUSEIN)
{
m_OnMouseInCallback();
}
else if (status == SELECTED)
{
m_OnSelectCallback();
}
m_eStatus = status;
}
}
bool MouseNode::isMouseIn()
{
return m_eStatus == MOUSEIN || m_eStatus == SELECTED;
}
bool MouseNode::isSelected()
{
return m_eStatus == SELECTED;
}
void MouseNode::setClickedCallback(const CLICK_CALLBACK & callback)
{
m_ClickCallback = callback;
}
void MouseNode::setMouseInCallback(const CLICK_CALLBACK & callback)
{
m_OnMouseInCallback = callback;
}
void MouseNode::setMouseOutCallback(const CLICK_CALLBACK & callback)
{
m_OnMouseOutCallback = callback;
}
void MouseNode::setSelectCallback(const CLICK_CALLBACK & callback)
{
m_OnSelectCallback = callback;
}
void MouseNode::setUnselectCallback(const CLICK_CALLBACK & callback)
{
m_OnUnselectCallback = callback;
}
void MouseNode::reset()
{
m_bTarget = false; // 失去焦点标记
_setStatus(NORMAL); // 恢复默认状态
}
void MouseNode::setBlock(bool block)
{
m_bBlock = block;
}

View File

@ -1,139 +0,0 @@
#include "..\easy2d.h"
RectNode::RectNode() :
m_Rect(0, 0, 0, 0)
{
}
RectNode::~RectNode()
{
}
bool RectNode::isCollisionWith(RectNode * rectNode) const
{
static CRect rt;
return IntersectRect(&rt, &m_Rect, &rectNode->m_Rect);
}
bool RectNode::isPointIn(CPoint p) const
{
return m_Rect.PtInRect(p);
}
void RectNode::setWindowCenterX()
{
setX((EApp::getWidth() - getWidth()) / 2);
}
void RectNode::setWindowCenterY()
{
setY((EApp::getHeight() - getHeight()) / 2);
}
void RectNode::setWindowCenter()
{
setWindowCenterX();
setWindowCenterY();
}
int RectNode::getX() const
{
return m_Rect.left;
}
int RectNode::getY() const
{
return m_Rect.top;
}
CPoint RectNode::getPos() const
{
return m_Rect.TopLeft();
}
int RectNode::getWidth() const
{
return m_Rect.Width(); // 矩形宽度
}
int RectNode::getHeight() const
{
return m_Rect.Height(); // 矩形高度
}
CSize RectNode::getSize() const
{
return m_Rect.Size();
}
CRect RectNode::getRect() const
{
return m_Rect;
}
void RectNode::setX(int x)
{
m_Rect.MoveToX(x);
}
void RectNode::setY(int y)
{
m_Rect.MoveToY(y);
}
void RectNode::setPos(int x, int y)
{
m_Rect.MoveToXY(x, y); // 修改矩形位置
}
void RectNode::setPos(CPoint p)
{
m_Rect.MoveToXY(p); // 修改矩形位置
}
void RectNode::move(int x, int y)
{
m_Rect.OffsetRect(x, y); // 移动矩形
}
void RectNode::move(CVector v)
{
m_Rect.OffsetRect(v); // 移动矩形
}
void RectNode::setWidth(int width)
{
m_Rect.right = max(m_Rect.left + width, 0);
}
void RectNode::setHeight(int height)
{
m_Rect.bottom = max(m_Rect.top + height, 0);
}
void RectNode::setSize(int width, int height)
{
setWidth(width);
setHeight(height);
}
void RectNode::setSize(CSize size)
{
setSize(size.cx, size.cy);
}
void RectNode::setRect(int x1, int y1, int x2, int y2)
{
m_Rect.SetRect(x1, y1, x2, y2);
}
void RectNode::setRect(CPoint leftTop, CPoint rightBottom)
{
m_Rect.SetRect(leftTop, rightBottom);
}
void RectNode::setRect(CRect rect)
{
m_Rect.CopyRect(&rect);
}

View File

@ -1,43 +0,0 @@
#include "..\..\easy2d.h"
#include "..\..\EasyX\easyx.h"
Circle::Circle() :
m_nRadius(0)
{
}
Circle::Circle(int x, int y, int radius) :
m_nRadius(radius)
{
setPos(x, y);
}
Circle::~Circle()
{
}
void Circle::solidShape()
{
solidcircle(getX(), getY(), m_nRadius);
}
void Circle::fillShape()
{
fillcircle(getX(), getY(), m_nRadius);
}
void Circle::roundShape()
{
circle(getX(), getY(), m_nRadius);
}
int Circle::getRadius() const
{
return m_nRadius;
}
void Circle::setRadius(int r)
{
m_nRadius = r;
}

View File

@ -1,58 +0,0 @@
#include "..\..\easy2d.h"
#include "..\..\EasyX\easyx.h"
Rect::Rect()
{
}
Rect::Rect(int x, int y, int width, int height) :
m_Size(width, height)
{
setPos(x, y);
}
Rect::~Rect()
{
}
void Rect::solidShape()
{
solidrectangle(getX(), getY(), getX() + m_Size.cx, getY() + m_Size.cy);
}
void Rect::fillShape()
{
fillrectangle(getX(), getY(), getX() + m_Size.cx, getY() + m_Size.cy);
}
void Rect::roundShape()
{
rectangle(getX(), getY(), getX() + m_Size.cx, getY() + m_Size.cy);
}
int Rect::getWidth() const
{
return m_Size.cx;
}
int Rect::getHeight() const
{
return m_Size.cy;
}
void Rect::setWidth(int width)
{
m_Size.cx = width;
}
void Rect::setHeight(int height)
{
m_Size.cy = height;
}
void Rect::setSize(int width, int height)
{
m_Size.cx = width;
m_Size.cy = height;
}

View File

@ -1,64 +0,0 @@
#include "..\..\easy2d.h"
#include "..\..\EasyX\easyx.h"
Shape::Shape() :
lineColor(Color::black),
fillColor(Color::white),
m_eStyle(SOLID)
{
}
Shape::~Shape()
{
}
void Shape::_onDraw()
{
// 形状是否显示
if (!m_bDisplay)
{
return;
}
// 设置线条和填充颜色
setlinecolor(lineColor);
setfillcolor(fillColor);
// 根据形状的样式进行不同的绘制
if (m_eStyle == Shape::STYLE::ROUND)
{
roundShape();
}
else if (m_eStyle == Shape::STYLE::SOLID)
{
solidShape();
}
else if (m_eStyle == Shape::STYLE::FILL)
{
fillShape();
}
}
inline COLORREF Shape::getFillColor() const
{
return fillColor;
}
inline COLORREF Shape::getLineColor() const
{
return lineColor;
}
void Shape::setFillColor(COLORREF color)
{
fillColor = color;
}
void Shape::setLineColor(COLORREF color)
{
lineColor = color;
}
void Shape::setStyle(STYLE style)
{
m_eStyle = style;
}

View File

@ -1,147 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
Sprite::Sprite() :
m_nAlpha(255),
m_fScaleX(1),
m_fScaleY(1),
m_pImage(nullptr)
{
}
Sprite::Sprite(Image * image) :
Sprite()
{
setImage(image);
}
Sprite::Sprite(LPCTSTR imageFileName) :
Sprite()
{
setImage(new Image(imageFileName));
}
Sprite::~Sprite()
{
SafeRelease(m_pImage);
}
bool Sprite::_exec(bool active)
{
return false;
}
void Sprite::_onDraw()
{
// display 属性为 false或未设置图片资源时不绘制该图片
if (!m_bDisplay || !m_pImage || !m_pImage->m_pCImage)
{
return;
}
// 绘制图片
if (m_pImage->m_pCImage->GetBPP() == 32)
{
m_pImage->m_pCImage->AlphaBlend(GetImageHDC(), getRect(), m_pImage->m_SrcRect, m_nAlpha, AC_SRC_OVER);
}
else
{
m_pImage->m_pCImage->Draw(GetImageHDC(), getRect(), m_pImage->m_SrcRect);
}
}
void Sprite::setImage(Image * image)
{
SafeRelease(m_pImage);
m_pImage = image;
setSize(int(m_pImage->getWidth() * m_fScaleX), int(m_pImage->getHeight() * m_fScaleY));
m_pImage->retain();
}
bool Sprite::isCollisionWith(Sprite * sprite)
{
static CRect rt;
return IntersectRect(&rt, &getRect(), &sprite->getRect());
}
void Sprite::addAction(Action * action)
{
if (action)
{
// 将动作与 Sprite 绑定
action->m_pTargetSprite = this;
// 将动作加入动作管理器,管理器会处理这个动作
ActionManager::addAction(action);
}
}
void Sprite::runAction(Action * action)
{
addAction(action);
}
void Sprite::resumeAction(Action * action)
{
if (action->getTarget() == this)
{
ActionManager::resumeAction(action);
}
}
void Sprite::pauseAction(Action * action)
{
if (action->getTarget() == this)
{
ActionManager::pauseAction(action);
}
}
void Sprite::stopAction(Action * action)
{
if (action->getTarget() == this)
{
ActionManager::stopAction(action);
}
}
void Sprite::pauseAllActions()
{
ActionManager::pauseSpriteAllActions(this);
}
void Sprite::resumeAllActions()
{
ActionManager::resumeSpriteAllActions(this);
}
void Sprite::stopAllActions()
{
ActionManager::stopSpriteAllActions(this);
}
float Sprite::getScaleX() const
{
return m_fScaleX;
}
float Sprite::getScaleY() const
{
return m_fScaleY;
}
float Sprite::getOpacity() const
{
return m_nAlpha / 255.0f;
}
void Sprite::setScale(float scaleX, float scaleY)
{
m_fScaleX = max(scaleX, 0);
m_fScaleY = max(scaleY, 0);
setSize(int(m_pImage->getWidth() * scaleX), int(m_pImage->getHeight() * scaleY));
}
void Sprite::setOpacity(float opacity)
{
m_nAlpha = BYTE(min(max(opacity, 0), 1) * 255);
}

View File

@ -1,91 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
Text::Text() :
m_sText(_T("")),
m_color(Color::white),
m_pFontStyle(FontStyle::getDefault())
{
m_pFontStyle->retain(); // 字体引用计数加一
}
Text::Text(TString text, COLORREF color, FontStyle * font) :
m_color(color),
m_pFontStyle(font)
{
setText(text);
m_pFontStyle->retain(); // 字体引用计数加一
}
Text::Text(int x, int y, TString text, COLORREF color, FontStyle * font) :
m_color(color),
m_pFontStyle(font)
{
setText(text);
setPos(x, y);
m_pFontStyle->retain(); // 字体引用计数加一
}
Text::~Text()
{
SafeRelease(m_pFontStyle); // 字体引用计数减一
}
void Text::_onDraw()
{
// 若 display 属性为 false不绘制这个文本
if (!m_bDisplay)
{
return;
}
// 设置字体
settextstyle(&m_pFontStyle->m_font);
// 设置文本颜色
settextcolor(m_color);
// 输出文字
outtextxy(getX(), getY(), m_sText.c_str());
}
COLORREF Text::getColor() const
{
return m_color;
}
TString Text::getText() const
{
return m_sText;
}
FontStyle * Text::getFontStyle()
{
return m_pFontStyle;
}
bool Text::isEmpty() const
{
return m_sText.empty(); // 文本是否为空
}
void Text::setText(TString text)
{
m_sText = text;
// 先设置字体,然后获取该文本在该字体下的宽度和高度
settextstyle(&m_pFontStyle->m_font);
setSize(textwidth(getText().c_str()), textheight(getText().c_str()));
}
void Text::setColor(COLORREF color)
{
m_color = color;
}
void Text::setFontStyle(FontStyle * style)
{
SafeRelease(m_pFontStyle); // 原字体引用计数减一
m_pFontStyle = style; // 修改字体
m_pFontStyle->retain(); // 现字体引用计数加一
// 先设置字体,然后获取该文本在该字体下的宽度和高度
settextstyle(&m_pFontStyle->m_font);
setSize(textwidth(getText().c_str()), textheight(getText().c_str()));
}

View File

@ -1,56 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
// 常用颜色值的定义
const COLORREF Color::black = BLACK;
const COLORREF Color::blue = BLUE;
const COLORREF Color::green = GREEN;
const COLORREF Color::cyan = CYAN;
const COLORREF Color::red = RED;
const COLORREF Color::magenta = MAGENTA;
const COLORREF Color::brown = BROWN;
const COLORREF Color::lightgray = LIGHTGRAY;
const COLORREF Color::darkgray = DARKGRAY;
const COLORREF Color::lightblue = LIGHTBLUE;
const COLORREF Color::lightgreen = LIGHTGREEN;
const COLORREF Color::lightcyan = LIGHTCYAN;
const COLORREF Color::lightred = LIGHTRED;
const COLORREF Color::lightmagenta = LIGHTMAGENTA;
const COLORREF Color::yellow = YELLOW;
const COLORREF Color::white = WHITE;
COLORREF Color::getFromRGB(BYTE r, BYTE g, BYTE b)
{
return RGB(r, g, b); // 从 (r, g, b) 三色值转化为颜色
}
COLORREF Color::getFromHSL(float H, float S, float L)
{
return HSLtoRGB(H, S, L);
}
COLORREF Color::getFromHSV(float H, float S, float V)
{
return HSVtoRGB(H, S, V);
}
BYTE Color::getRValue(COLORREF color)
{
return GetRValue(color); // 返回颜色中的红色值
}
BYTE Color::getGValue(COLORREF color)
{
return GetGValue(color); // 返回颜色中的绿色值
}
BYTE Color::getBValue(COLORREF color)
{
return GetBValue(color); // 返回颜色中的蓝色值
}
COLORREF Color::getGray(COLORREF color)
{
return RGBtoGRAY(color); // 获取颜色中的灰度值
}

View File

@ -1 +0,0 @@
/* FillStyle 是 EasyX 中的类,目前尚未考虑实现 */

View File

@ -1,103 +0,0 @@
#include "..\easy2d.h"
// ³£ÓÃ×ÖÌå´ÖϸֵµÄ¶¨Òå
const LONG FontWeight::dontcare = 0;
const LONG FontWeight::thin = 100;
const LONG FontWeight::extraLight = 200;
const LONG FontWeight::light = 300;
const LONG FontWeight::normal = 400;
const LONG FontWeight::regular = 400;
const LONG FontWeight::medium = 500;
const LONG FontWeight::demiBlod = 600;
const LONG FontWeight::blod = 700;
const LONG FontWeight::extraBold = 800;
const LONG FontWeight::black = 900;
const LONG FontWeight::heavy = 900;
FontStyle::FontStyle()
{
setFontFamily(_T(""));
m_font.lfWeight = 18;
m_font.lfHeight = 0;
m_font.lfWidth = 0;
m_font.lfItalic = 0;
m_font.lfUnderline = 0;
m_font.lfStrikeOut = 0;
m_font.lfEscapement = 0;
m_font.lfOrientation = 0;
setQuality(true);
}
FontStyle::FontStyle(LPCTSTR fontfamily, LONG height, LONG weight, LONG width, bool italic, bool underline, bool strikeout, LONG escapement, LONG orientation, bool quality)
{
setFontFamily(fontfamily);
m_font.lfWeight = weight;
m_font.lfHeight = height;
m_font.lfWidth = width;
m_font.lfItalic = italic;
m_font.lfUnderline = underline;
m_font.lfStrikeOut = strikeout;
m_font.lfEscapement = escapement;
m_font.lfOrientation = orientation;
setQuality(quality);
}
FontStyle::~FontStyle()
{
}
FontStyle * FontStyle::getDefault()
{
return new FontStyle(_T(""), 18, FontWeight::normal);
}
void FontStyle::setHeight(LONG value)
{
m_font.lfHeight = value;
}
void FontStyle::setWidth(LONG value)
{
m_font.lfWidth = value;
}
void FontStyle::setFontFamily(LPCTSTR value)
{
_tcscpy_s(m_font.lfFaceName, 32, value);
}
void FontStyle::setEscapement(LONG value)
{
m_font.lfEscapement = value;
}
void FontStyle::setOrientation(LONG value)
{
m_font.lfOrientation = value;
}
void FontStyle::setQuality(bool value)
{
m_font.lfQuality = value ? ANTIALIASED_QUALITY : DEFAULT_QUALITY;
}
void FontStyle::setWeight(LONG value)
{
m_font.lfWeight = value;
}
void FontStyle::setItalic(bool value)
{
m_font.lfItalic = value;
}
void FontStyle::setUnderline(bool value)
{
m_font.lfUnderline = value;
}
void FontStyle::setStrikeOut(bool value)
{
m_font.lfStrikeOut = value;
}

View File

@ -1 +0,0 @@
/* LineStyle 是 EasyX 中的类,目前尚未考虑实现 */

View File

@ -1,200 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
#include <assert.h>
static std::vector<Action*> s_vActions;
void ActionManager::__exec()
{
// 临时指针
static Action * action;
// 循环遍历所有正在运行的动作
for (size_t i = 0; i < s_vActions.size(); i++)
{
action = s_vActions[i];
// 获取动作运行状态
if (action->isRunning())
{
if (action->isEnding())
{
// 动作已经结束
action->autoRelease();
action->release();
s_vActions.erase(s_vActions.begin() + i);
}
else
{
// 初始化动作
if (!action->m_bInit)
{
action->_init();
}
// 执行动作
action->_exec(GetNow());
}
}
}
}
void ActionManager::addAction(Action * action)
{
if (action)
{
#ifdef _DEBUG
for (auto a : s_vActions)
{
assert(a != action);
}
#endif
action->m_pParentScene = EApp::getLoadingScene();
s_vActions.push_back(action);
}
}
void ActionManager::notifyAllSceneActions(EScene * scene)
{
for (auto action : s_vActions)
{
if (action->m_pParentScene == scene)
{
action->notify();
}
}
}
void ActionManager::waitAllSceneActions(EScene * scene)
{
for (auto action : s_vActions)
{
if (action->m_pParentScene == scene)
{
action->wait();
}
}
}
void ActionManager::stopAllSceneActions(EScene * scene)
{
for (auto action : s_vActions)
{
if (action->m_pParentScene == scene)
{
action->stop();
}
}
}
void ActionManager::startAction(Action * action)
{
resumeAction(action);
}
void ActionManager::resumeAction(Action * action)
{
for (auto act : s_vActions)
{
if (act == action)
{
act->resume();
}
}
}
void ActionManager::pauseAction(Action * action)
{
for (auto act : s_vActions)
{
if (act == action)
{
act->pause();
}
}
}
void ActionManager::stopAction(Action * action)
{
for (auto act : s_vActions)
{
if (act == action)
{
act->stop();
}
}
}
void ActionManager::startSpriteAllActions(Sprite * sprite)
{
resumeSpriteAllActions(sprite);
}
void ActionManager::resumeSpriteAllActions(Sprite * sprite)
{
for (auto action : s_vActions)
{
if (action->m_pTargetSprite == sprite)
{
action->resume();
}
}
}
void ActionManager::pauseSpriteAllActions(Sprite * sprite)
{
for (auto action : s_vActions)
{
if (action->m_pTargetSprite == sprite)
{
action->pause();
}
}
}
void ActionManager::stopSpriteAllActions(Sprite * sprite)
{
for (auto action : s_vActions)
{
if (action->m_pTargetSprite == sprite)
{
action->stop();
}
}
}
void ActionManager::startAllActions()
{
resumeAllActions();
}
void ActionManager::resumeAllActions()
{
for (auto action : s_vActions)
{
action->resume();
}
}
void ActionManager::pauseAllActions()
{
for (auto action : s_vActions)
{
action->pause();
}
}
void ActionManager::stopAllActions()
{
for (auto action : s_vActions)
{
action->stop();
}
}
void ActionManager::clearAllActions()
{
for (auto action : s_vActions)
{
action->autoRelease();
action->release();
}
s_vActions.clear();
}

View File

@ -0,0 +1 @@
#include "..\etools.h"

View File

@ -0,0 +1,86 @@
#include "..\etools.h"
#include "..\Win\winbase.h"
#include <vector>
static POINT p;
static e2d::EMouseMsg mouseMsg;
std::vector<e2d::EMouseListener*> m_vMouseListeners;
void e2d::EMsgManager::setMouseMsg(UINT message)
{
mouseMsg.m_nMsg = message;
switch (message)
{
case WM_LBUTTONUP:
mouseMsg.m_bLButtonDown = false;
break;
case WM_LBUTTONDOWN:
mouseMsg.m_bLButtonDown = true;
break;
case WM_LBUTTONDBLCLK:
mouseMsg.m_bLButtonDown = true;
break;
case WM_MBUTTONUP:
mouseMsg.m_bMButtonDown = false;
break;
case WM_MBUTTONDOWN:
mouseMsg.m_bMButtonDown = true;
break;
case WM_MBUTTONDBLCLK:
mouseMsg.m_bMButtonDown = true;
break;
case WM_RBUTTONUP:
mouseMsg.m_bRButtonDown = false;
break;
case WM_RBUTTONDOWN:
mouseMsg.m_bRButtonDown = true;
break;
case WM_RBUTTONDBLCLK:
mouseMsg.m_bRButtonDown = true;
break;
case WM_MOUSEMOVE:
{
GetCursorPos(&p);
ScreenToClient(GetHWnd(), &p);
mouseMsg.m_Pos = p;
break;
}
case WM_MOUSEWHEEL:
break;
}
for (auto mlistener : m_vMouseListeners)
{
//mlistener->
}
}
e2d::EMouseMsg::MESSAGE e2d::EMsgManager::getMouseMsg()
{
return e2d::EMouseMsg::MESSAGE(mouseMsg.m_nMsg);
}
void e2d::EMsgManager::addListener(e2d::EMouseListener * listener)
{
if (listener)
{
listener->retain();
m_vMouseListeners.push_back(listener);
}
}
void e2d::EMsgManager::__exec()
{
}

View File

@ -1,168 +0,0 @@
#include "..\easy2d.h"
#include "..\EasyX\easyx.h"
#include <Shlobj.h>
#pragma comment(lib, "shell32.lib")
#include <sstream>
#include <algorithm>
#ifndef UNICODE
#include <io.h>
#include <direct.h>
#endif
TString FileUtils::getLocalAppDataPath()
{
TCHAR m_lpszDefaultDir[MAX_PATH] = { 0 };
TCHAR szDocument[MAX_PATH] = { 0 };
// 获取 AppData\Local 文件夹的 ID
LPITEMIDLIST pidl = NULL;
SHGetSpecialFolderLocation(NULL, CSIDL_LOCAL_APPDATA, &pidl);
if (pidl && SHGetPathFromIDList(pidl, szDocument))
{
// 获取文件夹路径
GetShortPathName(szDocument, m_lpszDefaultDir, _MAX_PATH);
}
return m_lpszDefaultDir;
}
TString FileUtils::getDefaultSavePath()
{
TCHAR m_lpszDefaultDir[MAX_PATH] = { 0 };
TCHAR szDocument[MAX_PATH] = { 0 };
// 获取 AppData\Local 文件夹的 ID
LPITEMIDLIST pidl = NULL;
SHGetSpecialFolderLocation(NULL, CSIDL_LOCAL_APPDATA, &pidl);
if (pidl && SHGetPathFromIDList(pidl, szDocument))
{
// 获取文件夹路径
GetShortPathName(szDocument, m_lpszDefaultDir, _MAX_PATH);
}
TString path = m_lpszDefaultDir;
path.append(_T("\\"));
path.append(EApp::getAppName());
#ifdef UNICODE
if (_waccess(path.c_str(), 0) == -1)
{
_wmkdir(path.c_str());
}
#else
if (_access(path.c_str(), 0) == -1)
{
_mkdir(path.c_str());
}
#endif
path.append(_T("\\DefaultData.ini"));
return path;
}
void FileUtils::saveInt(LPCTSTR key, int value)
{
#ifdef UNICODE
std::wstringstream ss;
#else
std::stringstream ss;
#endif
ss << value;
::WritePrivateProfileString(_T("Default"), key, ss.str().c_str(), getDefaultSavePath().c_str());
}
void FileUtils::saveDouble(LPCTSTR key, double value)
{
#ifdef UNICODE
std::wstringstream ss;
#else
std::stringstream ss;
#endif
ss << value;
::WritePrivateProfileString(_T("Default"), key, ss.str().c_str(), getDefaultSavePath().c_str());
}
void FileUtils::saveString(LPCTSTR key, TString value)
{
::WritePrivateProfileString(_T("Default"), key, value.c_str(), getDefaultSavePath().c_str());
}
int FileUtils::getInt(LPCTSTR key, int default)
{
return ::GetPrivateProfileInt(_T("Default"), key, default, getDefaultSavePath().c_str());
}
#include <iostream>
using namespace std;
double FileUtils::getDouble(LPCTSTR key, double default)
{
// 将 default 参数转化为字符串
#ifdef UNICODE
std::wstringstream ss;
#else
std::stringstream ss;
#endif
ss << default;
// 读取数据
TCHAR temp[128] = { 0 };
::GetPrivateProfileString(_T("Default"), key, ss.str().c_str(), temp, 128, getDefaultSavePath().c_str());
// 转换为字符串流
ss.str(_T(""));
ss << temp;
// 将字符串转化为 double
#ifdef UNICODE
double d = _wtof(ss.str().c_str());
#else
double d = atof(ss.str().c_str());
#endif
return d;
}
TString FileUtils::geTString(LPCTSTR key, TString default)
{
TCHAR temp[128] = { 0 };
::GetPrivateProfileString(_T("Default"), key, default.c_str(), temp, 128, getDefaultSavePath().c_str());
return TString(temp);
}
TString FileUtils::getFileExtension(const TString & filePath)
{
TString fileExtension;
// 找到文件名中的最后一个 '.' 的位置
size_t pos = filePath.find_last_of('.');
// 判断 pos 是否是个有效位置
if (pos != TString::npos)
{
// 截取扩展名
fileExtension = filePath.substr(pos, filePath.length());
// 转换为小写字母
std::transform(fileExtension.begin(), fileExtension.end(), fileExtension.begin(), ::tolower);
}
return fileExtension;
}
bool FileUtils::getSaveFilePath(TString& path, LPCTSTR title, LPCTSTR defExt)
{
// 弹出保存对话框
OPENFILENAME ofn = { 0 };
TCHAR strFilename[MAX_PATH] = { 0 }; // 用于接收文件名
ofn.lStructSize = sizeof(OPENFILENAME); // 结构体大小
ofn.hwndOwner = GetHWnd(); // 拥有着窗口句柄NULL 表示对话框是非模态的
ofn.lpstrFilter = _T("所有文件\0*.*\0\0"); // 设置过滤
ofn.nFilterIndex = 1; // 过滤器索引
ofn.lpstrFile = strFilename; // 接收返回的文件路径和文件名
ofn.nMaxFile = sizeof(strFilename); // 缓冲区长度
ofn.lpstrInitialDir = NULL; // 初始目录为默认
ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;// 目录必须存在,覆盖文件前发出警告
ofn.lpstrTitle = title; // 使用系统默认标题留空即可
ofn.lpstrDefExt = defExt; // 默认追加的扩展名
if (GetSaveFileName(&ofn))
{
path = strFilename;
return true;
}
return false;
}

View File

@ -1,9 +0,0 @@
#include "..\easy2d.h"
std::default_random_engine &Math::getEngine()
{
static std::random_device device;
static std::default_random_engine engine(device());
return engine;
}

View File

@ -1,417 +0,0 @@
#include "..\easy2d.h"
#include <mmsystem.h>
#pragma comment(lib , "winmm.lib")
#include <Digitalv.h>
#include <map>
////////////////////////////////////////////////////////////////////
// MciPlayer
////////////////////////////////////////////////////////////////////
class MciPlayer
{
public:
MciPlayer();
~MciPlayer();
void close();
void open(TString pFileName, UINT uId);
void play(bool bLoop = false);
void pause();
void resume();
void stop();
void rewind();
void setVolume(float volume);
bool isPlaying();
UINT getSoundID();
private:
void _sendCommand(int nCommand, DWORD_PTR param1 = 0, DWORD_PTR parma2 = 0);
MCIDEVICEID m_dev;
UINT m_nSoundID;
bool m_bPlaying;
bool m_bLoop;
TString m_sExt;
};
MciPlayer::MciPlayer() :
m_dev(0L),
m_nSoundID(0),
m_bPlaying(false),
m_bLoop(false),
m_sExt(_T(""))
{
}
MciPlayer::~MciPlayer()
{
close(); // 关闭播放器
}
void MciPlayer::open(TString pFileName, UINT uId)
{
// 忽略不存在的文件
if (pFileName.empty() || !PathFileExists(pFileName.c_str())) return;
// 获取文件后缀名
m_sExt = FileUtils::getFileExtension(pFileName);
// 停止当前音乐
close();
// 设置 MCI_OPEN_PARMS 参数
MCI_OPEN_PARMS mciOpen = { 0 };
mciOpen.lpstrDeviceType = (LPCTSTR)-1; // device ID for "all devices"
mciOpen.lpstrElementName = pFileName.c_str();
// 打开这个文件
MCIERROR mciError;
mciError = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, reinterpret_cast<DWORD_PTR>(&mciOpen));
// 出现错误时,忽略这次操作
if (mciError) return;
// 保存设备等信息
m_dev = mciOpen.wDeviceID;
m_nSoundID = uId;
m_bPlaying = false;
}
void MciPlayer::play(bool bLoop)
{
// 设备为空时,忽略这次操作
if (!m_dev)
{
return;
}
// 设置播放参数
MCI_PLAY_PARMS mciPlay = { 0 };
MCIERROR s_mciError;
// 播放声音
s_mciError = mciSendCommand(m_dev, MCI_PLAY, MCI_FROM | (bLoop ? MCI_DGV_PLAY_REPEAT : 0), reinterpret_cast<DWORD_PTR>(&mciPlay));
// 未出错时,置 m_bPlaying 为 true
if (!s_mciError)
{
m_bPlaying = true;
m_bLoop = bLoop;
}
}
void MciPlayer::close()
{
// 停止音乐
if (m_bPlaying)
{
stop();
}
// 关闭设备
if (m_dev)
{
_sendCommand(MCI_CLOSE);
}
// 恢复默认属性
m_dev = 0;
m_bPlaying = false;
}
void MciPlayer::pause()
{
// 暂停音乐
_sendCommand(MCI_PAUSE);
m_bPlaying = false;
}
void MciPlayer::resume()
{
// 继续音乐
if (m_sExt == _T(".mid"))
{
// midi 不支持 MCI_RESUME 参数,应使用 MCI_FROM 设置播放起始位置
// 获取 MCI 状态
MCI_STATUS_PARMS mciStatusParms;
mciStatusParms.dwItem = MCI_STATUS_POSITION;
_sendCommand(MCI_STATUS, MCI_STATUS_ITEM, reinterpret_cast<DWORD_PTR>(&mciStatusParms));
// 设置播放起始位置,并开始播放
MCI_PLAY_PARMS mciPlayParms;
mciPlayParms.dwFrom = (DWORD)mciStatusParms.dwReturn;
_sendCommand(MCI_PLAY, MCI_FROM, reinterpret_cast<DWORD_PTR>(&mciPlayParms));
}
else
{
// 继续播放音乐
_sendCommand(MCI_RESUME);
m_bPlaying = true;
}
}
void MciPlayer::stop()
{
// 停止音乐
_sendCommand(MCI_STOP);
m_bPlaying = false;
}
void MciPlayer::rewind()
{
// 设备为空时,忽略这次操作
if (!m_dev)
{
return;
}
// 重置播放位置
mciSendCommand(m_dev, MCI_SEEK, MCI_SEEK_TO_START, 0);
// 播放音乐
MCI_PLAY_PARMS mciPlay = { 0 };
m_bPlaying = mciSendCommand(m_dev, MCI_PLAY, (m_bLoop ? MCI_DGV_PLAY_REPEAT : 0), reinterpret_cast<DWORD_PTR>(&mciPlay)) ? false : true;
}
void MciPlayer::setVolume(float volume)
{
volume = min(max(volume, 0), 1);
MCI_DGV_SETAUDIO_PARMS mciSetAudioPara = { 0 };
mciSetAudioPara.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mciSetAudioPara.dwValue = DWORD(1000 * volume);
mciSendCommand(m_dev, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD_PTR)&mciSetAudioPara);
}
bool MciPlayer::isPlaying()
{
return m_bPlaying;
}
UINT MciPlayer::getSoundID()
{
return m_nSoundID;
}
void MciPlayer::_sendCommand(int nCommand, DWORD_PTR param1, DWORD_PTR parma2)
{
// 空设备时忽略这次操作
if (!m_dev)
{
return;
}
// 向当前设备发送操作
mciSendCommand(m_dev, nCommand, param1, parma2);
}
////////////////////////////////////////////////////////////////////
// MusicUtils
////////////////////////////////////////////////////////////////////
typedef std::map<unsigned int, MciPlayer *> MusicList;
typedef std::pair<unsigned int, MciPlayer *> Music;
static unsigned int _Hash(TString key);
static MusicList& getMciPlayerList()
{
static MusicList s_List;
return s_List;
}
static MciPlayer& getBgMciPlayer()
{
static MciPlayer s_Music;
return s_Music;
}
void MusicUtils::end()
{
// 停止背景音乐
getBgMciPlayer().close();
// 停止其他所有音乐
for (auto& iter : getMciPlayerList())
{
SafeDelete(iter.second);
}
// 清空音乐列表
getMciPlayerList().clear();
return;
}
void MusicUtils::setVolume(float volume)
{
// 设置背景音乐音量
getBgMciPlayer().setVolume(volume);
// 设置其他音乐音量
for (auto& iter : getMciPlayerList())
{
iter.second->setVolume(volume);
}
}
void MusicUtils::setVolume(TString pszFilePath, float volume)
{
unsigned int nRet = ::_Hash(pszFilePath);
MusicList::iterator p = getMciPlayerList().find(nRet);
if (p != getMciPlayerList().end())
{
p->second->setVolume(volume);
}
}
void MusicUtils::playBackgroundMusic(TString pszFilePath, bool bLoop)
{
if (pszFilePath.empty())
{
return;
}
getBgMciPlayer().open(pszFilePath, ::_Hash(pszFilePath));
getBgMciPlayer().play(bLoop);
}
void MusicUtils::stopBackgroundMusic(bool bReleaseData)
{
if (bReleaseData)
{
getBgMciPlayer().close();
}
else
{
getBgMciPlayer().stop();
}
}
void MusicUtils::pauseBackgroundMusic()
{
getBgMciPlayer().pause();
}
void MusicUtils::resumeBackgroundMusic()
{
getBgMciPlayer().resume();
}
void MusicUtils::rewindBackgroundMusic()
{
getBgMciPlayer().rewind();
}
bool MusicUtils::isBackgroundMusicPlaying()
{
return getBgMciPlayer().isPlaying();
}
void MusicUtils::setBackgroundMusicVolume(float volume)
{
getBgMciPlayer().setVolume(volume);
}
unsigned int MusicUtils::playMusic(TString pszFilePath, bool bLoop)
{
unsigned int nRet = ::_Hash(pszFilePath);
preloadMusic(pszFilePath);
MusicList::iterator p = getMciPlayerList().find(nRet);
if (p != getMciPlayerList().end())
{
p->second->play(bLoop);
}
return nRet;
}
void MusicUtils::stopMusic(unsigned int nSoundId)
{
MusicList::iterator p = getMciPlayerList().find(nSoundId);
if (p != getMciPlayerList().end())
{
p->second->stop();
}
}
void MusicUtils::preloadMusic(TString pszFilePath)
{
if (pszFilePath.empty()) return;
int nRet = ::_Hash(pszFilePath);
if (getMciPlayerList().end() != getMciPlayerList().find(nRet)) return;
getMciPlayerList().insert(Music(nRet, new MciPlayer()));
MciPlayer * pPlayer = getMciPlayerList()[nRet];
pPlayer->open(pszFilePath, nRet);
if (nRet == pPlayer->getSoundID()) return;
delete pPlayer;
getMciPlayerList().erase(nRet);
nRet = 0;
}
void MusicUtils::pauseMusic(unsigned int nSoundId)
{
MusicList::iterator p = getMciPlayerList().find(nSoundId);
if (p != getMciPlayerList().end())
{
p->second->pause();
}
}
void MusicUtils::pauseAllMusics()
{
for (auto& iter : getMciPlayerList())
{
iter.second->pause();
}
}
void MusicUtils::resumeMusic(unsigned int nSoundId)
{
MusicList::iterator p = getMciPlayerList().find(nSoundId);
if (p != getMciPlayerList().end())
{
p->second->resume();
}
}
void MusicUtils::resumeAllMusics()
{
for (auto& iter : getMciPlayerList())
{
iter.second->resume();
}
}
void MusicUtils::stopAllMusics()
{
for (auto& iter : getMciPlayerList())
{
iter.second->stop();
}
}
void MusicUtils::unloadMusic(LPCTSTR pszFilePath)
{
unsigned int nID = ::_Hash(pszFilePath);
MusicList::iterator p = getMciPlayerList().find(nID);
if (p != getMciPlayerList().end())
{
SafeDelete(p->second);
getMciPlayerList().erase(nID);
}
}
unsigned int _Hash(TString key)
{
unsigned int len = unsigned(key.size());
unsigned int hash = 0;
for (unsigned i = 0; i < len; i++)
{
hash *= 16777619;
hash ^= (unsigned int)(unsigned char)toupper(key[i]);
}
return (hash);
}

View File

@ -1,223 +0,0 @@
#include "..\easy2d.h"
#include "..\Win\winbase.h"
// 储存所有定时器的容器
static std::vector<Timer*> s_vTimers;
Timer::Timer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback) :
m_sName(name),
m_bRunning(false),
m_bWaiting(false),
m_callback(callback),
m_pParentScene(nullptr)
{
setInterval(milliSeconds); // 设置定时器的时间间隔
}
Timer::~Timer()
{
}
void Timer::start()
{
// 标志该定时器正在运行
m_bRunning = true;
// 记录当前时间
m_nLast = steady_clock::now();
}
void Timer::stop()
{
m_bRunning = false; // 标志该定时器已停止
}
void Timer::wait()
{
m_bWaiting = true;
}
void Timer::notify()
{
m_bWaiting = false;
}
bool Timer::isRunning()
{
return m_bRunning && !m_bWaiting; // 获取该定时器的运行状态
}
void Timer::setInterval(LONGLONG milliSeconds)
{
// 设置定时器的时间间隔
m_nAnimationInterval = milliSeconds;
}
void Timer::setCallback(const TIMER_CALLBACK & callback)
{
m_callback = callback; // 保存回调函数
}
void Timer::setName(TString name)
{
m_sName = name; // 修改定时器名称
}
LONGLONG Timer::getInterval() const
{
return m_nAnimationInterval;// 获取定时器的时间间隔
}
TString Timer::getName() const
{
return m_sName; // 获取定时器的名称
}
void Timer::__exec()
{
// 定时器容器为空
if (!s_vTimers.size())
{
return;
}
// 循环遍历所有的定时器
for (auto timer : s_vTimers)
{
// 若定时器未运行,跳过这个定时器
if (!timer->isRunning())
{
continue;
}
// 判断时间间隔是否足够
while (duration_cast<milliseconds>(GetNow() - timer->m_nLast).count() > timer->m_nAnimationInterval)
{
// 重新记录时间
timer->m_nLast += milliseconds(timer->m_nAnimationInterval);
// 运行回调函数
timer->m_callback();
}
}
}
void Timer::addTimer(Timer * timer)
{
// 启动定时器
timer->start();
// 绑定在场景上
timer->m_pParentScene = EApp::getLoadingScene();
// 将该定时器放入容器
s_vTimers.push_back(timer);
}
void Timer::addTimer(TString name, const TIMER_CALLBACK & callback)
{
addTimer(name, 20, callback);
}
void Timer::addTimer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback)
{
// 创建定时器
auto timer = new Timer(name, milliSeconds, callback);
// 添加定时器
addTimer(timer);
}
void Timer::startTimer(TString name)
{
// 查找名称相同的定时器
for (auto timer : s_vTimers)
{
if (timer->m_sName == name && timer->m_pParentScene == EApp::getCurrentScene())
{
// 启动定时器
timer->start();
}
}
}
void Timer::stopTimer(TString name)
{
// 查找名称相同的定时器
for (auto timer : s_vTimers)
{
if (timer->m_sName == name && timer->m_pParentScene == EApp::getCurrentScene())
{
// 停止定时器
timer->stop();
}
}
}
void Timer::delTimer(TString name)
{
// 创建迭代器
std::vector<Timer*>::iterator iter;
// 循环遍历所有定时器
for (iter = s_vTimers.begin(); iter != s_vTimers.end();)
{
// 查找相同名称的定时器
if ((*iter)->m_sName == name && (*iter)->m_pParentScene == EApp::getCurrentScene())
{
// 删除该定时器
delete (*iter);
iter = s_vTimers.erase(iter);
}
else
{
iter++;
}
}
}
void Timer::clearAllTimers()
{
// 删除所有定时器
for (auto t : s_vTimers)
{
delete t;
}
// 清空容器
s_vTimers.clear();
}
void Timer::notifyAllSceneTimers(EScene * scene)
{
for (auto t : s_vTimers)
{
if (t->m_pParentScene == scene)
{
t->notify();
}
}
}
void Timer::waitAllSceneTimers(EScene * scene)
{
for (auto t : s_vTimers)
{
if (t->m_pParentScene == scene)
{
t->wait();
}
}
}
void Timer::clearAllSceneTimers(EScene * scene)
{
// 创建迭代器
std::vector<Timer*>::iterator iter;
// 循环遍历所有定时器
for (iter = s_vTimers.begin(); iter != s_vTimers.end();)
{
// 查找相同名称的定时器
if ((*iter)->m_pParentScene == scene)
{
// 删除该定时器
delete (*iter);
iter = s_vTimers.erase(iter);
}
else
{
iter++;
}
}
}

View File

@ -1,24 +1,24 @@
#include "winbase.h"
#include "..\emacros.h"
HWND m_hwnd = nullptr;
ID2D1Factory * m_pDirect2dFactory = nullptr;
ID2D1HwndRenderTarget * m_pRenderTarget = nullptr;
HWND hwnd = nullptr;
ID2D1Factory * pDirect2dFactory = nullptr;
ID2D1HwndRenderTarget * pRenderTarget = nullptr;
HWND &GetHWnd()
{
return m_hwnd;
return hwnd;
}
ID2D1Factory * &GetFactory()
{
return m_pDirect2dFactory;
return pDirect2dFactory;
}
ID2D1HwndRenderTarget * &GetRenderTarget()
{
return m_pRenderTarget;
return pRenderTarget;
}
void WindowCenter(HWND hWnd)

View File

@ -1,4 +1,5 @@
#pragma once
#include "..\emacros.h"
#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>

View File

@ -16,45 +16,18 @@
#endif
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 7 or later.
#define WINVER 0x0700 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows 7 or later.
#define _WIN32_WINNT 0x0700 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef UNICODE
#define UNICODE
#endif
// Exclude rarely-used items from Windows headers.
#define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>
// C RunTime Header Files:
#include <wchar.h>
#include "emacros.h"
#include "ecommon.h"
#include "ebase.h"
#include "enodes.h"
#include "etools.h"
#if defined(UNICODE) && (_DEBUG)
#if defined(DEBUG) || defined(_DEBUG)
#pragma comment(lib, "Easy2Ddw.lib")
#elif !defined(UNICODE) && (_DEBUG)
#pragma comment(lib, "Easy2Dd.lib")
#elif defined(UNICODE)
#else
#pragma comment(lib, "Easy2Dw.lib")
#elif !defined(UNICODE)
#pragma comment(lib, "Easy2D.lib")
#endif
// Functions Declare
using namespace e2d;

View File

@ -3,6 +3,7 @@
#include "ecommon.h"
#include <vector>
// Base Classes
namespace e2d
@ -188,7 +189,8 @@ public:
// 删除子成员
bool del(
e2d::ENode * child
e2d::ENode * child,
bool autoRelease = true
);
// 获取所有子节点
@ -202,9 +204,10 @@ protected:
std::vector<e2d::ENode*> m_vChildren;
protected:
// ³¡¾°
void _exec();
void _onDraw();
void _onRender();
};

View File

@ -1,6 +1,28 @@
#pragma once
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 7 or later.
#define WINVER 0x0700 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows 7 or later.
#define _WIN32_WINNT 0x0700 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef UNICODE
#define UNICODE
#endif
// Exclude rarely-used items from Windows headers.
#define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>
#ifndef ASSERT_IF
#if defined( DEBUG ) || defined( _DEBUG )
#define ASSERT(b) do {if (!(b)) { OutputDebugStringA("Assert: " #b "\n"); }} while(0)

View File

@ -158,7 +158,7 @@ protected:
virtual bool _exec(bool active);
virtual void _onDraw() = 0;
virtual void _onRender();
};
}

View File

@ -8,7 +8,9 @@ class EObjectManager
{
public:
// 将一个节点放入释放池
static void add(e2d::EObject * nptr);
static void add(
e2d::EObject * nptr
);
// 删除所有节点
static void clearAllObjects();
@ -20,4 +22,62 @@ private:
static void __flush();
};
class EMouseMsg
{
public:
// 報炎<E5A0B1>連鹿栽
enum MESSAGE
{
MOVE = 0x0200, // 報炎卞強
LBUTTON_DOWN, // 報炎恣囚梓和
LBUTTON_UP, // 報炎恣囚箕軟
LBUTTON_DBLCLK, // 報炎恣囚褒似
RBUTTON_DOWN, // 報炎嘔囚梓和
RBUTTON_UP, // 報炎嘔囚箕軟
RBUTTON_DBLCLK, // 報炎嘔囚褒似
MBUTTON_DOWN, // 報炎嶄囚梓和
MBUTTON_UP, // 報炎嶄囚箕軟
MBUTTON_DBLCLK, // 報炎嶄囚褒似
WHEEL // 錆強獄態
};
public:
EPoint m_Pos;
UINT m_nMsg = 0;
bool m_bLButtonDown = false;
bool m_bRButtonDown = false;
bool m_bMButtonDown = false;
};
class EMouseListener :
public EObject
{
protected:
friend EMsgManager;
e2d::EString name;
};
class EMsgManager
{
public:
static void setMouseMsg(
UINT message
);
static e2d::EMouseMsg::MESSAGE getMouseMsg();
static void addListener(
EMouseListener * listener
);
private:
friend EApp;
static void __exec();
};
}