Path类细节调整

This commit is contained in:
Nomango 2018-07-04 12:49:05 +08:00
parent 8c246df955
commit 17d73916ba
18 changed files with 109 additions and 104 deletions

View File

@ -28,7 +28,7 @@ e2d::Animation::~Animation()
void e2d::Animation::setInterval(double interval)
{
_interval = max(interval, 0);
_interval = std::max(interval, 0.0);
}
void e2d::Animation::onDestroy()

View File

@ -2,7 +2,7 @@
e2d::Delay::Delay(double duration)
: _delta(0)
, _delay(max(duration, 0))
, _delay(std::max(duration, 0.0))
{
}

View File

@ -2,7 +2,7 @@
e2d::FiniteTimeAction::FiniteTimeAction(double duration)
: _delta(0)
, _duration(max(duration, 0))
, _duration(std::max(duration, 0.0))
{
}
@ -28,7 +28,7 @@ void e2d::FiniteTimeAction::_update()
}
else
{
_delta = min((Time::getTotalTime() - _last) / _duration, 1);
_delta = std::min((Time::getTotalTime() - _last) / _duration, 1.0);
if (_delta >= 1)
{

View File

@ -62,13 +62,6 @@ bool e2d::Game::init()
throw SystemException(L"初始化 DirectInput 组件失败");
}
// 初始化路径
if (!Path::__init())
{
DestroyResources();
throw SystemException(L"必要系统路径访问失败");
}
// 初始化成功
_initialized = true;

View File

@ -234,8 +234,8 @@ void e2d::Window::setSize(int width, int height)
// 当输入的窗口大小比分辨率大时,给出警告
WARN_IF(screenWidth < width || screenHeight < height, "The window is larger than screen!");
// 取最小值
width = min(width, screenWidth);
height = min(height, screenHeight);
width = std::min(width, screenWidth);
height = std::min(height, screenHeight);
// 修改窗口大小,并设置窗口在屏幕居中
::MoveWindow(_hWnd, (screenWidth - width) / 2, (screenHeight - height) / 2, width, height, TRUE);
}

View File

@ -15,7 +15,7 @@ e2d::CircleCollider::CircleCollider(Point center, double radius)
e2d::CircleCollider::CircleCollider(Node * node)
: _d2dCircle(nullptr)
{
double minSide = min(node->getRealWidth(), node->getRealHeight());
double minSide = std::min(node->getRealWidth(), node->getRealHeight());
this->setCircle(
Point(
node->getRealWidth() / 2,
@ -50,7 +50,7 @@ void e2d::CircleCollider::_resize()
{
if (_parentNode && _enable)
{
double minSide = min(_parentNode->getRealWidth(), _parentNode->getRealHeight());
double minSide = std::min(_parentNode->getRealWidth(), _parentNode->getRealHeight());
this->setCircle(
Point(
_parentNode->getRealWidth() / 2,

View File

@ -81,10 +81,10 @@ void e2d::Image::crop(const Rect& cropRect)
{
if (_bitmap)
{
_cropRect.origin.x = min(max(cropRect.origin.x, 0), this->getSourceWidth());
_cropRect.origin.y = min(max(cropRect.origin.y, 0), this->getSourceHeight());
_cropRect.size.width = min(max(cropRect.size.width, 0), this->getSourceWidth() - cropRect.origin.x);
_cropRect.size.height = min(max(cropRect.size.height, 0), this->getSourceHeight() - cropRect.origin.y);
_cropRect.origin.x = std::min(std::max(cropRect.origin.x, 0.0), this->getSourceWidth());
_cropRect.origin.y = std::min(std::max(cropRect.origin.y, 0.0), this->getSourceHeight());
_cropRect.size.width = std::min(std::max(cropRect.size.width, 0.0), this->getSourceWidth() - cropRect.origin.x);
_cropRect.size.height = std::min(std::max(cropRect.size.height, 0.0), this->getSourceHeight() - cropRect.origin.y);
}
}

View File

@ -476,7 +476,7 @@ void e2d::Node::setOpacity(double opacity)
if (_realOpacity == opacity)
return;
_displayOpacity = _realOpacity = min(max(float(opacity), 0), 1);
_displayOpacity = _realOpacity = std::min(std::max(float(opacity), 0.f), 1.f);
// 更新节点透明度
_updateOpacity();
}
@ -496,8 +496,8 @@ void e2d::Node::setPivot(double pivotX, double pivotY)
if (_pivotX == pivotX && _pivotY == pivotY)
return;
_pivotX = min(max(float(pivotX), 0), 1);
_pivotY = min(max(float(pivotY), 0), 1);
_pivotX = std::min(std::max(float(pivotX), 0.f), 1.f);
_pivotY = std::min(std::max(float(pivotY), 0.f), 1.f);
_needTransform = true;
}
@ -913,8 +913,8 @@ void e2d::Node::setAutoUpdate(bool bAutoUpdate)
void e2d::Node::setDefaultPiovt(double defaultPiovtX, double defaultPiovtY)
{
s_fDefaultPiovtX = min(max(float(defaultPiovtX), 0), 1);
s_fDefaultPiovtY = min(max(float(defaultPiovtY), 0), 1);
s_fDefaultPiovtX = std::min(std::max(float(defaultPiovtX), 0.f), 1.f);
s_fDefaultPiovtY = std::min(std::max(float(defaultPiovtY), 0.f), 1.f);
}
void e2d::Node::setDefaultCollider(Collider::Type type)

View File

@ -92,8 +92,8 @@ void e2d::Sprite::crop(const Rect& cropRect)
{
_image->crop(cropRect);
Node::setSize(
min(max(cropRect.size.width, 0), _image->getSourceWidth() - _image->getCropX()),
min(max(cropRect.size.height, 0), _image->getSourceHeight() - _image->getCropY())
std::min(std::max(cropRect.size.width, 0.0), _image->getSourceWidth() - _image->getCropX()),
std::min(std::max(cropRect.size.height, 0.0), _image->getSourceHeight() - _image->getCropY())
);
}

View File

@ -218,7 +218,7 @@ void e2d::Text::setWrappingWidth(double wrappingWidth)
{
if (_style.wrappingWidth != wrappingWidth)
{
_style.wrappingWidth = max(wrappingWidth, 0);
_style.wrappingWidth = std::max(wrappingWidth, 0.0);
if (_style.wrapping)
{

View File

@ -3,46 +3,46 @@
void e2d::Data::saveInt(const String& key, int value, const String& field)
{
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataSavePath());
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataPath());
}
void e2d::Data::saveDouble(const String& key, double value, const String& field)
{
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataSavePath());
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(value), (LPCWSTR)Path::getDataPath());
}
void e2d::Data::saveBool(const String& key, bool value, const String& field)
{
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (value ? L"1" : L"0"), (LPCWSTR)Path::getDataSavePath());
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (value ? L"1" : L"0"), (LPCWSTR)Path::getDataPath());
}
void e2d::Data::saveString(const String& key, const String& value, const String& field)
{
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)value, (LPCWSTR)Path::getDataSavePath());
::WritePrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)value, (LPCWSTR)Path::getDataPath());
}
int e2d::Data::getInt(const String& key, int defaultValue, const String& field)
{
return ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, defaultValue, (LPCWSTR)Path::getDataSavePath());
return ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, defaultValue, (LPCWSTR)Path::getDataPath());
}
double e2d::Data::getDouble(const String& key, double defaultValue, const String& field)
{
wchar_t temp[32] = { 0 };
::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(defaultValue), temp, 31, (LPCWSTR)Path::getDataSavePath());
::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)String::parse(defaultValue), temp, 31, (LPCWSTR)Path::getDataPath());
return std::stof(temp);
}
bool e2d::Data::getBool(const String& key, bool defaultValue, const String& field)
{
int nDefaultValue = defaultValue ? 1 : 0;
int nValue = ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, nDefaultValue, (LPCWSTR)Path::getDataSavePath());
int nValue = ::GetPrivateProfileInt((LPCWSTR)field, (LPCWSTR)key, nDefaultValue, (LPCWSTR)Path::getDataPath());
return nValue != 0;
}
e2d::String e2d::Data::getString(const String& key, const String& defaultValue, const String& field)
{
wchar_t temp[256] = { 0 };
::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)defaultValue, temp, 255, (LPCWSTR)Path::getDataSavePath());
::GetPrivateProfileString((LPCWSTR)field, (LPCWSTR)key, (LPCWSTR)defaultValue, temp, 255, (LPCWSTR)Path::getDataPath());
return temp;
}

View File

@ -247,7 +247,7 @@ bool e2d::Music::play(int nLoopCount)
stop();
}
nLoopCount = min(nLoopCount, XAUDIO2_LOOP_INFINITE - 1);
nLoopCount = std::min(nLoopCount, XAUDIO2_LOOP_INFINITE - 1);
nLoopCount = (nLoopCount < 0) ? XAUDIO2_LOOP_INFINITE : nLoopCount;
// 提交 wave 样本数据

View File

@ -1,70 +1,45 @@
#include "..\e2dtool.h"
#include <algorithm>
#include <list>
#include <commdlg.h>
#define DEFINE_KNOWN_FOLDER(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID DECLSPEC_SELECTANY name \
= { l, w1, w2,{ b1, b2, b3, b4, b5, b6, b7, b8 } }
DEFINE_KNOWN_FOLDER(FOLDERID_LocalAppData, 0xF1B32785, 0x6FBA, 0x4FCF, 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91);
extern "C" const GUID DECLSPEC_SELECTANY FOLDERID_LocalAppData = {
0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 }
};
static e2d::String s_sLocalAppDataPath;
static e2d::String s_sTempPath;
static e2d::String s_sDataSavePath;
static std::list<e2d::String> s_vPathList;
e2d::String e2d::Path::_tempPath;
e2d::String e2d::Path::_dataPath;
std::list<e2d::String> e2d::Path::_paths;
bool e2d::Path::__init()
{
// 获取 AppData\Local 文件夹的路径
typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath);
PWSTR pszPath = nullptr;
HMODULE hModule = LoadLibrary(L"shell32.dll");
pFunSHGetKnownFolderPath SHGetKnownFolderPath = (pFunSHGetKnownFolderPath)GetProcAddress(hModule, "SHGetKnownFolderPath");
HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &pszPath);
if (SUCCEEDED(hr))
{
s_sLocalAppDataPath = pszPath;
CoTaskMemFree(pszPath);
}
else
{
WARN("Get local AppData path failed!");
return false;
}
return true;
}
void e2d::Path::setGameFolderName(const String & name)
{
if (name.isEmpty())
return;
// 获取数据的默认保存路径
if (!s_sLocalAppDataPath.isEmpty())
// 设置数据的默认保存路径
String localAppDataPath = Path::getLocalAppDataPath();
if (!localAppDataPath.isEmpty())
{
s_sDataSavePath = s_sLocalAppDataPath + L"\\Easy2DGameData\\" << name << L"\\";
_dataPath = localAppDataPath + L"\\Easy2DGameData\\" << name << L"\\";
if (!Path::exists(s_sDataSavePath) && !Path::createFolder(s_sDataSavePath))
if (!Path::exists(_dataPath) && !Path::createFolder(_dataPath))
{
s_sDataSavePath = L"";
_dataPath = L"";
}
s_sDataSavePath << L"Data.ini";
_dataPath << L"Data.ini";
}
// 获取临时文件目录
// 设置临时文件保存路径
wchar_t path[_MAX_PATH];
if (0 != ::GetTempPath(_MAX_PATH, path))
{
s_sTempPath << path << L"\\Easy2DGameTemp\\" << name << L"\\";
_tempPath << path << L"\\Easy2DGameTemp\\" << name << L"\\";
if (!Path::exists(s_sTempPath) && !Path::createFolder(s_sTempPath))
if (!Path::exists(_tempPath) && !Path::createFolder(_tempPath))
{
s_sTempPath = L"";
_tempPath = L"";
}
}
}
@ -76,19 +51,42 @@ void e2d::Path::addSearchPath(String path)
{
path << L"\\";
}
auto iter = std::find(s_vPathList.cbegin(), s_vPathList.cend(), path);
if (iter == s_vPathList.cend())
auto iter = std::find(_paths.cbegin(), _paths.cend(), path);
if (iter == _paths.cend())
{
s_vPathList.push_front(path);
_paths.push_front(path);
}
}
e2d::String e2d::Path::getTempPath()
{
return s_sTempPath;
return _tempPath;
}
e2d::String e2d::Path::getExecutableFilePath()
e2d::String e2d::Path::getLocalAppDataPath()
{
static String localAppDataPath;
if (localAppDataPath.isEmpty())
{
// 获取 AppData/Local 文件夹的路径
typedef HRESULT(WINAPI* pFunSHGetKnownFolderPath)(const GUID& rfid, DWORD dwFlags, HANDLE hToken, PWSTR *ppszPath);
PWSTR pszPath = nullptr;
HMODULE hModule = LoadLibrary(L"shell32.dll");
pFunSHGetKnownFolderPath SHGetKnownFolderPath = (pFunSHGetKnownFolderPath)GetProcAddress(hModule, "SHGetKnownFolderPath");
HRESULT hr = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &pszPath);
if (SUCCEEDED(hr))
{
localAppDataPath = pszPath;
CoTaskMemFree(pszPath);
}
}
return localAppDataPath;
}
e2d::String e2d::Path::getCurrentFilePath()
{
TCHAR szPath[_MAX_PATH] = { 0 };
if (::GetModuleFileName(nullptr, szPath, _MAX_PATH) != 0)
@ -106,7 +104,7 @@ e2d::String e2d::Path::findFile(const String& path)
}
else
{
for (auto& resPath : s_vPathList)
for (auto& resPath : _paths)
{
if (Path::exists(resPath + path))
{
@ -119,7 +117,7 @@ e2d::String e2d::Path::findFile(const String& path)
e2d::String e2d::Path::extractResource(int resNameId, const String & resType, const String & destFileName)
{
String destFilePath = s_sTempPath + destFileName;
String destFilePath = _tempPath + destFileName;
// ´´½¨Îļþ
HANDLE hFile = ::CreateFile((LPCWSTR)destFilePath, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);
if (hFile == INVALID_HANDLE_VALUE)
@ -146,9 +144,9 @@ e2d::String e2d::Path::extractResource(int resNameId, const String & resType, co
}
}
e2d::String e2d::Path::getDataSavePath()
e2d::String e2d::Path::getDataPath()
{
return s_sDataSavePath;
return _dataPath;
}
e2d::String e2d::Path::getFileExtension(const String& filePath)

View File

@ -213,7 +213,7 @@ double e2d::Player::getVolume()
void e2d::Player::setVolume(double volume)
{
_volume = min(max(float(volume), -224), 224);
_volume = std::min(std::max(float(volume), -224.f), 224.f);
for (auto pair : _fileList)
{
pair.second->setVolume(_volume);

View File

@ -17,7 +17,7 @@ namespace e2d
, stopped(false)
, runTimes(0)
, totalTimes(updateTimes)
, delay(max(delay, 0))
, delay(std::max(delay, 0.0))
, lastTime(e2d::Time::getTotalTime())
, callback(func)
, name(name)

View File

@ -13,7 +13,7 @@ e2d::Transition::Transition(double duration)
, _outLayerParam()
, _inLayerParam()
{
_duration = max(duration, 0);
_duration = std::max(duration, 0.0);
}
e2d::Transition::~Transition()
@ -68,7 +68,7 @@ void e2d::Transition::_update()
}
else
{
_delta = min((Time::getTotalTime() - _last) / _duration, 1);
_delta = std::min((Time::getTotalTime() - _last) / _duration, 1.0);
}
this->_updateCustom();
@ -92,10 +92,10 @@ void e2d::Transition::_render()
{
Point rootPos = _outScene->getRoot()->getPos();
auto clipRect = D2D1::RectF(
float(max(rootPos.x, 0)),
float(max(rootPos.y, 0)),
float(min(rootPos.x + _windowSize.width, _windowSize.width)),
float(min(rootPos.y + _windowSize.height, _windowSize.height))
float(std::max(rootPos.x, 0.0)),
float(std::max(rootPos.y, 0.0)),
float(std::min(rootPos.x + _windowSize.width, _windowSize.width)),
float(std::min(rootPos.y + _windowSize.height, _windowSize.height))
);
pRT->SetTransform(D2D1::Matrix3x2F::Identity());
pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
@ -111,10 +111,10 @@ void e2d::Transition::_render()
{
Point rootPos = _inScene->getRoot()->getPos();
auto clipRect = D2D1::RectF(
float(max(rootPos.x, 0)),
float(max(rootPos.y, 0)),
float(min(rootPos.x + _windowSize.width, _windowSize.width)),
float(min(rootPos.y + _windowSize.height, _windowSize.height))
float(std::max(rootPos.x, 0.0)),
float(std::max(rootPos.y, 0.0)),
float(std::min(rootPos.x + _windowSize.width, _windowSize.width)),
float(std::min(rootPos.y + _windowSize.height, _windowSize.height))
);
pRT->SetTransform(D2D1::Matrix3x2F::Identity());
pRT->PushAxisAlignedClip(clipRect, D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);

View File

@ -41,6 +41,7 @@
// C++ RunTime Header Files
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <random>
@ -97,3 +98,12 @@
Class(const Class &); \
Class & operator= (const Class &)
#endif
#ifdef max
# undef max
#endif
#ifdef min
# undef min
#endif

View File

@ -477,13 +477,16 @@ public:
);
// 获取数据的默认保存路径
static String getDataSavePath();
static String getDataPath();
// 获取临时文件目录
static String getTempPath();
// 获取执行程序的绝对路径
static String getExecutableFilePath();
// 获取 LocalAppData 目录
static String getLocalAppDataPath();
// 获取当前程序的运行路径
static String getCurrentFilePath();
// 获取文件扩展名
static String getFileExtension(
@ -507,8 +510,9 @@ public:
);
private:
// 初始化
static bool __init();
static String _tempPath;
static String _dataPath;
static std::list<String> _paths;
};
}