Kiwano Engine v1.3.x
Actor.h
1// Copyright (c) 2016-2018 Kiwano - Nomango
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20
21#pragma once
22#include <kiwano/math/Math.h>
23#include <kiwano/core/Time.h>
24#include <kiwano/base/ObjectBase.h>
25#include <kiwano/base/component/ComponentManager.h>
26#include <kiwano/event/EventDispatcher.h>
27#include <kiwano/utils/TaskScheduler.h>
28#include <kiwano/2d/animation/Animator.h>
29
30namespace kiwano
31{
32class Stage;
33class Director;
34class RenderContext;
35
38typedef IntrusiveList<RefPtr<Actor>> ActorList;
39
56class KGE_API Actor
57 : public ObjectBase
58 , public Animator
59 , public TaskScheduler
60 , public EventDispatcher
61 , public ComponentManager
62 , protected IntrusiveListValue<RefPtr<Actor>>
63{
64 friend class Director;
65 friend class Transition;
67
68public:
69 using IntrusiveListValue<RefPtr<Actor>>::GetNext;
70 using IntrusiveListValue<RefPtr<Actor>>::GetPrev;
71
75
76 Actor();
77
78 virtual ~Actor();
79
84 virtual void OnUpdate(Duration dt);
85
91 virtual void OnRender(RenderContext& ctx);
92
95 bool IsVisible() const;
96
99 bool IsCascadeOpacityEnabled() const;
100
103 size_t GetHashName() const;
104
107 int GetZOrder() const;
108
111 Point GetPosition() const;
112
115 float GetPositionX() const;
116
119 float GetPositionY() const;
120
123 virtual Size GetSize() const;
124
127 float GetWidth() const;
128
131 float GetHeight() const;
132
135 float GetScaledWidth() const;
136
139 float GetScaledHeight() const;
140
143 Size GetScaledSize() const;
144
147 Point GetAnchor() const;
148
151 float GetAnchorX() const;
152
155 float GetAnchorY() const;
156
159 float GetOpacity() const;
160
163 float GetDisplayedOpacity() const;
164
167 float GetRotation() const;
168
171 Point GetScale() const;
172
175 float GetScaleX() const;
176
179 float GetScaleY() const;
180
183 Point GetSkew() const;
184
187 float GetSkewX() const;
188
191 float GetSkewY() const;
192
195 Transform GetTransform() const;
196
199 Actor* GetParent() const;
200
203 Stage* GetStage() const;
204
207 virtual Rect GetBounds() const;
208
211 virtual Rect GetBoundingBox() const;
212
215 const Matrix3x2& GetTransformMatrix() const;
216
219 const Matrix3x2& GetTransformInverseMatrix() const;
220
223 const Matrix3x2& GetTransformMatrixToParent() const;
224
227 void SetVisible(bool val);
228
231 void SetName(StringView name);
232
235 void SetPosition(const Point& point);
236
239 void SetPosition(float x, float y);
240
243 void SetPositionX(float x);
244
247 void SetPositionY(float y);
248
251 void MoveTo(const Point& p);
252
255 void MoveTo(float x, float y);
256
259 void MoveBy(const Vec2& trans);
260
263 void MoveBy(float trans_x, float trans_y);
264
267 void SetScale(const Vec2& scale);
268
271 void SetScale(float scalex, float scaley);
272
275 void SetSkew(const Vec2& skew);
276
279 void SetSkew(float skewx, float skewy);
280
283 void SetRotation(float rotation);
284
287 void SetAnchor(const Vec2& anchor);
288
291 void SetAnchor(float anchorx, float anchory);
292
295 void SetSize(const Size& size);
296
299 void SetSize(float width, float height);
300
303 void SetWidth(float width);
304
307 void SetHeight(float height);
308
311 void SetOpacity(float opacity);
312
315 void SetCascadeOpacityEnabled(bool enabled);
316
319 void SetTransform(const Transform& transform);
320
323 void SetZOrder(int zorder);
324
327 void AddChild(RefPtr<Actor> child);
328
331 void AddChild(RefPtr<Actor> child, int zorder);
332
335 void AddChildren(const Vector<RefPtr<Actor>>& children);
336
339 RefPtr<Actor> GetChild(StringView name) const;
340
343 Vector<RefPtr<Actor>> GetChildren(StringView name) const;
344
347 ActorList& GetAllChildren();
348
351 const ActorList& GetAllChildren() const;
352
355 void RemoveChild(RefPtr<Actor> child);
356
359 void RemoveChildren(StringView child_name);
360
363 void RemoveAllChildren();
364
367 void RemoveFromParent();
368
371 void PauseUpdating();
372
375 void ResumeUpdating();
376
379 bool IsUpdatePausing() const;
380
383 void SetCallbackOnUpdate(const UpdateCallback& cb);
384
387 UpdateCallback GetCallbackOnUpdate() const;
388
391 virtual bool ContainsPoint(const Point& point) const;
392
395 Point ConvertToLocal(const Point& point) const;
396
399 Point ConvertToWorld(const Point& point) const;
400
403 void ShowBorder(bool show);
404
407 void DoSerialize(Serializer* serializer) const override;
408
411 void DoDeserialize(Deserializer* deserializer) override;
412
415 static void SetDefaultAnchor(float anchor_x, float anchor_y);
416
417protected:
420 virtual void Update(Duration dt);
421
422 void UpdateSelf(Duration dt);
423
426 virtual void Render(RenderContext& ctx);
427
430 virtual void RenderBorder(RenderContext& ctx);
431
434 virtual bool CheckVisibility(RenderContext& ctx) const;
435
438 virtual void PrepareToRender(RenderContext& ctx);
439
442 void UpdateTransform() const;
443
447 void UpdateTransformUpwards() const;
448
451 void UpdateOpacity();
452
455 void Reorder();
456
459 void SetStage(Stage* stage);
460
461 enum DirtyFlag : uint8_t
462 {
463 Clean = 0,
464 DirtyTransform = 1,
465 DirtyTransformInverse = 1 << 1,
466 DirtyOpacity = 1 << 2,
467 DirtyVisibility = 1 << 3
468 };
469
470 Flag<uint8_t>& GetDirtyFlag() const;
471
472private:
473 bool visible_;
474 bool update_pausing_;
475 bool cascade_opacity_;
476 bool show_border_;
477 mutable bool visible_in_rt_;
478
479 mutable Flag<uint8_t> dirty_flag_;
480
481 int z_order_;
482 float opacity_;
483 float displayed_opacity_;
484 Actor* parent_;
485 Stage* stage_;
486 size_t hash_name_;
487 Point anchor_;
488 Size size_;
489 ActorList children_;
490 UpdateCallback cb_update_;
491 Transform transform_;
492
493 mutable Matrix3x2 transform_matrix_;
494 mutable Matrix3x2 transform_matrix_inverse_;
495 mutable Matrix3x2 transform_matrix_to_parent_;
496};
497
501{
502 KGE_NOT_USED(dt);
503}
504
506{
507 KGE_NOT_USED(ctx);
508}
509
510inline Flag<uint8_t>& Actor::GetDirtyFlag() const
511{
512 return dirty_flag_;
513}
514
515inline bool Actor::IsVisible() const
516{
517 return visible_;
518}
519
521{
522 return cascade_opacity_;
523}
524
525inline size_t Actor::GetHashName() const
526{
527 return hash_name_;
528}
529
530inline int Actor::GetZOrder() const
531{
532 return z_order_;
533}
534
536{
537 return transform_.position;
538}
539
540inline float Actor::GetPositionX() const
541{
542 return GetPosition().x;
543}
544
545inline float Actor::GetPositionY() const
546{
547 return GetPosition().y;
548}
549
550inline Point Actor::GetScale() const
551{
552 return transform_.scale;
553}
554
555inline float Actor::GetScaleX() const
556{
557 return GetScale().x;
558}
559
560inline float Actor::GetScaleY() const
561{
562 return GetScale().y;
563}
564
565inline Point Actor::GetSkew() const
566{
567 return transform_.skew;
568}
569
570inline float Actor::GetSkewX() const
571{
572 return GetSkew().x;
573}
574
575inline float Actor::GetSkewY() const
576{
577 return GetSkew().y;
578}
579
580inline float Actor::GetRotation() const
581{
582 return transform_.rotation;
583}
584
585inline float Actor::GetWidth() const
586{
587 return GetSize().x;
588}
589
590inline float Actor::GetHeight() const
591{
592 return GetSize().y;
593}
594
595inline Size Actor::GetSize() const
596{
597 return size_;
598}
599
600inline float Actor::GetScaledWidth() const
601{
602 return GetWidth() * GetScaleX();
603}
604
605inline float Actor::GetScaledHeight() const
606{
607 return GetHeight() * GetScaleY();
608}
609
611{
612 return Size{ GetScaledWidth(), GetScaledHeight() };
613}
614
616{
617 return anchor_;
618}
619
620inline float Actor::GetAnchorX() const
621{
622 return GetAnchor().x;
623}
624
625inline float Actor::GetAnchorY() const
626{
627 return GetAnchor().y;
628}
629
630inline float Actor::GetOpacity() const
631{
632 return opacity_;
633}
634
635inline float Actor::GetDisplayedOpacity() const
636{
637 return displayed_opacity_;
638}
639
641{
642 return transform_;
643}
644
645inline Actor* Actor::GetParent() const
646{
647 return parent_;
648}
649
650inline Stage* Actor::GetStage() const
651{
652 return stage_;
653}
654
656{
657 update_pausing_ = true;
658}
659
661{
662 update_pausing_ = false;
663}
664
665inline bool Actor::IsUpdatePausing() const
666{
667 return update_pausing_;
668}
669
671{
672 cb_update_ = cb;
673}
674
676{
677 return cb_update_;
678}
679
680inline void Actor::ShowBorder(bool show)
681{
682 show_border_ = show;
683}
684
685inline void Actor::SetPosition(float x, float y)
686{
687 this->SetPosition(Point(x, y));
688}
689
690inline void Actor::SetPositionX(float x)
691{
692 this->SetPosition(Point(x, transform_.position.y));
693}
694
695inline void Actor::SetPositionY(float y)
696{
697 this->SetPosition(Point(transform_.position.x, y));
698}
699
700inline void Actor::MoveTo(const Point& p)
701{
702 this->SetPosition(p);
703}
704
705inline void Actor::MoveTo(float x, float y)
706{
707 this->SetPosition(Point(x, y));
708}
709
710inline void Actor::MoveBy(const Vec2& trans)
711{
712 this->SetPosition(transform_.position.x + trans.x, transform_.position.y + trans.y);
713}
714
715inline void Actor::MoveBy(float trans_x, float trans_y)
716{
717 this->MoveBy(Vec2(trans_x, trans_y));
718}
719
720inline void Actor::SetScale(float scalex, float scaley)
721{
722 this->SetScale(Vec2(scalex, scaley));
723}
724
725inline void Actor::SetAnchor(float anchorx, float anchory)
726{
727 this->SetAnchor(Vec2(anchorx, anchory));
728}
729
730inline void Actor::SetSize(float width, float height)
731{
732 this->SetSize(Size(width, height));
733}
734
735inline void Actor::SetWidth(float width)
736{
737 this->SetSize(Size(width, size_.y));
738}
739
740inline void Actor::SetHeight(float height)
741{
742 this->SetSize(Size(size_.x, height));
743}
744
745inline void Actor::SetSkew(float skewx, float skewy)
746{
747 this->SetSkew(Vec2(skewx, skewy));
748}
749
750} // namespace kiwano
角色
Definition: Actor.h:63
UpdateCallback GetCallbackOnUpdate() const
获取更新时的回调函数
Definition: Actor.h:675
Transform GetTransform() const
获取变换
Definition: Actor.h:640
Function< void(Duration)> UpdateCallback
角色更新回调函数
Definition: Actor.h:74
void SetSize(const Size &size)
修改大小
Definition: Actor.cpp:399
bool IsVisible() const
获取显示状态
Definition: Actor.h:515
float GetPositionX() const
获取 x 坐标
Definition: Actor.h:540
virtual void OnRender(RenderContext &ctx)
渲染角色
Definition: Actor.h:505
Point GetSkew() const
获取错切角度
Definition: Actor.h:565
bool IsCascadeOpacityEnabled() const
是否启用级联透明度
Definition: Actor.h:520
void MoveTo(const Point &p)
移动至坐标
Definition: Actor.h:700
void SetPosition(const Point &point)
设置坐标
Definition: Actor.cpp:425
Stage * GetStage() const
获取所在舞台
Definition: Actor.h:650
float GetAnchorY() const
获取 y 方向锚点
Definition: Actor.h:625
size_t GetHashName() const
获取名称的 Hash 值
Definition: Actor.h:525
void SetCallbackOnUpdate(const UpdateCallback &cb)
设置更新时的回调函数
Definition: Actor.h:670
Actor * GetParent() const
获取父角色
Definition: Actor.h:645
Point GetPosition() const
获取坐标
Definition: Actor.h:535
Size GetScaledSize() const
获取缩放后的大小
Definition: Actor.h:610
float GetDisplayedOpacity() const
获取显示透明度
Definition: Actor.h:635
void SetSkew(const Vec2 &skew)
设置错切角度,默认为 (0, 0)
Definition: Actor.cpp:443
void SetScale(const Vec2 &scale)
设置缩放比例,默认为 (1.0, 1.0)
Definition: Actor.cpp:434
bool IsUpdatePausing() const
角色更新是否暂停
Definition: Actor.h:665
float GetScaleY() const
获取纵向缩放比例
Definition: Actor.h:560
Point GetAnchor() const
获取锚点
Definition: Actor.h:615
int GetZOrder() const
获取 Z 轴顺序
Definition: Actor.h:530
float GetScaledHeight() const
获取缩放后的高度
Definition: Actor.h:605
float GetSkewX() const
获取横向错切角度
Definition: Actor.h:570
void SetWidth(float width)
修改宽度
Definition: Actor.h:735
float GetScaleX() const
获取横向缩放比例
Definition: Actor.h:555
void ResumeUpdating()
继续角色更新
Definition: Actor.h:660
virtual Size GetSize() const
获取大小
Definition: Actor.h:595
void SetHeight(float height)
修改高度
Definition: Actor.h:740
float GetAnchorX() const
获取 x 方向锚点
Definition: Actor.h:620
void MoveBy(const Vec2 &trans)
移动相对坐标
Definition: Actor.h:710
float GetScaledWidth() const
获取缩放后的宽度
Definition: Actor.h:600
void ShowBorder(bool show)
渲染角色边界
Definition: Actor.h:680
float GetOpacity() const
获取透明度
Definition: Actor.h:630
void SetPositionX(float x)
设置横坐标
Definition: Actor.h:690
float GetSkewY() const
获取纵向错切角度
Definition: Actor.h:575
float GetPositionY() const
获取 y 坐标
Definition: Actor.h:545
void PauseUpdating()
暂停角色更新
Definition: Actor.h:655
float GetWidth() const
获取宽度
Definition: Actor.h:585
virtual void OnUpdate(Duration dt)
更新角色
Definition: Actor.h:500
void SetAnchor(const Vec2 &anchor)
设置锚点位置,默认为 (0, 0), 范围 [0, 1]
Definition: Actor.cpp:390
float GetRotation() const
获取旋转角度
Definition: Actor.h:580
float GetHeight() const
获取高度
Definition: Actor.h:590
void SetPositionY(float y)
设置纵坐标
Definition: Actor.h:695
Point GetScale() const
获取缩放比例
Definition: Actor.h:550
动画调度器
Definition: Animator.h:37
组件管理器
Definition: ComponentManager.h:42
导演
Definition: Director.h:38
事件分发器
Definition: EventDispatcher.h:36
Definition: Function.h:228
侵入式链表元素
Definition: IntrusiveList.hpp:434
侵入式链表
Definition: IntrusiveList.hpp:34
基础对象
Definition: ObjectBase.h:138
引用计数智能指针
Definition: RefBasePtr.hpp:35
渲染上下文
Definition: RenderContext.h:62
舞台
Definition: Stage.h:40
任务调度器
Definition: TaskScheduler.h:36
舞台过渡动画
Definition: Transition.h:45
float rotation
旋转
Definition: Transform.hpp:40
Vec2T< ValueType > skew
错切角度
Definition: Transform.hpp:43
Vec2T< ValueType > position
坐标
Definition: Transform.hpp:41
Vec2T< ValueType > scale
缩放
Definition: Transform.hpp:42
反序列化器
Definition: Serializable.h:147
时间段
Definition: Duration.h:48
序列化器
Definition: Serializable.h:40