Magic_Game/core/e2dtool.h

569 lines
9.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "e2dbase.h"
namespace e2d
{
// 随机数产生器
class Random
{
public:
// 取得范围内的一个整型随机数
template<typename T>
static inline T range(T min, T max)
{
return e2d::Random::__randomInt(min, max);
}
// 取得范围内的一个浮点数随机数
static inline double range(float min, float max)
{
return e2d::Random::__randomReal(min, max);
}
// 取得范围内的一个浮点数随机数
static inline double range(double min, double max)
{
return e2d::Random::__randomReal(min, max);
}
private:
template<typename T>
static T __randomInt(T min, T max)
{
std::uniform_int_distribution<T> dist(min, max);
return dist(Random::__getEngine());
}
template<typename T>
static T __randomReal(T min, T max)
{
std::uniform_real_distribution<T> dist(min, max);
return dist(Random::__getEngine());
}
// 获取随机数产生器
static std::default_random_engine &__getEngine();
};
// 音乐
class Music :
public Ref
{
friend class VoiceCallback;
public:
Music();
explicit Music(
const e2d::String& filePath /* 音乐文件路径 */
);
explicit Music(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
virtual ~Music();
// 打开音乐文件
bool open(
const e2d::String& filePath /* 音乐文件路径 */
);
// 打开音乐资源
bool open(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
// 播放
bool play(
int nLoopCount = 0
);
// 暂停
void pause();
// 继续
void resume();
// 停止
void stop();
// 关闭并回收资源
void close();
// 是否正在播放
bool isPlaying() const;
// 设置音量
bool setVolume(
double volume
);
// 设置播放结束时的执行函数
void setFuncOnEnd(
const Function& func
);
// 设置循环播放中每一次播放结束时的执行函数
void setFuncOnLoopEnd(
const Function& func
);
// 获取 IXAudio2SourceVoice 对象
IXAudio2SourceVoice * getIXAudio2SourceVoice() const;
protected:
bool _readMMIO();
bool _resetFile();
bool _read(
BYTE* pBuffer,
DWORD dwSizeToRead
);
bool _findMediaFileCch(
wchar_t* strDestPath,
int cchDest,
const wchar_t * strFilename
);
protected:
bool _opened;
bool _playing;
DWORD _dwSize;
CHAR* _resBuffer;
BYTE* _waveData;
HMMIO _hmmio;
MMCKINFO _ck;
MMCKINFO _ckRiff;
WAVEFORMATEX* _wfx;
VoiceCallback _voiceCallback;
IXAudio2SourceVoice* _voice;
};
// 音乐播放器
class Player
{
friend class Game;
typedef std::map<UINT, Music*> MusicMap;
public:
// 获取播放器实例
static Player * getInstance();
// 销毁实例
static void destroyInstance();
// 预加载音乐资源
bool preload(
const String& filePath /* 音乐文件路径 */
);
// 播放音乐
bool play(
const String& filePath, /* 音乐文件路径 */
int nLoopCount = 0 /* 重复播放次数,设置 -1 为循环播放 */
);
// 暂停音乐
void pause(
const String& filePath /* 音乐文件路径 */
);
// 继续播放音乐
void resume(
const String& filePath /* 音乐文件路径 */
);
// 停止音乐
void stop(
const String& filePath /* 音乐文件路径 */
);
// 获取音乐播放状态
bool isPlaying(
const String& filePath /* 音乐文件路径 */
);
// 预加载音乐资源
bool preload(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
// 播放音乐
bool play(
int resNameId, /* 音乐资源名称 */
const String& resType, /* 音乐资源类型 */
int nLoopCount = 0 /* 重复播放次数,设置 -1 为循环播放 */
);
// 暂停音乐
void pause(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
// 继续播放音乐
void resume(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
// 停止音乐
void stop(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
// 获取音乐播放状态
bool isPlaying(
int resNameId, /* 音乐资源名称 */
const String& resType /* 音乐资源类型 */
);
// 获取音量
double getVolume();
// 设置音量
void setVolume(
double volume /* 音量范围为 -224 ~ 2240 是静音1 是正常音量 */
);
// 暂停所有音乐
void pauseAll();
// 继续播放所有音乐
void resumeAll();
// 停止所有音乐
void stopAll();
// 清空音乐缓存
void clearCache();
// 获取 IXAudio2 对象
IXAudio2 * getXAudio2();
private:
Player();
~Player();
E2D_DISABLE_COPY(Player);
private:
float _volume;
MusicMap _fileList;
MusicMap _resList;
IXAudio2* _xAudio2;
IXAudio2MasteringVoice* _masteringVoice;
static Player * _instance;
};
class Timer;
// 定时任务
class Task :
public Ref
{
friend class Timer;
public:
explicit Task(
const Function& func, /* 执行函数 */
const String& name = L"" /* 定时器名称 */
);
explicit Task(
const Function& func, /* 执行函数 */
double delay, /* 时间间隔(秒) */
int times = -1, /* 执行次数(设 -1 为永久执行) */
const String& name = L"" /* 定时器名称 */
);
// 暂停任务
void pause();
// 继续任务
void resume();
// 任务是否就绪
bool isReady() const;
// 任务是否正在执行
bool isRunning() const;
// 获取任务名称
String getName() const;
// 执行任务
void update();
// 刷新任务计时
void updateTime();
private:
bool _running;
bool _stopped;
int _runTimes;
int _totalTimes;
double _delay;
double _lastTime;
String _name;
Function _callback;
};
// 定时器
class Timer
{
public:
// 获取定时器实例
static Timer * getInstance();
// 销毁实例
static void destroyInstance();
// 添加任务
void addTask(
Task * task
);
// 继续具有相同名称的任务
void resumeTasks(
const String& name
);
// 暂停具有相同名称的任务
void pauseTasks(
const String& name
);
// 移除具有相同名称的任务
void removeTasks(
const String& name
);
// 继续所有任务
void resumeAllTasks();
// 暂停所有任务
void pauseAllTasks();
// 移除所有任务
void removeAllTasks();
// 强制清空所有任务
void clearAllTasks();
// 更新定时器
void update();
// 刷新所有任务计时
void updateTime();
private:
Timer();
~Timer();
E2D_DISABLE_COPY(Timer);
private:
std::vector<Task*> _tasks;
static Timer * _instance;
};
class Collision;
// 监听器
class Listener :
public Ref
{
friend class Input;
friend class Collision;
public:
Listener();
explicit Listener(
const Function& func,
const String& name,
bool paused
);
// 启动监听
void start();
// 停止监听
void stop();
// 获取监听器运行状态
bool isRunning() const;
// 获取名称
String getName() const;
// 设置名称
void setName(
const String& name
);
// 设置监听回调函数
void setFunc(
const Function& func
);
protected:
// 更新监听器状态
virtual void _update();
protected:
bool _running;
bool _stopped;
String _name;
Function _callback;
};
// 数据管理工具
class Data
{
public:
// 保存 int 类型的值
static void saveInt(
const String& key, /* 键值 */
int value, /* 数据 */
const String& field = L"Defalut" /* 字段名称 */
);
// 保存 double 类型的值
static void saveDouble(
const String& key, /* 键值 */
double value, /* 数据 */
const String& field = L"Defalut" /* 字段名称 */
);
// 保存 bool 类型的值
static void saveBool(
const String& key, /* 键值 */
bool value, /* 数据 */
const String& field = L"Defalut" /* 字段名称 */
);
// 保存 字符串 类型的值
static void saveString(
const String& key, /* 键值 */
const String& value, /* 数据 */
const String& field = L"Defalut" /* 字段名称 */
);
// 获取 int 类型的值
// (若不存在则返回 defaultValue 参数的值)
static int getInt(
const String& key, /* 键值 */
int defaultValue, /* 默认值 */
const String& field = L"Defalut" /* 字段名称 */
);
// 获取 double 类型的值
// (若不存在则返回 defaultValue 参数的值)
static double getDouble(
const String& key, /* 键值 */
double defaultValue, /* 默认值 */
const String& field = L"Defalut" /* 字段名称 */
);
// 获取 bool 类型的值
// (若不存在则返回 defaultValue 参数的值)
static bool getBool(
const String& key, /* 键值 */
bool defaultValue, /* 默认值 */
const String& field = L"Defalut" /* 字段名称 */
);
// 获取 字符串 类型的值
// (若不存在则返回 defaultValue 参数的值)
static String getString(
const String& key, /* 键值 */
const String& defaultValue, /* 默认值 */
const String& field = L"Defalut" /* 字段名称 */
);
};
// 路径工具
class Path
{
friend class Game;
public:
// 添加资源搜索路径
static void addSearchPath(
String path
);
// 检索文件路径
static String findFile(
const String& path
);
// 提取资源文件,返回提取后的文件路径
static String extractResource(
int resNameId, /* 资源名称 */
const String& resType, /* 资源类型 */
const String& destFileName /* 目标文件名 */
);
// 获取数据的默认保存路径
static String getDataPath();
// 获取临时文件目录
static String getTempPath();
// 获取 LocalAppData 目录
static String getLocalAppDataPath();
// 获取当前程序的运行路径
static String getCurrentFilePath();
// 获取文件扩展名
static String getFileExtension(
const String& filePath
);
// 打开保存文件对话框
static String getSaveFilePath(
const String& title = L"保存到", /* 对话框标题 */
const String& defExt = L"" /* 默认扩展名 */
);
// 创建文件夹
static bool createFolder(
const String& dirPath /* 文件夹路径 */
);
// 判断文件或文件夹是否存在
static bool exists(
const String& dirPath /* 文件夹路径 */
);
private:
static String _tempPath;
static String _dataPath;
static std::list<String> _paths;
};
}