Magic_Game/core/e2dcomponent.h

1203 lines
18 KiB
C
Raw Normal View History

#pragma once
2018-09-05 13:17:07 +08:00
#include "e2dcommon.h"
2018-08-14 00:41:59 +08:00
#include "e2devent.h"
namespace e2d
{
2018-02-03 22:04:43 +08:00
class Action;
2018-09-05 13:17:07 +08:00
class Scene;
2018-08-19 17:46:37 +08:00
// <20><>ͼ<EFBFBD>ӿ<EFBFBD>
class Drawable
{
public:
// <20><>Ⱦͼ<C8BE><CDBC>
2018-09-04 22:42:34 +08:00
virtual void Draw() const = 0;
2018-08-19 17:46:37 +08:00
};
// <20><><EFBFBD>½ӿ<C2BD>
class Updatable
{
public:
// <20><>Ⱦͼ<C8BE><CDBC>
2018-09-04 22:42:34 +08:00
virtual void Update() = 0;
2018-08-19 17:46:37 +08:00
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
class KeyEventHandler
{
public:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2018-09-04 22:42:34 +08:00
virtual void Handle(KeyEvent e) = 0;
2018-08-19 17:46:37 +08:00
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
class MouseEventHandler
{
public:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2018-09-04 22:42:34 +08:00
virtual void Handle(MouseEvent e) = 0;
2018-08-19 17:46:37 +08:00
};
// <20><>ײ<EFBFBD><D7B2>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
class CollisionHandler
{
public:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>Ϣ
2018-09-04 22:42:34 +08:00
virtual void Handle(Collision collision) = 0;
2018-08-19 17:46:37 +08:00
};
// <20>ڵ<EFBFBD>
class Node :
2018-07-07 01:43:41 +08:00
public Ref
{
2018-05-24 00:58:16 +08:00
friend class Collider;
public:
// <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
struct Property
{
2018-09-04 22:42:34 +08:00
Point pos; // <20><><EFBFBD><EFBFBD>
Size size; // <20><>С
Point anchor; // ê<><C3AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Point scale; // <20><><EFBFBD><EFBFBD>
Point skew; // <20><>б<EFBFBD>Ƕ<EFBFBD>
2018-08-19 17:46:37 +08:00
float rotation; // <20><>ת<EFBFBD>Ƕ<EFBFBD>
Property operator+ (Property const & prop) const;
Property operator- (Property const & prop) const;
static const Property Origin;
};
public:
2018-09-04 22:42:34 +08:00
typedef std::vector<Node*> Nodes;
2018-09-05 00:08:03 +08:00
typedef std::vector<Action*> Actions;
2018-09-04 22:42:34 +08:00
Node();
virtual ~Node();
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʾ״̬
2018-09-04 22:42:34 +08:00
bool IsVisible() const;
2018-03-06 09:56:17 +08:00
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
const String& GetName() const;
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>Ƶ<EFBFBD> Hash ֵ
2018-09-04 22:42:34 +08:00
size_t GetHashName() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ͼ˳<CDBC><CBB3>
2018-09-04 22:42:34 +08:00
int GetOrder() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetPosX() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetPosY() const;
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
Point GetPos() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetWidth() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5>߶<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetHeight() const;
2017-10-15 02:46:24 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetRealWidth() const;
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5>߶ȣ<DFB6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetRealHeight() const;
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
2018-09-04 22:42:34 +08:00
Size GetRealSize() const;
2017-10-17 21:22:25 +08:00
2018-08-23 16:58:32 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ê<EFBFBD><C3AA>
2018-09-04 22:42:34 +08:00
float GetAnchorX() const;
2018-08-23 16:58:32 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ê<EFBFBD><C3AA>
2018-09-04 22:42:34 +08:00
float GetAnchorY() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>С
2018-09-04 22:42:34 +08:00
Size GetSize() const;
2017-10-17 21:22:25 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetScaleX() const;
2017-10-15 02:46:24 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetScaleY() const;
2017-10-15 02:46:24 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ƕ<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetSkewX() const;
2017-10-15 02:46:24 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ƕ<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetSkewY() const;
2017-10-15 02:46:24 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetRotation() const;
2017-10-15 02:46:24 +08:00
// <20><>ȡ<EFBFBD>ڵ<EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetOpacity() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
Property GetProperty() const;
2018-07-13 00:45:39 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
Property GetExtrapolate() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ײ<EFBFBD><D7B2>
2018-09-04 22:42:34 +08:00
Collider * GetCollider();
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڵ<EFBFBD>
2018-09-04 22:42:34 +08:00
Node * GetParent() const;
// <20><>ȡ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>
2018-09-04 22:42:34 +08:00
Scene * GetParentScene() const;
// <20><><EFBFBD>ýڵ<C3BD><DAB5>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ
2018-09-04 22:42:34 +08:00
void SetVisible(
bool value
);
2017-10-14 11:40:47 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetName(
const String& name
2017-10-14 18:43:32 +08:00
);
2017-10-14 11:40:47 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetPosX(
2018-07-28 20:06:27 +08:00
float x
);
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetPosY(
2018-07-28 20:06:27 +08:00
float y
);
2017-10-17 21:22:25 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetPos(
const Point & point
2017-10-17 21:22:25 +08:00
);
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetPos(
2018-07-28 20:06:27 +08:00
float x,
float y
);
// <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetPosFixed(
bool fixed
);
// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Move(
2018-07-28 20:06:27 +08:00
float x,
float y
);
2017-10-17 21:22:25 +08:00
// <20>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Move(
const Point & v
2017-10-17 21:22:25 +08:00
);
2017-10-15 02:46:24 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>ͼ˳<CDBC><CBB3>
// Ĭ<><C4AC>Ϊ 0
2018-09-04 22:42:34 +08:00
virtual void SetOrder(
2017-10-15 02:46:24 +08:00
int order
);
// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
// Ĭ<><C4AC>Ϊ 1.0
2018-09-04 22:42:34 +08:00
virtual void SetScaleX(
float scale_x
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
// Ĭ<><C4AC>Ϊ 1.0
2018-09-04 22:42:34 +08:00
virtual void SetScaleY(
float scale_y
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
// Ĭ<><C4AC>Ϊ (1.0, 1.0)
2018-09-04 22:42:34 +08:00
virtual void SetScale(
float scale_x,
float scale_y
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
// Ĭ<><C4AC>Ϊ 1.0
2018-09-04 22:42:34 +08:00
virtual void SetScale(
2018-07-28 20:06:27 +08:00
float scale
2017-10-15 02:46:24 +08:00
);
// <20><><EFBFBD>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ƕ<EFBFBD>
// Ĭ<><C4AC>Ϊ 0
2018-09-04 22:42:34 +08:00
virtual void SetSkewX(
float skew_x
2017-10-15 02:46:24 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ƕ<EFBFBD>
// Ĭ<><C4AC>Ϊ 0
2018-09-04 22:42:34 +08:00
virtual void SetSkewY(
float skew_y
2017-10-15 02:46:24 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ƕ<EFBFBD>
// Ĭ<><C4AC>Ϊ (0, 0)
2018-09-04 22:42:34 +08:00
virtual void SetSkew(
float skew_x,
float skew_y
2017-10-15 02:46:24 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
// Ĭ<><C4AC>Ϊ 0
2018-09-04 22:42:34 +08:00
virtual void SetRotation(
2018-07-28 20:06:27 +08:00
float rotation
2017-10-15 02:46:24 +08:00
);
// <20><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>
// Ĭ<><C4AC>Ϊ 1.0, <20><>Χ [0, 1]
2018-09-04 22:42:34 +08:00
virtual void SetOpacity(
2018-07-28 20:06:27 +08:00
float opacity
);
2018-08-23 16:58:32 +08:00
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>λ<EFBFBD><CEBB>
// Ĭ<><C4AC>Ϊ 0, <20><>Χ [0, 1]
2018-09-04 22:42:34 +08:00
virtual void SetAnchorX(
float anchor_x
);
2018-08-23 16:58:32 +08:00
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// Ĭ<><C4AC>Ϊ 0, <20><>Χ [0, 1]
2018-09-04 22:42:34 +08:00
virtual void SetAnchorY(
float anchor_y
);
2018-08-23 16:58:32 +08:00
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>λ<EFBFBD><CEBB>
// Ĭ<><C4AC>Ϊ (0, 0), <20><>Χ [0, 1]
2018-09-04 22:42:34 +08:00
virtual void SetAnchor(
float anchor_x,
float anchor_y
);
2018-03-01 19:28:22 +08:00
// <20>޸Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetWidth(
2018-07-28 20:06:27 +08:00
float width
2018-03-01 19:28:22 +08:00
);
// <20>޸Ľڵ<C4BD><DAB5>߶<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetHeight(
2018-07-28 20:06:27 +08:00
float height
2018-03-01 19:28:22 +08:00
);
// <20>޸Ľڵ<C4BD><DAB5><EFBFBD>С
2018-09-04 22:42:34 +08:00
virtual void SetSize(
2018-07-28 20:06:27 +08:00
float width,
float height
2018-03-01 19:28:22 +08:00
);
// <20>޸Ľڵ<C4BD><DAB5><EFBFBD>С
2018-09-04 22:42:34 +08:00
virtual void SetSize(
2018-03-01 19:28:22 +08:00
Size size
);
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetProperty(
Property prop
);
// <20><><EFBFBD>û<EFBFBD><C3BB>ر<EFBFBD><D8B1><EFBFBD>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void SetClipEnabled(
bool enabled
);
2018-09-01 23:00:08 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>Ե<EFBFBD><D4B5>ɫ
2018-09-04 22:42:34 +08:00
virtual void SetBorderColor(
2018-09-01 23:00:08 +08:00
const Color& color
);
2018-08-23 16:58:32 +08:00
// <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ڽڵ<DABD><DAB5><EFBFBD>
2018-09-04 22:42:34 +08:00
bool ContainsPoint(
2018-08-23 16:58:32 +08:00
const Point& point
);
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>
2018-09-04 22:42:34 +08:00
bool Intersects(
2018-08-23 16:58:32 +08:00
Node * node
);
2017-10-14 11:40:47 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
void AddChild(
Node * child,
2018-09-04 22:42:34 +08:00
int order = 0 /* <20><>Ⱦ˳<C8BE><CBB3> */
);
// <20><><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
void AddChild(
const Nodes& nodes, /* <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
int order = 0 /* <20><>Ⱦ˳<C8BE><CBB3> */
2017-10-14 18:43:32 +08:00
);
2017-10-14 11:40:47 +08:00
2018-08-23 16:58:32 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
Nodes GetChildren(
2018-08-23 16:58:32 +08:00
const String& name
) const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
Node* GetChild(
2018-08-23 16:58:32 +08:00
const String& name
) const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
const Nodes& GetAllChildren() const;
2018-08-23 16:58:32 +08:00
// <20><>ȡ<EFBFBD>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
int GetChildrenCount() const;
2018-08-23 16:58:32 +08:00
// <20>Ƴ<EFBFBD><C6B3>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
bool RemoveChild(
2018-08-23 16:58:32 +08:00
Node * child
);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ӽڵ<D3BD>
2018-09-04 22:42:34 +08:00
void RemoveChildren(
const String& child_name
2018-08-23 16:58:32 +08:00
);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>нڵ<D0BD>
2018-09-04 22:42:34 +08:00
void RemoveAllChildren();
2018-08-23 16:58:32 +08:00
// <20>Ӹ<EFBFBD><D3B8>ڵ<EFBFBD><DAB5>Ƴ<EFBFBD>
2018-09-04 22:42:34 +08:00
void RemoveFromParent();
2018-08-23 16:58:32 +08:00
2018-05-10 00:58:43 +08:00
// ִ<>ж<EFBFBD><D0B6><EFBFBD>
2018-09-04 22:42:34 +08:00
void RunAction(
Action * action
2017-10-19 00:50:04 +08:00
);
2018-05-10 00:58:43 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void ResumeAction(
const String& name
);
2018-05-10 00:58:43 +08:00
// <20><>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void PauseAction(
const String& name
);
2018-05-10 00:58:43 +08:00
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void StopAction(
const String& name
2018-03-06 09:56:17 +08:00
);
2018-05-10 00:58:43 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void ResumeAllActions();
2017-10-21 19:09:31 +08:00
2018-05-10 00:58:43 +08:00
// <20><>ͣ<EFBFBD><CDA3><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
2018-09-04 22:42:34 +08:00
void PauseAllActions();
2017-10-21 19:09:31 +08:00
2018-05-10 00:58:43 +08:00
// ֹͣ<CDA3><D6B9><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
2018-09-04 22:42:34 +08:00
void StopAllActions();
2017-10-21 19:09:31 +08:00
2018-09-05 00:08:03 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
const Actions& GetAllActions() const;
// ˢ<><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void UpdateActionsTime();
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2018-09-04 22:42:34 +08:00
virtual bool Dispatch(
const MouseEvent& e,
bool handled
);
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2018-09-04 22:42:34 +08:00
virtual bool Dispatch(
const KeyEvent& e,
bool handled
);
2018-08-13 23:47:10 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Visit();
2018-08-15 00:06:03 +08:00
protected:
E2D_DISABLE_COPY(Node);
2017-10-29 23:48:32 +08:00
2018-09-01 23:00:08 +08:00
// <20><>Ⱦ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ե
2018-09-04 22:42:34 +08:00
void DrawBorder();
2018-09-01 23:00:08 +08:00
// <20><>Ⱦ<EFBFBD><C8BE>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void DrawCollider();
2018-09-01 23:00:08 +08:00
2017-10-17 21:22:25 +08:00
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetParentScene(
Scene * scene
2017-10-17 21:22:25 +08:00
);
// <20>ӽڵ<D3BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SortChildren();
2018-08-19 17:46:37 +08:00
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void UpdateTransform();
2018-08-19 17:46:37 +08:00
2018-02-04 21:24:27 +08:00
// <20><><EFBFBD>½ڵ<C2BD>͸<EFBFBD><CDB8><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void UpdateOpacity();
2018-05-19 00:00:12 +08:00
2018-09-05 00:08:03 +08:00
// <20><><EFBFBD><EFBFBD><C2B6><EFBFBD>
void UpdateActions();
protected:
2018-09-04 22:42:34 +08:00
String name_;
size_t hash_name_;
Point pos_;
Size size_;
Point scale_;
Point anchor_;
Point skew_;
float rotation_;
float display_opacity_;
float real_opacity_;
int order_;
bool visible_;
bool clip_enabled_;
bool need_sort_;
bool need_transform_;
bool fixed_position_;
Collider collider_;
Scene * parent_scene_;
Node * parent_;
Property extrapolate_;
Color border_color_;
2018-09-05 00:08:03 +08:00
Actions actions_;
2018-09-04 22:42:34 +08:00
Nodes children_;
ID2D1Geometry* border_;
D2D1::Matrix3x2F initial_matrix_;
D2D1::Matrix3x2F final_matrix_;
};
2017-10-14 18:43:32 +08:00
2018-08-13 23:47:10 +08:00
// <20><><EFBFBD><EFBFBD>
class Scene :
public Node
{
public:
Scene();
virtual ~Scene();
// <20><><EFBFBD><EFBFBD><EBB3A1>
2018-09-04 22:42:34 +08:00
virtual void OnEnter() {}
2018-08-13 23:47:10 +08:00
// <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void OnExit() {}
2018-08-13 23:47:10 +08:00
// <20>رմ<D8B1><D5B4><EFBFBD>
// ˵<><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false <20><><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD>ڹر<DAB9>
2018-09-04 22:42:34 +08:00
virtual bool OnCloseWindow() { return true; }
2018-08-13 23:47:10 +08:00
2018-09-01 23:00:08 +08:00
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ؽڵ<D8BD><DAB5><EFBFBD>Ե
2018-08-19 15:11:20 +08:00
// Ĭ<>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void ShowBorder(
2018-08-19 15:11:20 +08:00
bool visible
);
2018-09-01 23:00:08 +08:00
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>
// Ĭ<>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void ShowCollider(
2018-08-19 15:11:20 +08:00
bool visible
);
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Visit() override;
2018-08-19 15:11:20 +08:00
2018-08-13 23:47:10 +08:00
protected:
E2D_DISABLE_COPY(Scene);
2018-08-19 15:11:20 +08:00
protected:
2018-09-04 22:42:34 +08:00
bool border_visible_;
bool collider_visible_;
2018-08-13 23:47:10 +08:00
};
// <20><><EFBFBD><EFBFBD>
class Sprite :
2018-08-19 17:46:37 +08:00
public Node,
public Drawable
{
public:
Sprite();
2018-05-24 16:25:05 +08:00
explicit Sprite(
Image * image
2017-10-21 19:09:31 +08:00
);
2018-05-24 16:25:05 +08:00
explicit Sprite(
const Resource& res
2017-10-17 21:22:25 +08:00
);
2018-05-24 16:25:05 +08:00
explicit Sprite(
const Resource& res,
2018-09-04 22:42:34 +08:00
const Rect& crop_rect /* <20>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> */
);
2018-05-24 16:25:05 +08:00
explicit Sprite(
2018-09-04 22:42:34 +08:00
const String& file_name
);
2018-05-24 16:25:05 +08:00
explicit Sprite(
2018-09-04 22:42:34 +08:00
const String& file_name,
const Rect& crop_rect /* <20>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> */
);
virtual ~Sprite();
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC>ļ<EFBFBD>
2018-09-04 22:42:34 +08:00
bool Open(
const Resource& res
);
// <20><><EFBFBD><EFBFBD>ͼƬ<CDBC>ļ<EFBFBD>
2018-09-04 22:42:34 +08:00
bool Open(
const String& file_name
);
// <20><><EFBFBD><EFBFBD>ͼƬ
2018-09-04 22:42:34 +08:00
bool Open(
Image * image
);
2018-04-06 11:31:24 +08:00
// <20><>ͼƬ<CDBC>ü<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void Crop(
const Rect& crop_rect /* <20>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> */
);
// <20><>ȡ Image <20><><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
Image * GetImage() const;
2018-02-03 22:04:43 +08:00
// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Draw() const override;
protected:
E2D_DISABLE_COPY(Sprite);
protected:
2018-09-04 22:42:34 +08:00
Image * image_;
};
2018-05-14 00:36:01 +08:00
// <20>ı<EFBFBD>
class Text :
2018-08-19 17:46:37 +08:00
public Node,
public Drawable
{
public:
// <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ʽ
2018-05-24 20:37:34 +08:00
enum class Align
{
2018-05-24 20:37:34 +08:00
Left, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
Right, /* <20>Ҷ<EFBFBD><D2B6><EFBFBD> */
Center /* <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD> */
};
// <20>ı<EFBFBD><C4B1><EFBFBD>ʽ
class Style
{
public:
Color color; // <20><>ɫ
Align alignment; // <20><><EFBFBD>ʽ
2018-09-04 22:42:34 +08:00
bool wrap; // <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
float wrap_width; // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD>
float line_spacing; // <20>м<EFBFBD><D0BC><EFBFBD>
bool underline; // <20>»<EFBFBD><C2BB><EFBFBD>
bool strikethrough; // ɾ<><C9BE><EFBFBD><EFBFBD>
bool outline; // <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
Color outline_color; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
float outline_width; // <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD>
Stroke outline_stroke; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>ʽ
public:
Style();
Style(
Color color,
2018-05-24 20:37:34 +08:00
Align alignment = Align::Left,
2018-09-04 22:42:34 +08:00
bool wrap = false,
float wrap_width = 0.f,
float line_spacing = 0.f,
bool underline = false,
bool strikethrough = false,
bool outline = true,
Color outline_color = Color(Color::Black, 0.5),
float outline_width = 1.f,
Stroke outline_stroke = Stroke::Round
);
};
2017-10-17 21:22:25 +08:00
public:
Text();
2018-05-24 16:25:05 +08:00
explicit Text(
const String& text, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
const Font& font = Font(), /* <20><><EFBFBD><EFBFBD> */
const Style& style = Style() /* <20>ı<EFBFBD><C4B1><EFBFBD>ʽ */
);
virtual ~Text();
// <20><>ȡ<EFBFBD>ı<EFBFBD>
2018-09-04 22:42:34 +08:00
const String& GetText() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
const Font& GetFont() const;
// <20><>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʽ
2018-09-04 22:42:34 +08:00
const Style& GetStyle() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
const String& GetFontFamily() const;
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD>ֺ<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetFontSize() const;
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸֵ
2018-09-04 22:42:34 +08:00
UINT GetFontWeight() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
const Color& GetColor() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
const Color& GetOutlineColor() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD>
2018-09-04 22:42:34 +08:00
float GetOutlineWidth() const;
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>ʽ
2018-09-04 22:42:34 +08:00
Stroke GetOutlineStroke() const;
// <20><>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
int GetLineCount() const;
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>б<EFBFBD><D0B1>
2018-09-04 22:42:34 +08:00
bool IsItalic() const;
2018-04-22 14:08:29 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ʾɾ<CABE><C9BE><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
bool strikethrough() const;
2018-04-22 14:08:29 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ<EFBFBD>»<EFBFBD><C2BB><EFBFBD>
2018-09-04 22:42:34 +08:00
bool underline() const;
2018-04-22 14:08:29 +08:00
// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
bool outline() const;
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
2018-09-04 22:42:34 +08:00
void SetText(
const String& text
);
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ʽ
2018-09-04 22:42:34 +08:00
void SetStyle(
const Style& style
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetFont(
const Font& font
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetFontFamily(
const String& family
);
// <20><><EFBFBD><EFBFBD><EFBFBD>ֺţ<D6BA>Ĭ<EFBFBD><C4AC>ֵΪ 22<32><32>
2018-09-04 22:42:34 +08:00
void SetFontSize(
2018-07-28 20:06:27 +08:00
float size
);
2018-05-24 20:37:34 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸֵ<CFB8><D6B5>Ĭ<EFBFBD><C4AC>ֵΪ Text::Font::Weight::Normal<61><6C>
2018-09-04 22:42:34 +08:00
void SetFontWeight(
UINT weight
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>Ĭ<EFBFBD><C4AC>ֵΪ Color::WHITE<54><45>
2018-09-04 22:42:34 +08:00
void SetColor(
Color color
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>壨Ĭ<E5A3A8><C4AC>ֵΪ false<73><65>
2018-09-04 22:42:34 +08:00
void SetItalic(
bool value
);
// <20>򿪻<EFBFBD><F2BFAABB>ر<EFBFBD><D8B1>ı<EFBFBD><C4B1>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>У<EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD>رգ<D8B1>
2018-09-04 22:42:34 +08:00
void SetWrapEnabled(
bool wrap
);
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>еĿ<D0B5><C4BF>ȣ<EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ 0<><30>
2018-09-04 22:42:34 +08:00
void SetWrapWidth(
float wrap_width
);
// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC>ࣨĬ<E0A3A8><C4AC>Ϊ 0<><30>
2018-09-04 22:42:34 +08:00
void SetLineSpacing(
float line_spacing
);
2018-05-24 20:37:34 +08:00
// <20><><EFBFBD>ö<EFBFBD><C3B6>ʽ<EBB7BD><CABD>Ĭ<EFBFBD><C4AC>Ϊ Align::Left<66><74>
2018-09-04 22:42:34 +08:00
void SetAlignment(
Align align
);
// <20><><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB>ߣ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵΪ false<73><65>
2018-09-04 22:42:34 +08:00
void SetUnderline(
bool underline
);
// <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>ߣ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵΪ false<73><65>
2018-09-04 22:42:34 +08:00
void SetStrikethrough(
bool strikethrough
);
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetOutline(
bool outline
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
void SetOutlineColor(
Color outline_color
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD>
2018-09-04 22:42:34 +08:00
void SetOutlineWidth(
float outline_width
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>ʽ
2018-09-04 22:42:34 +08:00
void SetOutlineStroke(
Stroke outline_stroke
);
// <20><>Ⱦ<EFBFBD><C8BE><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Draw() const override;
2018-01-30 16:45:38 +08:00
protected:
E2D_DISABLE_COPY(Text);
// <20><><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void Reset();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>ʽ<EFBFBD><CABD>
2018-09-04 22:42:34 +08:00
void CreateFormat();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
2018-09-04 22:42:34 +08:00
void CreateLayout();
protected:
2018-09-04 22:42:34 +08:00
String text_;
Font font_;
Style style_;
IDWriteTextFormat * text_format_;
IDWriteTextLayout * text_layout_;
};
2017-10-21 19:09:31 +08:00
class Button :
public Node
2017-10-21 19:09:31 +08:00
{
public:
Button();
2017-10-21 19:09:31 +08:00
2018-05-24 16:25:05 +08:00
explicit Button(
2018-05-08 11:37:11 +08:00
Node * normal, /* <20><>ͨ״̬ */
2018-09-04 22:42:34 +08:00
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
2017-10-21 19:09:31 +08:00
);
2018-05-24 16:25:05 +08:00
explicit Button(
2018-05-08 11:37:11 +08:00
Node * normal, /* <20><>ͨ״̬ */
Node * selected, /* <20><><EFBFBD><EFBFBD><EAB0B4>״̬ */
2018-09-04 22:42:34 +08:00
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
2017-10-21 19:09:31 +08:00
);
2018-05-24 16:25:05 +08:00
explicit Button(
2018-05-08 11:37:11 +08:00
Node * normal, /* <20><>ͨ״̬ */
Node * mouseover, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * selected, /* <20><><EFBFBD><EFBFBD><EAB0B4>״̬ */
2018-09-04 22:42:34 +08:00
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
2017-10-21 19:09:31 +08:00
);
2018-05-24 16:25:05 +08:00
explicit Button(
2018-05-08 11:37:11 +08:00
Node * normal, /* <20><>ͨ״̬ */
Node * mouseover, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * selected, /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * disabled, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>״̬ */
2018-09-04 22:42:34 +08:00
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
);
// <20><>ȡ<EFBFBD><C8A1>ť״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ǽ<EFBFBD><C7BD><EFBFBD>
2018-09-04 22:42:34 +08:00
bool IsEnable() const;
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetEnabled(
2018-07-04 17:00:21 +08:00
bool enabled
2017-10-21 19:09:31 +08:00
);
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetNormal(
Node * normal
2017-10-21 19:09:31 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>밴ťʱ<C5A5><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetMouseOver(
Node * mouseover
2017-10-21 19:09:31 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>ťʱ<C5A5><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetSelected(
Node * selected
2017-10-21 19:09:31 +08:00
);
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetDisabled(
Node * disabled
2017-10-21 19:09:31 +08:00
);
2018-09-04 22:42:34 +08:00
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
void SetCallbackOnClick(
2018-05-08 11:37:11 +08:00
const Function& func
2017-10-21 19:09:31 +08:00
);
2018-08-23 16:58:32 +08:00
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>λ<EFBFBD><CEBB>
2018-07-28 20:48:25 +08:00
// Ĭ<><C4AC>Ϊ (0, 0), <20><>Χ [0, 1]
2018-09-04 22:42:34 +08:00
virtual void SetAnchor(
float anchor_x,
float anchor_y
2018-07-28 20:48:25 +08:00
) override;
2018-07-28 22:22:58 +08:00
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
2018-09-04 22:42:34 +08:00
virtual bool Dispatch(
const MouseEvent& e,
bool handled
2018-07-28 22:22:58 +08:00
) override;
2018-08-19 15:11:20 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void Visit() override;
2018-08-13 23:47:10 +08:00
2017-10-21 19:09:31 +08:00
protected:
E2D_DISABLE_COPY(Button);
// <20><>ť״̬ö<CCAC><C3B6>
2018-07-28 22:22:58 +08:00
enum class Status { Normal, Mouseover, Selected };
// <20><><EFBFBD>ð<EFBFBD>ť״̬
2018-09-04 22:42:34 +08:00
virtual void SetStatus(
Status status
);
// ˢ<>°<EFBFBD>ť<EFBFBD><C5A5>ʾ
2018-09-04 22:42:34 +08:00
virtual void UpdateVisible();
2017-10-21 19:09:31 +08:00
2018-09-04 22:42:34 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
virtual void OnClick();
2017-10-21 19:09:31 +08:00
protected:
2018-09-04 22:42:34 +08:00
Node * normal_;
Node * mouseover_;
Node * selected_;
Node * disabled_;
bool enabled_;
bool is_selected_;
Status status_;
Function callback_;
2017-10-21 19:09:31 +08:00
};
2018-05-22 22:29:42 +08:00
class ToggleButton :
public Button
{
public:
2018-05-22 22:29:42 +08:00
ToggleButton();
2018-05-24 16:25:05 +08:00
explicit ToggleButton(
2018-09-04 22:42:34 +08:00
Node * normal_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * normal_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
);
2018-05-24 16:25:05 +08:00
explicit ToggleButton(
2018-09-04 22:42:34 +08:00
Node * normal_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * normal_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * selected_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4>״̬ */
Node * selected_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4>״̬ */
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
);
2018-05-24 16:25:05 +08:00
explicit ToggleButton(
2018-09-04 22:42:34 +08:00
Node * normal_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * normal_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * mouseover_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * mouseover_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * selected_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4>״̬ */
Node * selected_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4>״̬ */
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
);
2018-05-24 16:25:05 +08:00
explicit ToggleButton(
2018-09-04 22:42:34 +08:00
Node * normal_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * normal_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͨ״̬ */
Node * mouseover_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * mouseover_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * selected_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4>״̬ */
Node * selected_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB0B4>״̬ */
Node * disabled_on, /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
Node * disabled_off, /* <20><>ť<EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
const Function& func = nullptr /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD> */
);
2018-07-28 20:48:25 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬
2018-09-04 22:42:34 +08:00
bool IsChecked() const;
2018-07-28 20:48:25 +08:00
// <20><><EFBFBD>ÿ<EFBFBD><C3BF>ذ<EFBFBD>ť<EFBFBD><C5A5>״̬
2018-09-04 22:42:34 +08:00
void SetChecked(
2018-07-28 20:48:25 +08:00
bool checked
);
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetNormal(
Node * normal
) override;
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>밴ťʱ<C5A5><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetMouseOver(
Node * mouseover
) override;
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>ťʱ<C5A5><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetSelected(
Node * selected
) override;
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
virtual void SetDisabled(
Node * disabled
) override;
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD>ر<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
void SetNormalOff(
Node * normal
);
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD>ر<EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>밴ťʱ<C5A5><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
void SetMouseOverOff(
Node * mouseover
);
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD>ر<EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>°<EFBFBD>ťʱ<C5A5><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
void SetSelectedOff(
Node * selected
);
// <20><><EFBFBD>ð<EFBFBD>ť<EFBFBD>ر<EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʾ<EFBFBD>İ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
void SetDisabledOff(
Node * disabled
);
2018-08-23 16:58:32 +08:00
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>λ<EFBFBD><CEBB>
2018-07-28 20:48:25 +08:00
// Ĭ<><C4AC>Ϊ (0, 0), <20><>Χ [0, 1]
2018-09-04 22:42:34 +08:00
virtual void SetAnchor(
float anchor_x,
float anchor_y
2018-07-28 20:48:25 +08:00
) override;
protected:
E2D_DISABLE_COPY(ToggleButton);
// ˢ<>°<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void UpdateStatus();
// ִ<>а<EFBFBD>ť<EFBFBD><C5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
virtual void OnClick() override;
protected:
2018-09-04 22:42:34 +08:00
Node* normal_on_;
Node* mouseover_on_;
Node* selected_on_;
Node* disabled_on_;
Node* normal_off_;
Node* mouseover_off_;
Node* selected_off_;
Node* disabled_off_;
bool checked_;
};
class Menu :
public Node
{
public:
Menu();
2018-05-24 16:25:05 +08:00
explicit Menu(
const std::vector<Button*>& buttons /* <20><>ť<EFBFBD><C5A5><EFBFBD><EFBFBD> */
2018-05-10 00:58:43 +08:00
);
// <20><>ȡ<EFBFBD>˵<EFBFBD><CBB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
bool IsEnable() const;
// <20><>ȡ<EFBFBD>˵<EFBFBD><CBB5>еİ<D0B5>ť<EFBFBD><C5A5><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
size_t GetButtonCount() const;
// <20><><EFBFBD>ò˵<C3B2><CBB5><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetEnabled(
2018-07-04 17:00:21 +08:00
bool enabled
);
// <20><><EFBFBD>Ӱ<EFBFBD>ť
2018-09-04 22:42:34 +08:00
void AddButton(
Button * button
);
// <20>Ƴ<EFBFBD><C6B3><EFBFBD>ť
2018-09-04 22:42:34 +08:00
bool RemoveButton(
Button * button
);
2018-05-10 14:16:36 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>а<EFBFBD>ť
2018-09-04 22:42:34 +08:00
const std::vector<Button*>& GetAllButtons() const;
2018-05-10 14:16:36 +08:00
protected:
E2D_DISABLE_COPY(Menu);
protected:
2018-09-04 22:42:34 +08:00
bool enabled_;
std::vector<Button*> buttons_;
};
2018-08-23 00:03:26 +08:00
// <20><><EFBFBD><EFBFBD>
class Canvas :
2018-08-23 12:25:31 +08:00
public Node,
public Drawable
2018-08-23 00:03:26 +08:00
{
public:
2018-08-23 12:25:31 +08:00
Canvas(
float width,
float height
);
2018-08-23 00:03:26 +08:00
virtual ~Canvas();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
void SetLineColor(
2018-08-23 00:03:26 +08:00
const Color& color
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
void SetFillColor(
2018-08-23 00:03:26 +08:00
const Color& color
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void SetStrokeWidth(
2018-08-23 00:03:26 +08:00
float width
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>ʽ
2018-09-04 22:42:34 +08:00
void SetStrokeStyle(
2018-08-23 00:03:26 +08:00
Stroke strokeStyle
);
2018-08-23 12:25:31 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
Color GetLineColor() const;
2018-08-23 12:25:31 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
2018-09-04 22:42:34 +08:00
Color GetFillColor() const;
2018-08-23 12:25:31 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
float GetStrokeWidth() const;
2018-08-23 12:25:31 +08:00
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB>ʽ
2018-09-04 22:42:34 +08:00
Stroke GetStrokeStyle() const;
2018-08-23 12:25:31 +08:00
2018-08-23 00:03:26 +08:00
// <20><>ֱ<EFBFBD><D6B1>
2018-09-04 22:42:34 +08:00
void DrawLine(
2018-08-23 00:03:26 +08:00
const Point& begin,
const Point& end
);
2018-08-23 12:25:31 +08:00
// <20><>Բ<EFBFBD>α߿<CEB1>
2018-09-04 22:42:34 +08:00
void DrawCircle(
2018-08-23 12:25:31 +08:00
const Point& center,
float radius
);
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD>α߿<CEB1>
2018-09-04 22:42:34 +08:00
void DrawEllipse(
2018-08-23 12:25:31 +08:00
const Point& center,
2018-09-04 22:42:34 +08:00
float radius_x,
float radius_y
2018-08-23 12:25:31 +08:00
);
2018-08-23 00:03:26 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>α߿<CEB1>
2018-09-04 22:42:34 +08:00
void DrawRect(
2018-08-23 00:03:26 +08:00
const Rect& rect
);
// <20><>Բ<EFBFBD>Ǿ<EFBFBD><C7BE>α߿<CEB1>
2018-09-04 22:42:34 +08:00
void DrawRoundedRect(
2018-08-23 00:03:26 +08:00
const Rect& rect,
2018-09-04 22:42:34 +08:00
float radius_x,
float radius_y
2018-08-23 00:03:26 +08:00
);
2018-08-23 12:25:31 +08:00
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>
2018-09-04 22:42:34 +08:00
void FillCircle(
2018-08-23 12:25:31 +08:00
const Point& center,
float radius
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>
2018-09-04 22:42:34 +08:00
void FillEllipse(
2018-08-23 12:25:31 +08:00
const Point& center,
2018-09-04 22:42:34 +08:00
float radius_x,
float radius_y
2018-08-23 12:25:31 +08:00
);
2018-08-23 00:03:26 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2018-09-04 22:42:34 +08:00
void FillRect(
2018-08-23 00:03:26 +08:00
const Rect& rect
);
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD>
2018-09-04 22:42:34 +08:00
void FillRoundedRect(
2018-08-23 00:03:26 +08:00
const Rect& rect,
2018-09-04 22:42:34 +08:00
float radius_x,
float radius_y
2018-08-23 00:03:26 +08:00
);
protected:
E2D_DISABLE_COPY(Canvas);
protected:
2018-09-04 22:42:34 +08:00
float stroke_width_;
Stroke stroke_;
ID2D1RenderTarget * render_target_;
ID2D1SolidColorBrush * fill_brush_;
ID2D1SolidColorBrush * line_brush_;
ID2D1StrokeStyle * stroke_style_;
2018-08-23 00:03:26 +08:00
};
}