Magic_Game/Easy2D/etools.h

317 lines
5.8 KiB
C
Raw Normal View History

#pragma once
#include "ebase.h"
2017-10-17 21:22:25 +08:00
#include <chrono>
#include <random>
namespace e2d
{
2017-10-17 21:22:25 +08:00
class ETimerManager;
2017-10-19 00:50:04 +08:00
class EAction;
2017-10-17 21:22:25 +08:00
2017-10-14 01:07:34 +08:00
2017-10-14 18:43:32 +08:00
// <20><>ʱ<EFBFBD><CAB1>
class ETimer :
public EObject
{
2017-10-17 21:22:25 +08:00
friend ETimerManager;
public:
ETimer();
ETimer(
const TIMER_CALLBACK &callback, /* <20><>ʱ<EFBFBD><CAB1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> */
2017-10-21 19:09:31 +08:00
int repeatTimes = -1, /* <20><>ʱ<EFBFBD><CAB1>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD> */
LONGLONG interval = 0LL, /* ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩 */
bool atOnce = false /* <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> */
2017-10-17 21:22:25 +08:00
);
ETimer(
const EString &name, /* <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const TIMER_CALLBACK &callback, /* <20><>ʱ<EFBFBD><CAB1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> */
2017-10-21 19:09:31 +08:00
int repeatTimes = -1, /* <20><>ʱ<EFBFBD><CAB1>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD> */
LONGLONG interval = 0LL, /* ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩 */
bool atOnce = false /* <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> */
2017-10-17 21:22:25 +08:00
);
// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1>״̬
bool isRunning() const;
2017-10-21 19:09:31 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
2017-10-17 21:22:25 +08:00
void start();
2017-10-21 19:09:31 +08:00
// ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1>
2017-10-17 21:22:25 +08:00
void stop();
// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EString getName() const;
// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڽڵ<DABD>
ENode * getParentNode() const;
2017-10-14 18:43:32 +08:00
2017-10-17 21:22:25 +08:00
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void setName(
const EString &name
);
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ִ<EFBFBD>м<EFBFBD><D0BC><EFBFBD>
void setInterval(
LONGLONG interval
);
2017-10-21 19:09:31 +08:00
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
void setCallback(
const TIMER_CALLBACK & callback
);
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ظ<EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>
void setRepeatTimes(
int repeatTimes
);
2017-10-17 21:22:25 +08:00
// <20>󶨶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
virtual void bindWith(
EScene * pParentScene
);
// <20>󶨶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
virtual void bindWith(
ENode * pParentNode
);
protected:
// ִ<>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
2017-10-19 00:50:04 +08:00
virtual void _callOn();
2017-10-17 21:22:25 +08:00
2017-10-21 19:09:31 +08:00
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>ﵽִ<EFB5BD><D6B4>״̬
bool _isReady();
2017-10-17 21:22:25 +08:00
protected:
EString m_sName;
bool m_bRunning;
2017-10-21 19:09:31 +08:00
bool m_bAtOnce;
2017-10-17 21:22:25 +08:00
int m_nRunTimes;
2017-10-21 19:09:31 +08:00
int m_nRepeatTimes;
2017-10-17 21:22:25 +08:00
ENode * m_pParentNode;
TIMER_CALLBACK m_Callback;
LONGLONG m_nInterval;
std::chrono::steady_clock::time_point m_tLast;
2017-10-14 18:43:32 +08:00
};
class EFileUtils
{
public:
2017-10-31 17:19:13 +08:00
// <20><>ȡϵͳ<CFB5><CDB3> AppData Local ·<><C2B7>
static EString getLocalAppDataPath();
2017-10-31 17:19:13 +08:00
// <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD>ļ<EFBFBD>Ŀ¼
static EString getTempPath();
// <20><>ȡĬ<C8A1>ϵı<CFB5><C4B1><EFBFBD>·<EFBFBD><C2B7>
static EString getDefaultSavePath();
// <20><><EFBFBD><EFBFBD> int <20>͵<EFBFBD>ֵ
static void saveInt(
LPCTSTR key,
int value
);
// <20><><EFBFBD><EFBFBD> float <20>͵<EFBFBD>ֵ
static void saveFloat(
LPCTSTR key,
float value
);
// <20><><EFBFBD><EFBFBD> <20>ַ<EFBFBD><D6B7><EFBFBD> <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA> Unicode <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
static void saveString(
LPCTSTR key,
LPCTSTR value
);
// <20><>ȡ int <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> default <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
static int getInt(
LPCTSTR key,
int default
);
// <20><>ȡ float <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> default <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
static float getFloat(
LPCTSTR key,
float default
);
// <20><>ȡ <20>ַ<EFBFBD><D6B7><EFBFBD> <20>͵<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> default <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
static EString geTString(
LPCTSTR key,
LPCTSTR default
);
// <20>õ<EFBFBD><C3B5>ļ<EFBFBD><C4BC><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>Сд<D0A1><D0B4>
static EString getFileExtension(
const EString & filePath
);
/**
* <EFBFBD>򿪱<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>Ի<EFBFBD><EFBFBD>򣬵õ<EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>
*/
static EString getSaveFilePath(
LPCTSTR title = L"<EFBFBD><EFBFBD><EFBFBD>",
LPCTSTR defExt = NULL
);
};
class ERandom
{
public:
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
template<typename T>
2017-10-21 19:09:31 +08:00
static inline T between(T min, T max) { return e2d::ERandom::randomInt(min, max); }
// ȡ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static inline float between(float min, float max) { return e2d::ERandom::randomReal(min, max); }
// ȡ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static inline double between(double min, double max) { return e2d::ERandom::randomReal(min, max); }
// ȡ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static inline long double between(long double min, long double max) { return e2d::ERandom::randomReal(min, max); }
// ȡ<><C8A1><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
template<typename T>
static T randomInt(
T min,
T max)
{
std::uniform_int_distribution<T> dist(min, max);
return dist(getEngine());
}
// ȡ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
template<typename T>
2017-10-21 19:09:31 +08:00
static T randomReal(
T min,
T max)
{
std::uniform_real_distribution<T> dist(min, max);
return dist(getEngine());
}
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static std::default_random_engine &getEngine();
};
class EMusicUtils
{
public:
// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void playBackgroundMusic(
const EString & musicFilePath,
bool loop = true
);
// <20><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void playBackgroundMusic(
const EString & musicResourceName, /* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> */
const EString & musicResourceType, /* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> */
const EString & musicExtension, /* ָ<><D6B8><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>չ<EFBFBD><D5B9> */
bool loop = true
);
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void stopBackgroundMusic(
bool release = false
);
// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void pauseBackgroundMusic();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void resumeBackgroundMusic();
// <20><>ͷ<EFBFBD><CDB7><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void rewindBackgroundMusic();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
static bool isBackgroundMusicPlaying();
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ [0 ~ 1.0]
static void setBackgroundMusicVolume(
float volume
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
static void playMusic(
const EString & musicFilePath,
bool loop = false
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
static void playMusic(
const EString & musicResourceName, /* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> */
const EString & musicResourceType, /* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> */
const EString & musicExtension, /* ָ<><D6B8><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>չ<EFBFBD><D5B9> */
bool loop = false
);
// Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
static void preloadMusic(
const EString & musicFilePath
);
// Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
static void preloadMusic(
const EString & musicResourceName, /* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> */
const EString & musicResourceType, /* <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD> */
const EString & musicExtension /* ָ<><D6B8><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>չ<EFBFBD><D5B9> */
);
// ж<><D0B6><EFBFBD><EFBFBD>Ч
static void unloadMusic(
const EString & musicFilePath
);
// <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ [0 ~ 1.0]
static void setVolume(
const EString & musicFilePath,
float volume
);
// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void pauseAllMusics();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void resumeAllMusics();
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void stopAllMusics();
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
static void end();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ [0 ~ 1.0]
static void setVolume(
float volume
);
protected:
// <20><>ͣ<EFBFBD><CDA3>Ч
static void _pauseMusic(
size_t nSoundId
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч
static void _resumeMusic(
size_t nSoundId
);
// ֹͣ<CDA3><D6B9>Ч
static void _stopMusic(
size_t nSoundId
);
};
}