Magic_Game/Easy2D/v1/easy2d.h

1662 lines
40 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.

/******************************************************
* Easy2D Game Engine
*
* Website: http://www.easy2d.cn
* Github: https://github.com/Nomango/Easy2D
* Gitee: https://gitee.com/werelone/Easy2D
******************************************************/
#pragma once
#ifndef __cplusplus
#error Easy2D is only for C++
#endif
#if _MSC_VER < 1900
#error Do Visual Studio 2015/2017 specific stuff
#endif
#include <Windows.h>
#include <tchar.h>
#include <atltypes.h>
#include <atlimage.h>
#include <chrono>
#include <vector>
#include <functional>
#include <random>
#if defined(UNICODE) && (_DEBUG)
#pragma comment(lib,"Easy2Ddw.lib")
#elif !defined(UNICODE) && (_DEBUG)
#pragma comment(lib,"Easy2Dd.lib")
#elif defined(UNICODE)
#pragma comment(lib,"Easy2Dw.lib")
#elif !defined(UNICODE)
#pragma comment(lib,"Easy2D.lib")
#endif
// Type Declare
typedef CPoint CVector;
typedef unsigned int VK_KEY;
typedef std::function<void()> CLICK_CALLBACK;
typedef std::function<void()> TIMER_CALLBACK;
typedef std::function<void(VK_KEY)> KEY_CALLBACK;
typedef std::function<void()> MOUSE_CALLBACK;
#ifdef UNICODE
typedef std::wstring TString;
#else
typedef std::string TString;
#endif
// Classes Declare
namespace easy2d
{
class App;
class Scene;
class Object;
class Node;
class FontStyle;
class Color;
class RectNode;
class Text;
class Image;
class BatchNode;
class MouseNode;
class Button;
class TextButton;
class ImageButton;
class Layer;
class Sprite;
class BatchSprite;
class Shape;
class Circle;
class Rectangle;
class Action;
class Animation;
class ActionMoveTo;
class ActionMoveBy;
class ActionScaleTo;
class ActionScaleBy;
class ActionOpacityTo;
class ActionOpacityBy;
class ActionFadeIn;
class ActionFadeOut;
class ActionFrames;
class ActionDelay;
class ActionCallback;
class ActionTwo;
class ActionSequence;
class ActionNeverStop;
class MouseMsg;
class KeyMsg;
class FreePool;
class FileUtils;
class MusicUtils;
class ActionManager;
}
// Classes
namespace easy2d
{
class App
{
friend Scene;
public:
App();
~App();
// 窗口可选模式
enum MODE { SHOW_CONSOLE = 1, NO_CLOSE = 2, NO_MINI_MIZE = 4 };
// 定义绘图窗口
void createWindow(int width, int height, int mode = 0);
// 定义绘图窗口
void createWindow(CSize size, int mode = 0);
// 定义绘图窗口
void createWindow(TString title, int width, int height, int mode = 0);
// 定义绘图窗口
void createWindow(TString title, CSize size, int mode = 0);
// 启动程序
int run();
// 释放所有内存资源
void free();
// 获取程序实例
static App * get();
// 终止程序
static void quit();
// 终止程序
static void end();
// 修改窗口大小
static void setWindowSize(int width, int height);
// 修改窗口大小
static void setWindowSize(CSize size);
// 关闭窗口
static void close();
// 设置窗口标题
static void setWindowTitle(TString title);
// 获取窗口标题
static TString getWindowTitle();
// 获取窗口宽度
static int getWidth();
// 获取窗口高度
static int getHeight();
// 切换场景
static void enterScene(Scene *scene, bool save = true);
// 返回上一场景
static void backScene();
// 清空之前保存的所有场景
static void clearScene();
// 设置 AppName
static void setAppName(TString appname);
// 获取 AppName
static TString getAppName();
// 修改窗口背景色
static void setBkColor(COLORREF color);
// 重置绘图样式为默认值
static void reset();
// 获取当前场景
static Scene * getCurrentScene();
// 获取正处于加载中的场景
static Scene * getLoadingScene();
protected:
TString m_sTitle;
TString m_sAppName;
Scene* m_pCurrentScene;
Scene* m_pNextScene;
Scene* m_pLoadingScene;
CSize m_Size;
int m_nWindowMode;
bool m_bRunning;
bool m_bSaveScene;
protected:
void _initGraph();
void _draw();
void _mainLoop();
void _enterNextScene();
};
class FreePool
{
friend App;
friend Object;
private:
// 刷新内存池
static void __flush();
// 将一个节点放入释放池
static void __add(Object * nptr);
// 删除所有节点
static void __clearAllObjects();
};
class Scene
{
friend App;
friend MouseMsg;
public:
Scene();
~Scene();
// 重写这个函数,初始化这个场景
virtual void init();
// 重写这个函数,它将在进入这个场景时自动执行
virtual void onEnter();
// 重写这个函数,它将在离开这个场景时自动执行
virtual void onExit();
// 添加子成员到场景
void add(Node * child, int zOrder = 0);
// 删除子成员
bool del(Node * child);
// 清空所有子成员
void clearAllChildren();
protected:
std::vector<Node*> m_vChildren;
protected:
void _exec();
void _onDraw();
};
class Object
{
friend FreePool;
public:
Object();
virtual ~Object();
// 保留这个对象
void retain();
// 释放这个对象
void release();
// 让引擎自动释放这个对象
void autoRelease();
protected:
int m_nRefCount;
bool m_bAutoRelease;
};
class MouseMsg
{
friend App;
public:
MouseMsg();
MouseMsg(TString name, const MOUSE_CALLBACK& callback);
~MouseMsg();
enum MESSAGE
{
MOVE = 0x0200, // 鼠标移动
LBUTTON_DOWN, // 鼠标左键按下
LBUTTON_UP, // 鼠标左键抬起
LBUTTON_DBLCLK, // 鼠标左键双击
RBUTTON_DOWN, // 鼠标右键按下
RBUTTON_UP, // 鼠标右键抬起
RBUTTON_DBLCLK, // 鼠标右键双击
MBUTTON_DOWN, // 鼠标中键按下
MBUTTON_UP, // 鼠标中键抬起
MBUTTON_DBLCLK, // 鼠标中键双击
WHEEL // 滑动滚轮
};
// 启动监听
void start();
// 停止监听
void stop();
// 进入等待状态
void wait();
// 唤醒
void notify();
// 左键是否按下
static bool isLButtonDown();
// 右键是否按下
static bool isRButtonDown();
// 中键是否按下
static bool isMButtonDown();
// 获取鼠标X坐标
static int getX();
// 获取鼠标Y坐标
static int getY();
// 获取鼠标坐标
static CPoint getPos();
// 获取鼠标滚轮值
static int getWheel();
// 获取当前鼠标消息
static MESSAGE getMsg();
// 添加鼠标消息监听
static void addListener(TString name, const MOUSE_CALLBACK& callback);
// 启动鼠标消息监听
static void startListener(TString name);
// 停止鼠标消息监听
static void stopListener(TString name);
// 删除鼠标消息监听
static void delListener(TString name);
// 删除所有鼠标消息监听
static void clearAllListeners();
// 启动绑定在场景上的所有监听器
static void notifyAllSceneListeners(Scene* scene);
// 停止绑定在场景上的所有监听器
static void waitAllSceneListeners(Scene* scene);
// 清除绑定在场景上的所有监听器
static void clearAllSceneListeners(Scene* scene);
private:
static void __exec();
protected:
bool m_bRunning;
bool m_bWaiting;
TString m_sName;
MOUSE_CALLBACK m_callback;
Scene * m_pParentScene;
protected:
// 执行回调函数
void onMouseMsg();
};
class KeyMsg
{
friend App;
public:
KeyMsg(TString name, const KEY_CALLBACK& callback);
~KeyMsg();
// 执行回调函数
void onKbHit(VK_KEY key);
// 启动监听
void start();
// 停止监听
void stop();
// 进入等待状态
void wait();
// 唤醒
void notify();
// 判断键是否被按下按下返回true
static bool isKeyDown(VK_KEY key);
// 添加按键监听
static void addListener(TString name, const KEY_CALLBACK& callback);
// 启动按键监听
static void startListener(TString name);
// 停止按键监听
static void stopListener(TString name);
// 删除按键监听
static void KeyMsg::delListener(TString name);
// 启动绑定在场景上的所有监听器
static void notifyAllSceneListeners(Scene* scene);
// 停止绑定在场景上的所有监听器
static void waitAllSceneListeners(Scene* scene);
// 停止绑定在场景上的所有定时器
static void clearAllSceneListeners(Scene* scene);
// 删除所有按键监听
static void clearAllListeners();
public:
// 字母键值
static const VK_KEY A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z;
// 数字键值
static const VK_KEY NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_0;
// 小数字键盘值
static const VK_KEY NUMPAD_1, NUMPAD_2, NUMPAD_3, NUMPAD_4, NUMPAD_5, NUMPAD_6, NUMPAD_7, NUMPAD_8, NUMPAD_9, NUMPAD_0;
// 控制键值
static const VK_KEY Enter, Space, Up, Down, Left, Right, Esc, Shift, LShift, RShift, Ctrl, LCtrl, RCtrl;
// F 键值
static const VK_KEY F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12;
private:
static void __exec();
protected:
bool m_bRunning;
bool m_bWaiting;
TString m_sName;
KEY_CALLBACK m_callback;
Scene * m_pParentScene;
};
class FontStyle :
public Object
{
friend Text;
public:
FontStyle();
/**
* 使用 [字体名称、字号、粗细、字宽、斜体、下划线、删除线、字符串书写角度、
* 每个字符书写角度、抗锯齿] 属性创建字体样式
*/
FontStyle(LPCTSTR fontfamily, LONG height = 18, LONG weight = 0, LONG width = 0,
bool italic = 0, bool underline = 0, bool strikeout = 0, LONG escapement = 0,
LONG orientation = 0, bool quality = true);
virtual ~FontStyle();
// 获取默认字体
static FontStyle * getDefault();
// 设置字符平均高度
void setHeight(LONG value);
// 设置字符平均宽度0表示自适应
void setWidth(LONG value);
// 设置字体
void setFontFamily(LPCTSTR value);
// 设置字符笔画粗细范围0~1000默认为0
void setWeight(LONG value);
// 设置斜体
void setItalic(bool value);
// 设置下划线
void setUnderline(bool value);
// 设置删除线
void setStrikeOut(bool value);
// 设置字符串的书写角度单位0.1度默认为0
void setEscapement(LONG value);
// 设置每个字符的书写角度单位0.1度默认为0
void setOrientation(LONG value);
// 设置字体抗锯齿默认为true
void setQuality(bool value);
protected:
LOGFONT m_font;
};
class FontWeight
{
public:
static const LONG dontcare; // 粗细值 0
static const LONG thin; // 粗细值 100
static const LONG extraLight; // 粗细值 200
static const LONG light; // 粗细值 300
static const LONG normal; // 粗细值 400
static const LONG regular; // 粗细值 400
static const LONG medium; // 粗细值 500
static const LONG demiBlod; // 粗细值 600
static const LONG blod; // 粗细值 700
static const LONG extraBold; // 粗细值 800
static const LONG black; // 粗细值 900
static const LONG heavy; // 粗细值 900
};
class Color
{
public:
static const COLORREF black; // 黑色
static const COLORREF blue; // 蓝色
static const COLORREF green; // 绿色
static const COLORREF cyan; // 青色
static const COLORREF red; // 红色
static const COLORREF magenta; // 紫色
static const COLORREF brown; // 棕色
static const COLORREF lightgray; // 亮灰色
static const COLORREF darkgray; // 深灰色
static const COLORREF lightblue; // 亮蓝色
static const COLORREF lightgreen; // 亮绿色
static const COLORREF lightcyan; // 亮青色
static const COLORREF lightred; // 亮红色
static const COLORREF lightmagenta; // 亮紫色
static const COLORREF yellow; // 亮黄色
static const COLORREF white; // 白色
// 通过红、绿、蓝颜色分量合成颜色
static COLORREF getFromRGB(BYTE r, BYTE g, BYTE b);
// 通过色相、饱和度、亮度合成颜色
static COLORREF getFromHSL(float H, float S, float L);
// 通过色相、饱和度、明度合成颜色
static COLORREF getFromHSV(float H, float S, float V);
// 返回指定颜色中的红色值
static BYTE getRValue(COLORREF color);
// 返回指定颜色中的绿色值
static BYTE getGValue(COLORREF color);
// 返回指定颜色中的蓝色值
static BYTE getBValue(COLORREF color);
// 返回与指定颜色对应的灰度值颜色
static COLORREF getGray(COLORREF color);
};
class Node :
public Object
{
friend Scene;
friend BatchNode;
public:
Node();
Node(CPoint p);
Node(int x, int y);
virtual ~Node();
// 获取节点横坐标
virtual int getX() const;
// 获取节点纵坐标
virtual int getY() const;
// 获取节点坐标
virtual CPoint getPos() const;
// 设置节点横坐标
virtual void setX(int x);
// 设置节点纵坐标
virtual void setY(int y);
// 设置节点横纵坐标
virtual void setPos(int x, int y);
// 设置节点横纵坐标
virtual void setPos(CPoint p);
// 移动节点
virtual void move(int x, int y);
// 设置节点横纵坐标
virtual void move(CVector v);
// 节点是否显示
virtual bool display() const;
// 设置节点是否显示
virtual void setDisplay(bool value);
// 获取节点绘图顺序
virtual int getZOrder() const;
// 设置节点绘图顺序0为最先绘制显示在最底层
virtual void setZOrder(int z);
// 获取父节点
virtual Node* getParent();
// 设置父节点
virtual void setParent(Node* parent);
// 获取节点所在场景
Scene * getParentScene();
protected:
int m_nZOrder;
bool m_bDisplay;
Scene* m_pScene;
CPoint m_Pos;
Node* m_pParent;
protected:
virtual bool _exec(bool active);
virtual void _onDraw() = 0;
void setParentScene(Scene * scene);
};
class BatchNode :
public Node
{
public:
BatchNode();
virtual ~BatchNode();
// 添加子节点
void add(Node *child, int z_Order = 0);
// 删除子节点
bool del(Node * child);
// 获取子节点数量
int getCount();
// 获取所有子节点
std::vector<Node*> &getChildren();
// 清空所有子节点
void clearAllChildren();
// 设置节点横坐标
virtual void setX(int x) override;
// 设置节点纵坐标
virtual void setY(int y) override;
// 设置节点坐标
virtual void setPos(int x, int y) override;
// 设置节点坐标
virtual void setPos(CPoint p) override;
// 移动节点
virtual void move(int x, int y) override;
// 移动节点
virtual void move(CVector v) override;
protected:
std::vector<Node*> m_vChildren;
protected:
virtual bool _exec(bool active) override;
virtual void _onDraw() override;
};
class Layer :
public BatchNode
{
public:
Layer();
virtual ~Layer();
// 图层是否阻塞消息
int getBlock() const;
// 设置图层是否阻塞消息
void setBlock(bool block);
protected:
bool m_bBlock;
protected:
virtual bool _exec(bool active) override;
};
class RectNode :
public Node
{
public:
RectNode();
~RectNode();
// 判断两节点是否碰撞
virtual bool isCollisionWith(RectNode * rectNode) const;
// 判断点是否在节点内
virtual bool isPointIn(CPoint p) const;
// 设置节点在窗口居中
virtual void setWindowCenter();
// 设置节点在窗口横向居中
virtual void setWindowCenterX();
// 设置节点在窗口纵向居中
virtual void setWindowCenterY();
// 获取节点横坐标
virtual int getX() const override;
// 获取节点纵坐标
virtual int getY() const override;
// 获取节点坐标
virtual CPoint getPos() const override;
// 获取节点宽度
virtual int getWidth() const;
// 获取节点高度
virtual int getHeight() const;
// 获取节点大小
virtual CSize getSize() const;
// 获取节点所在的矩形
virtual CRect getRect() const;
// 设置节点横坐标
virtual void setX(int x) override;
// 设置节点纵坐标
virtual void setY(int y) override;
// 设置节点坐标
virtual void setPos(int x, int y) override;
// 设置节点坐标
virtual void setPos(CPoint p) override;
// 移动节点
virtual void move(int x, int y) override;
// 移动节点
virtual void move(CVector v) override;
// 设置节点宽度
virtual void setWidth(int width);
// 设置节点高度
virtual void setHeight(int height);
// 设置节点大小
virtual void setSize(int width, int height);
// 设置节点大小
virtual void setSize(CSize size);
// 设置节点所在的矩形
virtual void setRect(int x1, int y1, int x2, int y2);
// 设置节点所在的矩形
virtual void setRect(CPoint leftTop, CPoint rightBottom);
// 设置节点所在的矩形
virtual void setRect(CRect rect);
protected:
CRect m_Rect;
};
class Text :
public RectNode
{
friend TextButton;
public:
Text();
// 根据字符串、颜色和字体创建文字
Text(TString text, COLORREF color = Color::white, FontStyle * font = FontStyle::getDefault());
// 根据横纵坐标、字符串、颜色和字体创建文字
Text(int x, int y, TString text, COLORREF color = Color::white, FontStyle * font = FontStyle::getDefault());
virtual ~Text();
// 获取当前颜色
COLORREF getColor() const;
// 获取当前文字
TString getText() const;
// 获取当前字体
FontStyle * getFontStyle();
// 文本是否为空
bool isEmpty() const;
// 设置文字
void setText(TString text);
// 设置文字颜色
void setColor(COLORREF color);
// 设置字体
void setFontStyle(FontStyle * style);
protected:
TString m_sText;
COLORREF m_color;
FontStyle * m_pFontStyle;
protected:
virtual void _onDraw() override;
};
class Image :
public RectNode
{
friend Sprite;
friend ImageButton;
public:
Image();
// 从图片文件获取图像
Image(LPCTSTR ImageFile);
/**
* 从图片文件获取图像
* 参数:图片文件名,图片裁剪坐标,图片裁剪宽度和高度
*/
Image(LPCTSTR ImageFile, int x, int y, int width, int height);
virtual ~Image();
// 获取横向拉伸比例
float getScaleX() const;
// 获取纵向拉伸比例
float getScaleY() const;
// 获取透明度
float getOpacity() const;
/**
* 从图片文件获取图像
* 返回值:图片加载是否成功
*/
bool setImage(LPCTSTR ImageFile);
/**
* 从图片文件获取图像
* 参数:图片文件名,图片裁剪起始坐标,图片裁剪宽度和高度
* 返回值:图片加载是否成功
*/
bool setImage(LPCTSTR ImageFile, int x, int y, int width, int height);
/**
* 从资源文件获取图像,不支持 png
* 返回值:图片加载是否成功
*/
bool setImageFromRes(LPCTSTR pResName);
/**
* 从资源文件获取图像,不支持 png
* 参数:资源名称,图片裁剪坐标,图片裁剪宽度和高度
* 返回值:图片加载是否成功
*/
bool setImageFromRes(LPCTSTR pResName, int x, int y, int width, int height);
// 裁剪图片(裁剪后会恢复 stretch 拉伸)
void crop(int x, int y, int width, int height);
// 将图片拉伸到固定宽高
void stretch(int width, int height);
// 按比例拉伸图片
void setScale(float scaleX, float scaleY);
// 设置透明度,范围 0~1.0f(只对 png 图片生效)
void setOpacity(float value);
// 设置透明色
void setTransparentColor(COLORREF value);
// 重置图片属性
void reset();
// 预加载图片
static bool preload(LPCTSTR fileName, bool fromRes = false);
// 保存游戏截图
static void saveScreenshot();
protected:
CImage* m_pCImage;
CRect m_SrcRect;
BYTE m_nAlpha;
float m_fScaleX;
float m_fScaleY;
protected:
virtual void _onDraw() override;
};
class Sprite :
public RectNode
{
friend BatchSprite;
public:
Sprite();
Sprite(Image * image);
Sprite(LPCTSTR imageFileName);
virtual ~Sprite();
// 判断是否和另一个精灵碰撞
bool isCollisionWith(Sprite * sprite);
// 修改精灵图片
virtual void setImage(Image * image);
// 执行动作
virtual void addAction(Action * action);
// 执行动作
virtual void runAction(Action * action);
// 继续动作
virtual void resumeAction(Action * action);
// 暂停动作
virtual void pauseAction(Action * action);
// 停止动作
virtual void stopAction(Action * action);
// 暂停所有动作
virtual void pauseAllActions();
// 继续所有动作
virtual void resumeAllActions();
// 停止所有动作
virtual void stopAllActions();
virtual float getScaleX() const;
virtual float getScaleY() const;
virtual float getOpacity() const;
virtual void setScale(float scaleX, float scaleY);
virtual void setOpacity(float opacity);
protected:
float m_fScaleX;
float m_fScaleY;
BYTE m_nAlpha;
Image * m_pImage;
protected:
bool _exec(bool active) override;
void _onDraw() override;
};
class BatchSprite :
public Sprite
{
public:
BatchSprite();
virtual ~BatchSprite();
// 添加精灵
void add(Sprite * sprite, int z_Order = 0);
// 删除精灵
bool delSprite(Sprite * child);
// 获取精灵数量
int getCount();
// 获取所有精灵
std::vector<Sprite*> &getChildren();
// 删除所有精灵
void clearAllSprites();
// 判断是否有精灵产生碰撞
// 返回值:若有碰撞,返回第一个产生碰撞的精灵,否则返回空指针
Sprite * isCollisionWith(Sprite * sprite);
// 判断点是否在精灵内部
// 返回值:若这个点在任意一个精灵内部,返回这个精灵,否则返回空指针
Sprite * isPointIn(CPoint point);
// 所有精灵同时执行一段动画
virtual void addAction(Action * action) override;
// 同时修改所有精灵的图片
virtual void setImage(Image * image) override;
// 设置节点横坐标
virtual void setX(int x) override;
// 设置节点纵坐标
virtual void setY(int y) override;
// 设置节点坐标
virtual void setPos(int x, int y) override;
// 设置节点坐标
virtual void setPos(CPoint p) override;
// 移动节点
virtual void move(int x, int y) override;
// 移动节点
virtual void move(CVector v) override;
virtual float getScaleX() const override;
virtual float getScaleY() const override;
virtual float getOpacity() const override;
virtual void setScale(float scaleX, float scaleY) override;
virtual void setOpacity(float opacity) override;
protected:
std::vector<Sprite*> m_vSprites;
protected:
bool _exec(bool active) override;
void _onDraw() override;
};
class MouseNode :
public RectNode
{
public:
MouseNode();
virtual ~MouseNode();
// 鼠标是否移入
virtual bool isMouseIn();
// 鼠标是否选中
virtual bool isSelected();
// 设置回调函数
virtual void setClickedCallback(const CLICK_CALLBACK & callback);
// 设置回调函数
virtual void setMouseInCallback(const CLICK_CALLBACK & callback);
// 设置回调函数
virtual void setMouseOutCallback(const CLICK_CALLBACK & callback);
// 设置回调函数
virtual void setSelectCallback(const CLICK_CALLBACK & callback);
// 设置回调函数
virtual void setUnselectCallback(const CLICK_CALLBACK & callback);
// 重置状态
virtual void reset();
// 设置节点是否阻塞鼠标消息
void setBlock(bool block);
protected:
bool m_bTarget;
bool m_bBlock;
enum Status { NORMAL, MOUSEIN, SELECTED } m_eStatus;
CLICK_CALLBACK m_OnMouseInCallback;
CLICK_CALLBACK m_OnMouseOutCallback;
CLICK_CALLBACK m_OnSelectCallback;
CLICK_CALLBACK m_OnUnselectCallback;
CLICK_CALLBACK m_ClickCallback;
protected:
virtual bool _exec(bool active) override;
virtual void _onDraw() override;
// 重写这个方法可以自定义按钮的判断方法
virtual bool _isMouseIn();
// 切换状态
virtual void _setStatus(Status status);
// 正常状态
virtual void _onNormal() = 0;
// 鼠标移入时
virtual void _onMouseIn() = 0;
// 鼠标选中时
virtual void _onSelected() = 0;
};
class Button :
public MouseNode
{
public:
Button();
virtual ~Button();
// 按钮是否启用
virtual bool isEnable();
// 设置是否启用
virtual void setEnable(bool enable);
// 设置按钮横坐标
virtual void setX(int x) override;
// 设置按钮纵坐标
virtual void setY(int y) override;
// 设置按钮坐标
virtual void setPos(int x, int y) override;
// 设置按钮坐标
virtual void setPos(CPoint p) override;
// 移动按钮
virtual void move(int x, int y) override;
// 移动按钮
virtual void move(CVector v) override;
protected:
bool m_bEnable;
protected:
virtual bool _exec(bool active) override;
virtual void _onDraw() override;
virtual void _resetPosition() = 0;
virtual void _onNormal() = 0;
virtual void _onMouseIn() = 0;
virtual void _onSelected() = 0;
virtual void _onDisable() = 0;
};
class TextButton :
public Button
{
public:
TextButton();
TextButton(TString text);
TextButton(Text * text);
virtual ~TextButton();
// 设置按钮文字
void setNormal(Text * text);
// 设置鼠标移入时的按钮文字
void setMouseIn(Text * text);
// 设置鼠标选中时的按钮文字
void setSelected(Text * text);
// 设置按钮禁用时的按钮文字
void setUnable(Text * text);
protected:
Text * m_pNormalText;
Text * m_pMouseInText;
Text * m_pSelectedText;
Text * m_pUnableText;
protected:
virtual void _resetPosition() override;
virtual void _setStatus(Status status) override;
virtual void _onNormal() override;
virtual void _onMouseIn() override;
virtual void _onSelected() override;
virtual void _onDisable() override;
};
class ImageButton :
public Button
{
public:
ImageButton();
ImageButton(LPCTSTR image);
ImageButton(Image * image);
virtual ~ImageButton();
// 设置按钮图片
void setNormal(Image * image);
// 设置鼠标移入时的按钮图片
void setMouseIn(Image * image);
// 设置鼠标选中时的按钮图片
void setSelected(Image * image);
// 设置按钮禁用时的按钮图片
void setUnable(Image * image);
protected:
Image * m_pNormalImage;
Image * m_pMouseInImage;
Image * m_pSelectedImage;
Image * m_pUnableImage;
protected:
virtual void _resetPosition() override;
virtual void _setStatus(Status status) override;
virtual void _onNormal() override;
virtual void _onMouseIn() override;
virtual void _onSelected() override;
virtual void _onDisable() override;
};
class Shape :
public Node
{
public:
Shape();
virtual ~Shape();
// 形状填充样式
enum STYLE { ROUND, SOLID, FILL } m_eStyle;
// 获取形状的填充颜色
COLORREF getFillColor() const;
// 获取形状的线条颜色
COLORREF getLineColor() const;
// 设置填充颜色
void setFillColor(COLORREF color);
// 设置线条颜色
void setLineColor(COLORREF color);
// 设置填充样式
void setStyle(STYLE style);
protected:
COLORREF fillColor;
COLORREF lineColor;
protected:
virtual void _onDraw() override;
virtual void solidShape() = 0;
virtual void fillShape() = 0;
virtual void roundShape() = 0;
};
class Rect :
public Shape
{
public:
Rect();
Rect(int x, int y, int width, int height);
virtual ~Rect();
// 获取矩形宽度
int getWidth() const;
// 获取矩形高度
int getHeight() const;
// 设置矩形宽度
void setWidth(int width);
// 设置矩形高度
void setHeight(int height);
// 设置矩形大小
void setSize(int width, int height);
protected:
CSize m_Size;
protected:
virtual void solidShape() override;
virtual void fillShape() override;
virtual void roundShape() override;
};
class Circle :
public Shape
{
public:
Circle();
Circle(int x, int y, int radius);
virtual ~Circle();
// 获取圆形半径
int getRadius() const;
// 设置圆形半径
void setRadius(int m_nRadius);
protected:
int m_nRadius;
protected:
virtual void solidShape() override;
virtual void fillShape() override;
virtual void roundShape() override;
};
class Action :
public Object
{
friend Sprite;
friend ActionManager;
friend ActionTwo;
friend ActionNeverStop;
friend ActionSequence;
public:
Action();
virtual ~Action();
// 获取动作运行状态
virtual bool isRunning();
// 获取动作结束状态
virtual bool isEnding();
// 继续动作
virtual void start();
// 继续动作
virtual void resume();
// 暂停动作
virtual void pause();
// 停止动作
virtual void stop();
// 进入等待状态
virtual void wait();
// 唤醒
virtual void notify();
// 设置动作每一帧时间间隔
virtual void setInterval(LONGLONG milliSeconds);
// 获取一个新的拷贝动作
virtual Action * copy() const = 0;
// 获取一个新的逆向动作
virtual Action * reverse() const;
// 获取执行该动作的目标
virtual Sprite * getTarget();
protected:
bool m_bRunning;
bool m_bWaiting;
bool m_bEnding;
bool m_bInit;
Sprite * m_pTargetSprite;
Scene * m_pParentScene;
LONGLONG m_nAnimationInterval;
std::chrono::steady_clock::time_point m_nLast;
protected:
virtual void _init();
virtual void _exec(std::chrono::steady_clock::time_point nNow) = 0;
virtual void _reset();
};
class Animation :
public Action
{
public:
Animation(float duration);
virtual ~Animation();
protected:
LONGLONG m_nDuration;
LONGLONG m_nTotalDuration;
protected:
bool _isEnd() const;
bool _isDelayEnough(std::chrono::steady_clock::time_point nNow);
virtual void _init() override;
virtual void _reset() override;
};
class ActionMoveBy :
public Animation
{
public:
ActionMoveBy(float duration, CVector vec);
virtual ~ActionMoveBy();
virtual ActionMoveBy * copy() const override;
virtual ActionMoveBy * reverse() const override;
protected:
CPoint m_BeginPos;
CVector m_MoveVector;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionMoveTo :
public ActionMoveBy
{
public:
ActionMoveTo(float duration, CPoint pos);
virtual ~ActionMoveTo();
virtual ActionMoveTo * copy() const override;
protected:
CPoint m_EndPos;
protected:
virtual void _init() override;
virtual void _reset() override;
};
class ActionScaleBy :
public Animation
{
public:
ActionScaleBy(float duration, float scaleX, float scaleY);
virtual ~ActionScaleBy();
virtual ActionScaleBy * copy() const override;
virtual ActionScaleBy * reverse() const override;
protected:
float m_nBeginScaleX;
float m_nBeginScaleY;
float m_nVariationX;
float m_nVariationY;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionScaleTo :
public ActionScaleBy
{
public:
ActionScaleTo(float duration, float scaleX, float scaleY);
virtual ~ActionScaleTo();
virtual ActionScaleTo * copy() const override;
protected:
float m_nEndScaleX;
float m_nEndScaleY;
protected:
virtual void _init() override;
virtual void _reset() override;
};
class ActionOpacityBy :
public Animation
{
public:
ActionOpacityBy(float duration, float opacity);
virtual ~ActionOpacityBy();
virtual ActionOpacityBy * copy() const override;
virtual ActionOpacityBy * reverse() const override;
protected:
float m_nBeginVal;
float m_nVariation;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionOpacityTo :
public ActionOpacityBy
{
public:
ActionOpacityTo(float duration, float opacity);
virtual ~ActionOpacityTo();
virtual ActionOpacityTo * copy() const override;
protected:
float m_nEndVal;
protected:
virtual void _init() override;
virtual void _reset() override;
};
class ActionFadeIn :
public ActionOpacityTo
{
public:
ActionFadeIn(float duration) : ActionOpacityTo(duration, 1) {}
};
class ActionFadeOut :
public ActionOpacityTo
{
public:
ActionFadeOut(float duration) : ActionOpacityTo(duration, 0) {}
};
class ActionTwo :
public Action
{
public:
ActionTwo(Action * actionFirst, Action * actionSecond);
virtual ~ActionTwo();
virtual ActionTwo * copy() const override;
virtual ActionTwo * reverse(bool actionReverse = true) const;
protected:
Action * m_FirstAction;
Action * m_SecondAction;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionSequence :
public Action
{
public:
ActionSequence();
ActionSequence(int number, Action * action1, ...);
virtual ~ActionSequence();
void addAction(Action * action);
virtual ActionSequence * copy() const override;
virtual ActionSequence * reverse(bool actionReverse = true) const;
protected:
UINT m_nActionIndex;
std::vector<Action*> m_vActions;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionDelay :
public Action
{
public:
ActionDelay(float duration);
virtual ~ActionDelay();
virtual ActionDelay * copy() const override;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionNeverStop :
public Action
{
public:
ActionNeverStop(Action * action);
virtual ~ActionNeverStop();
virtual ActionNeverStop * copy() const override;
protected:
Action * m_Action;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionFrames :
public Action
{
public:
ActionFrames();
ActionFrames(LONGLONG frameDelay);
~ActionFrames();
void addFrame(Image * frame);
virtual ActionFrames * copy() const override;
virtual ActionFrames * reverse() const override;
protected:
UINT m_nFrameIndex;
std::vector<Image*> m_vFrames;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class ActionCallback :
public Action
{
public:
ActionCallback(const std::function<void()>& callback);
~ActionCallback();
virtual ActionCallback * copy() const override;
protected:
std::function<void()> m_Callback;
protected:
virtual void _init() override;
virtual void _exec(std::chrono::steady_clock::time_point nNow) override;
virtual void _reset() override;
};
class FileUtils
{
public:
// 获取系统的 AppData\Local 路径
static TString getLocalAppDataPath();
// 获取默认的保存路径
static TString getDefaultSavePath();
// 保存 int 型的值
static void saveInt(LPCTSTR key, int value);
// 保存 double 型的值
static void saveDouble(LPCTSTR key, double value);
// 保存 字符串 型的值(不要在 Unicode 字符集下保存中文字符)
static void saveString(LPCTSTR key, TString value);
// 获取 int 型的值(若不存在则返回 default 参数的值)
static int getInt(LPCTSTR key, int default);
// 获取 double 型的值(若不存在则返回 default 参数的值)
static double getDouble(LPCTSTR key, double default);
// 获取 字符串 型的值(若不存在则返回 default 参数的值)
static TString geTString(LPCTSTR key, TString default);
// 得到文件扩展名(小写)
static TString getFileExtension(const TString& filePath);
/**
* 打开保存文件对话框,得到有效保存路径返回 true
* 参数:返回文件路径的字符串,窗口标题,设置扩展名过滤,设置默认扩展名
*/
static bool getSaveFilePath(TString& path, LPCTSTR title = _T("保存到"), LPCTSTR defExt = NULL);
};
class MusicUtils
{
public:
// 播放背景音乐
static void playBackgroundMusic(TString pszFilePath, bool bLoop = true);
// 停止背景音乐
static void stopBackgroundMusic(bool bReleaseData = false);
// 暂停背景音乐
static void pauseBackgroundMusic();
// 继续播放背景音乐
static void resumeBackgroundMusic();
// 从头播放背景音乐
static void rewindBackgroundMusic();
// 背景音乐是否正在播放
static bool isBackgroundMusicPlaying();
// 设置背景音乐音量0 ~ 1.0f
static void setBackgroundMusicVolume(float volume);
// 播放音效
static unsigned int playMusic(TString pszFilePath, bool loop = false);
// 停止音效
static void stopMusic(unsigned int nSoundId);
// 预加载音效
static void preloadMusic(TString pszFilePath);
// 暂停音效
static void pauseMusic(unsigned int nSoundId);
// 继续播放音效
static void resumeMusic(unsigned int nSoundId);
// 卸载音效
static void unloadMusic(LPCTSTR pszFilePath);
// 设置特定音乐的音量0 ~ 1.0f
static void setVolume(TString pszFilePath, float volume);
// 暂停所有音乐
static void pauseAllMusics();
// 继续播放所有音乐
static void resumeAllMusics();
// 停止所有音乐
static void stopAllMusics();
// 停止所有音乐,并释放内存
static void end();
// 设置总音量0 ~ 1.0f
static void setVolume(float volume);
};
class Timer
{
friend App;
public:
Timer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback);
~Timer();
// 启动定时器
void start();
// 停止定时器
void stop();
// 进入等待状态
void wait();
// 唤醒
void notify();
// 定时器是否正在运行
bool isRunning();
// 设置间隔时间
void setInterval(LONGLONG milliSeconds);
// 设置回调函数
void setCallback(const TIMER_CALLBACK& callback);
// 设置定时器名称
void setName(TString name);
// 获取定时器间隔时间
LONGLONG getInterval() const;
// 获取定时器名称
TString getName() const;
// 添加定时器
static void addTimer(Timer * timer);
// 添加定时器
static void addTimer(TString name, const TIMER_CALLBACK & callback);
// 添加定时器
static void addTimer(TString name, LONGLONG milliSeconds, const TIMER_CALLBACK & callback);
// 启动特定定时器
static void startTimer(TString name);
// 停止特定定时器
static void stopTimer(TString name);
// 删除特定定时器
static void delTimer(TString name);
// 删除所有定时器
static void clearAllTimers();
// 继续绑定在场景上的所有定时器
static void notifyAllSceneTimers(Scene* scene);
// 停止绑定在场景上的所有定时器
static void waitAllSceneTimers(Scene* scene);
// 清除绑定在场景上的所有定时器
static void clearAllSceneTimers(Scene* scene);
protected:
bool m_bRunning;
bool m_bWaiting;
TString m_sName;
TIMER_CALLBACK m_callback;
LONGLONG m_nAnimationInterval;
Scene * m_pParentScene;
std::chrono::steady_clock::time_point m_nLast;
private:
static void __exec();
};
class ActionManager
{
friend App;
friend Sprite;
public:
// 继续一个特定的动作
static void startAction(Action * action);
// 继续一个特定的动作
static void resumeAction(Action * action);
// 暂停一个特定的动作
static void pauseAction(Action * action);
// 停止一个特定的动作
static void stopAction(Action * action);
// 继续一个 Sprite 的所有动作
static void startSpriteAllActions(Sprite * sprite);
// 继续一个 Sprite 的所有动作
static void resumeSpriteAllActions(Sprite * sprite);
// 暂停一个 Sprite 的所有动作
static void pauseSpriteAllActions(Sprite * sprite);
// 停止一个 Sprite 的所有动作
static void stopSpriteAllActions(Sprite * sprite);
// 继续当前存在的所有动作
static void startAllActions();
// 继续当前存在的所有动作
static void resumeAllActions();
// 暂停当前存在的所有动作
static void pauseAllActions();
// 停止当前存在的所有动作
static void stopAllActions();
// 删除当前存在的所有动作
static void clearAllActions();
// 继续绑定在场景上的动作
static void notifyAllSceneActions(Scene* scene);
// 暂停绑定在场景上的动作
static void waitAllSceneActions(Scene* scene);
// 停止绑定在场景上的动作
static void stopAllSceneActions(Scene* scene);
private:
static void __exec();
// 将一个动作添加进动作管理器
static void addAction(Action * action);
};
class Math
{
public:
// 取得整型范围内的一个随机数
template<typename T>
static T randomInt(T min, T max)
{
std::uniform_int_distribution<T> dist(min, max);
return dist(getEngine());
}
// 取得浮点数类型范围内的一个随机数
template<typename T>
static T randomReal(T min, T max)
{
std::uniform_real_distribution<T> dist(min, max);
return dist(getEngine());
}
// 获取随机数产生器
static std::default_random_engine &getEngine();
};
} // End of easy2d namespace
// Functions Declare
template<typename T>
inline void SafeRelease(T* p) { if (p) p->release(); }
template<typename T>
inline void SafeDelete(T* p) { if (p) delete p; }
template<typename T>
inline T random(T min, T max) { return easy2d::Math::randomInt(min, max); }
inline float random(float min, float max) { return easy2d::Math::randomReal(min, max); }
inline double random(double min, double max) { return easy2d::Math::randomReal(min, max); }
inline long double random(long double min, long double max) { return easy2d::Math::randomReal(min, max); }
using namespace easy2d;