Update Button

This commit is contained in:
Nomango 2020-01-09 08:45:00 +08:00
parent 920256886e
commit a3d425b008
39 changed files with 476 additions and 559 deletions

View File

@ -9,6 +9,7 @@
<ClInclude Include="..\..\src\kiwano\2d\action\ActionWalk.h" />
<ClInclude Include="..\..\src\kiwano\2d\action\ActionTween.h" />
<ClInclude Include="..\..\src\kiwano\2d\action\Animation.h" />
<ClInclude Include="..\..\src\kiwano\2d\Button.h" />
<ClInclude Include="..\..\src\kiwano\2d\Frame.h" />
<ClInclude Include="..\..\src\kiwano\2d\GifSprite.h" />
<ClInclude Include="..\..\src\kiwano\core\common.h" />
@ -82,8 +83,6 @@
<ClInclude Include="..\..\src\kiwano\renderer\win32\FontCollectionLoader.h" />
<ClInclude Include="..\..\src\kiwano\renderer\win32\helper.h" />
<ClInclude Include="..\..\src\kiwano\renderer\win32\TextRenderer.h" />
<ClInclude Include="..\..\src\kiwano\ui\Button.h" />
<ClInclude Include="..\..\src\kiwano\ui\Menu.h" />
<ClInclude Include="..\..\src\kiwano\utils\LocalStorage.h" />
<ClInclude Include="..\..\src\kiwano\utils\ResourceCache.h" />
<ClInclude Include="..\..\src\kiwano\utils\UserData.h" />
@ -96,6 +95,7 @@
<ClCompile Include="..\..\src\kiwano\2d\action\ActionWalk.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\action\ActionTween.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\action\Animation.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Button.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\DebugActor.cpp" />
<ClCompile Include="..\..\src\kiwano\2d\Frame.cpp" />
@ -149,8 +149,6 @@
<ClCompile Include="..\..\src\kiwano\renderer\win32\D3D11DeviceResources.cpp" />
<ClCompile Include="..\..\src\kiwano\renderer\win32\FontCollectionLoader.cpp" />
<ClCompile Include="..\..\src\kiwano\renderer\win32\TextRenderer.cpp" />
<ClCompile Include="..\..\src\kiwano\ui\Button.cpp" />
<ClCompile Include="..\..\src\kiwano\ui\Menu.cpp" />
<ClCompile Include="..\..\src\kiwano\utils\LocalStorage.cpp" />
<ClCompile Include="..\..\src\kiwano\utils\ResourceCache.cpp" />
<ClCompile Include="..\..\src\kiwano\utils\UserData.cpp" />

View File

@ -7,9 +7,6 @@
<Filter Include="utils">
<UniqueIdentifier>{68eac919-ee87-4030-a033-c251731928f5}</UniqueIdentifier>
</Filter>
<Filter Include="ui">
<UniqueIdentifier>{07b6d541-4a1b-472a-aae0-daf9d082fe84}</UniqueIdentifier>
</Filter>
<Filter Include="platform">
<UniqueIdentifier>{c2654ccc-59f6-4c17-bb6b-99b07fc78702}</UniqueIdentifier>
</Filter>
@ -36,12 +33,6 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\src\kiwano\ui\Button.h">
<Filter>ui</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\ui\Menu.h">
<Filter>ui</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\2d\Canvas.h">
<Filter>2d</Filter>
</ClInclude>
@ -288,14 +279,11 @@
<ClInclude Include="..\..\src\kiwano\core\event\WindowEvent.h">
<Filter>core\event</Filter>
</ClInclude>
<ClInclude Include="..\..\src\kiwano\2d\Button.h">
<Filter>2d</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\src\kiwano\ui\Button.cpp">
<Filter>ui</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\ui\Menu.cpp">
<Filter>ui</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\2d\Canvas.cpp">
<Filter>2d</Filter>
</ClCompile>
@ -485,5 +473,8 @@
<ClCompile Include="..\..\src\kiwano\core\event\WindowEvent.cpp">
<Filter>core\event</Filter>
</ClCompile>
<ClCompile Include="..\..\src\kiwano\2d\Button.cpp">
<Filter>2d</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -115,23 +115,23 @@ public:
virtual _Ret invoke(_Args... args) const override
{
return (static_cast<_Ty*>(ptr_)->*func_)(::std::forward<_Args>(args)...);
return (ptr_->*func_)(::std::forward<_Args>(args)...);
}
static inline callable<_Ret, _Args...>* make(void* ptr, _FuncType func)
static inline callable<_Ret, _Args...>* make(_Ty* ptr, _FuncType func)
{
return new (::std::nothrow) proxy_mem_callable<_Ty, _Ret, _Args...>(ptr, func);
}
protected:
proxy_mem_callable(void* ptr, _FuncType func)
proxy_mem_callable(_Ty* ptr, _FuncType func)
: ptr_(ptr)
, func_(func)
{
}
protected:
void* ptr_;
_Ty* ptr_;
_FuncType func_;
};
@ -144,23 +144,23 @@ public:
virtual _Ret invoke(_Args... args) const override
{
return (static_cast<_Ty*>(ptr_)->*func_)(::std::forward<_Args>(args)...);
return (ptr_->*func_)(::std::forward<_Args>(args)...);
}
static inline callable<_Ret, _Args...>* make(void* ptr, _FuncType func)
static inline callable<_Ret, _Args...>* make(_Ty* ptr, _FuncType func)
{
return new (::std::nothrow) proxy_const_mem_callable<_Ty, _Ret, _Args...>(ptr, func);
}
protected:
proxy_const_mem_callable(void* ptr, _FuncType func)
proxy_const_mem_callable(_Ty* ptr, _FuncType func)
: ptr_(ptr)
, func_(func)
{
}
protected:
void* ptr_;
_Ty* ptr_;
_FuncType func_;
};

View File

@ -43,7 +43,7 @@ namespace kiwano
* @brief 񙮵
*/
class KGE_API Sound
: public ObjectBase
: public virtual ObjectBase
{
friend class AudioEngine;

View File

@ -38,7 +38,7 @@ namespace kiwano
* @brief
*/
class KGE_API SoundPlayer
: public ObjectBase
: public virtual ObjectBase
{
public:
SoundPlayer();

View File

@ -41,7 +41,7 @@ namespace kiwano
* @brief HTTPÇëÇó
*/
class KGE_API HttpRequest
: public ObjectBase
: public virtual ObjectBase
{
public:
/// \~chinese

View File

@ -37,7 +37,7 @@ namespace kiwano
* @brief HTTPÏìÓ¦
*/
class KGE_API HttpResponse
: public ObjectBase
: public virtual ObjectBase
{
public:
HttpResponse(HttpRequestPtr request);

View File

@ -36,25 +36,12 @@ namespace kiwano
{
}
Body::Body(b2Body* body, Actor* actor)
: Body()
{
SetB2Body(body);
SetActor(actor);
}
Body::Body(World* world, Actor* actor)
: Body()
{
Init(world, actor);
}
Body::~Body()
{
Destroy();
}
void Body::Init(World* world, Actor* actor)
bool Body::InitBody(World* world, Actor* actor)
{
KGE_ASSERT(world);
@ -64,9 +51,14 @@ namespace kiwano
b2BodyDef def;
b2Body* b2body = world->GetB2World()->CreateBody(&def);
SetB2Body(b2body);
SetActor(actor);
UpdateFromActor();
if (b2body)
{
SetB2Body(b2body);
SetActor(actor);
UpdateFromActor();
return true;
}
return false;
}
Fixture Body::AddFixture(Shape* shape, const Fixture::Param& param)
@ -253,7 +245,7 @@ namespace kiwano
void Body::Destroy()
{
if (world_ && body_)
if (world_)
{
world_->RemoveBody(this);
}

View File

@ -40,7 +40,7 @@ namespace kiwano
/// \~chinese
/// @brief 物体
class KGE_API Body
: public virtual RefCounter
: public virtual ObjectBase
{
public:
/// \~chinese
@ -53,16 +53,20 @@ namespace kiwano
};
Body();
Body(b2Body* body, Actor* actor);
Body(World* world, Actor* actor);
Body(World* world, ActorPtr actor);
virtual ~Body();
/// \~chinese
/// @brief 初始化
/// @param[in] world 物理世界
/// @param[in] actor 绑定的角色
void Init(World* world, Actor* actor);
bool InitBody(World* world, ActorPtr actor);
/// \~chinese
/// @brief 初始化
/// @param[in] world 物理世界
/// @param[in] actor 绑定的角色
bool InitBody(World* world, Actor* actor);
/// \~chinese
/// @brief 添加夹具
@ -319,62 +323,62 @@ namespace kiwano
/** @} */
inline Body::Body(World* world, ActorPtr actor) : Body(world, actor.get()) {}
inline bool Body::InitBody(World* world, ActorPtr actor) { return InitBody(world, actor.get()); }
inline FixtureList Body::GetFixtureList() const { KGE_ASSERT(body_); return FixtureList(Fixture(body_->GetFixtureList())); }
inline FixtureList Body::GetFixtureList() const { KGE_ASSERT(body_); return FixtureList(Fixture(body_->GetFixtureList())); }
inline ContactEdgeList Body::GetContactList() const { KGE_ASSERT(body_); return ContactEdgeList(ContactEdge(body_->GetContactList())); }
inline ContactEdgeList Body::GetContactList() const { KGE_ASSERT(body_); return ContactEdgeList(ContactEdge(body_->GetContactList())); }
inline uint16_t Body::GetCategoryBits() const { return category_bits_; }
inline uint16_t Body::GetCategoryBits() const { return category_bits_; }
inline uint16_t Body::GetMaskBits() const { return mask_bits_; }
inline uint16_t Body::GetMaskBits() const { return mask_bits_; }
inline int16_t Body::GetGroupIndex() const { return group_index_; }
inline int16_t Body::GetGroupIndex() const { return group_index_; }
inline float Body::GetBodyRotation() const { KGE_ASSERT(body_); return math::Radian2Degree(body_->GetAngle()); }
inline float Body::GetBodyRotation() const { KGE_ASSERT(body_); return math::Radian2Degree(body_->GetAngle()); }
inline void Body::SetBodyRotation(float angle) { SetBodyTransform(GetBodyPosition(), angle); }
inline void Body::SetBodyRotation(float angle) { SetBodyTransform(GetBodyPosition(), angle); }
inline void Body::SetBodyPosition(Point const& pos) { SetBodyTransform(pos, GetBodyRotation()); }
inline void Body::SetBodyPosition(Point const& pos) { SetBodyTransform(pos, GetBodyRotation()); }
inline float Body::GetMass() const { KGE_ASSERT(body_); return body_->GetMass(); }
inline float Body::GetMass() const { KGE_ASSERT(body_); return body_->GetMass(); }
inline float Body::GetInertia() const { KGE_ASSERT(body_); return body_->GetInertia(); }
inline float Body::GetInertia() const { KGE_ASSERT(body_); return body_->GetInertia(); }
inline Body::Type Body::GetType() const { KGE_ASSERT(body_); return Type(body_->GetType()); }
inline Body::Type Body::GetType() const { KGE_ASSERT(body_); return Type(body_->GetType()); }
inline void Body::SetType(Type type) { KGE_ASSERT(body_); body_->SetType(static_cast<b2BodyType>(type)); }
inline void Body::SetType(Type type) { KGE_ASSERT(body_); body_->SetType(static_cast<b2BodyType>(type)); }
inline float Body::GetGravityScale() const { KGE_ASSERT(body_); return body_->GetGravityScale(); }
inline float Body::GetGravityScale() const { KGE_ASSERT(body_); return body_->GetGravityScale(); }
inline void Body::SetGravityScale(float scale) { KGE_ASSERT(body_); body_->SetGravityScale(scale); }
inline void Body::SetGravityScale(float scale) { KGE_ASSERT(body_); body_->SetGravityScale(scale); }
inline bool Body::IsIgnoreRotation() const { KGE_ASSERT(body_); return body_->IsFixedRotation(); }
inline bool Body::IsIgnoreRotation() const { KGE_ASSERT(body_); return body_->IsFixedRotation(); }
inline void Body::SetIgnoreRotation(bool flag) { KGE_ASSERT(body_); body_->SetFixedRotation(flag); }
inline void Body::SetIgnoreRotation(bool flag) { KGE_ASSERT(body_); body_->SetFixedRotation(flag); }
inline bool Body::IsBullet() const { KGE_ASSERT(body_); return body_->IsBullet(); }
inline bool Body::IsBullet() const { KGE_ASSERT(body_); return body_->IsBullet(); }
inline void Body::SetBullet(bool flag) { KGE_ASSERT(body_); body_->SetBullet(flag); }
inline void Body::SetBullet(bool flag) { KGE_ASSERT(body_); body_->SetBullet(flag); }
inline bool Body::IsAwake() const { KGE_ASSERT(body_); return body_->IsAwake(); }
inline bool Body::IsAwake() const { KGE_ASSERT(body_); return body_->IsAwake(); }
inline void Body::SetAwake(bool flag) { KGE_ASSERT(body_); body_->SetAwake(flag); }
inline void Body::SetAwake(bool flag) { KGE_ASSERT(body_); body_->SetAwake(flag); }
inline bool Body::IsSleepingAllowed() const { KGE_ASSERT(body_); return body_->IsSleepingAllowed(); }
inline bool Body::IsSleepingAllowed() const { KGE_ASSERT(body_); return body_->IsSleepingAllowed(); }
inline void Body::SetSleepingAllowed(bool flag) { KGE_ASSERT(body_); body_->SetSleepingAllowed(flag); }
inline void Body::SetSleepingAllowed(bool flag) { KGE_ASSERT(body_); body_->SetSleepingAllowed(flag); }
inline bool Body::IsActive() const { KGE_ASSERT(body_); return body_->IsActive(); }
inline bool Body::IsActive() const { KGE_ASSERT(body_); return body_->IsActive(); }
inline void Body::SetActive(bool flag) { KGE_ASSERT(body_); body_->SetActive(flag); }
inline void Body::SetActive(bool flag) { KGE_ASSERT(body_); body_->SetActive(flag); }
inline Actor* Body::GetActor() const { return actor_; }
inline Actor* Body::GetActor() const { return actor_; }
inline void Body::SetActor(Actor* actor) { actor_ = actor; }
inline void Body::SetActor(Actor* actor) { actor_ = actor; }
inline b2Body* Body::GetB2Body() const { return body_; }
inline b2Body* Body::GetB2Body() const { return body_; }
inline World* Body::GetWorld() const { return world_; }
inline World* Body::GetWorld() const { return world_; }
}
}

View File

@ -36,28 +36,17 @@ namespace kiwano
{
}
Joint::Joint(b2Joint* joint)
: Joint()
{
SetB2Joint(joint);
}
Joint::Joint(World* world, b2JointDef* joint_def)
: Joint()
{
Init(world, joint_def);
}
Joint::~Joint()
{
if (world_)
{
world_->RemoveJoint(this);
}
Destroy();
}
void Joint::Init(World* world, b2JointDef* joint_def)
bool Joint::InitJoint(World* world, b2JointDef* joint_def)
{
KGE_ASSERT(world);
Destroy();
world_ = world;
if (world_)
{
@ -65,7 +54,10 @@ namespace kiwano
b2Joint* joint = world_->GetB2World()->CreateJoint(joint_def);
SetB2Joint(joint);
return joint != nullptr;
}
return false;
}
BodyPtr Joint::GetBodyA() const
@ -93,6 +85,14 @@ namespace kiwano
}
}
void Joint::Destroy()
{
if (world_)
{
world_->RemoveJoint(this);
}
}
//
// DistanceJoint
//
@ -103,15 +103,7 @@ namespace kiwano
{
}
DistanceJoint::DistanceJoint(World* world, b2DistanceJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
DistanceJoint::DistanceJoint(World* world, DistanceJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool DistanceJoint::InitJoint(World* world, DistanceJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -120,8 +112,9 @@ namespace kiwano
def.frequencyHz = param.frequency_hz;
def.dampingRatio = param.damping_ratio;
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2DistanceJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
void DistanceJoint::SetLength(float length)
@ -146,15 +139,7 @@ namespace kiwano
{
}
FrictionJoint::FrictionJoint(World* world, b2FrictionJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
FrictionJoint::FrictionJoint(World* world, FrictionJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool FrictionJoint::InitJoint(World* world, FrictionJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -163,8 +148,9 @@ namespace kiwano
def.maxForce = param.max_force;
def.maxTorque = world->Stage2World(param.max_torque);
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2FrictionJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
void FrictionJoint::SetMaxForce(float length)
@ -201,15 +187,7 @@ namespace kiwano
{
}
GearJoint::GearJoint(World* world, b2GearJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
GearJoint::GearJoint(World* world, GearJoint::Param param)
: Joint()
, raw_joint_(nullptr)
bool GearJoint::InitJoint(World* world, GearJoint::Param const& param)
{
KGE_ASSERT(param.joint_a && param.joint_b);
@ -218,8 +196,9 @@ namespace kiwano
def.joint2 = param.joint_b->GetB2Joint();
def.ratio = param.ratio;
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2GearJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
void GearJoint::SetRatio(float ratio)
@ -244,15 +223,7 @@ namespace kiwano
{
}
MotorJoint::MotorJoint(World* world, b2MotorJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
MotorJoint::MotorJoint(World* world, MotorJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool MotorJoint::InitJoint(World* world, MotorJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -262,8 +233,9 @@ namespace kiwano
def.maxTorque = world->Stage2World(param.max_torque);
def.correctionFactor = param.correction_factor;
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2MotorJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
void MotorJoint::SetMaxForce(float length)
@ -300,15 +272,7 @@ namespace kiwano
{
}
PrismaticJoint::PrismaticJoint(World* world, b2PrismaticJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
PrismaticJoint::PrismaticJoint(World* world, PrismaticJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool PrismaticJoint::InitJoint(World* world, PrismaticJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -321,8 +285,9 @@ namespace kiwano
def.maxMotorForce = param.max_motor_force;
def.motorSpeed = world->Stage2World(param.motor_speed);
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2PrismaticJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
float PrismaticJoint::GetJointTranslation() const
@ -365,15 +330,7 @@ namespace kiwano
{
}
PulleyJoint::PulleyJoint(World* world, b2PulleyJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
PulleyJoint::PulleyJoint(World* world, PulleyJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool PulleyJoint::InitJoint(World* world, PulleyJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -381,8 +338,9 @@ namespace kiwano
def.Initialize(param.body_a->GetB2Body(), param.body_b->GetB2Body(), world->Stage2World(param.ground_anchor_a), world->Stage2World(param.ground_anchor_b),
world->Stage2World(param.anchor_a), world->Stage2World(param.anchor_b), param.ratio);
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2PulleyJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
Point PulleyJoint::GetGroundAnchorA() const
@ -437,15 +395,7 @@ namespace kiwano
{
}
RevoluteJoint::RevoluteJoint(World* world, b2RevoluteJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
RevoluteJoint::RevoluteJoint(World* world, RevoluteJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool RevoluteJoint::InitJoint(World* world, RevoluteJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -458,8 +408,9 @@ namespace kiwano
def.maxMotorTorque = world->Stage2World(param.max_motor_torque);
def.motorSpeed = math::Degree2Radian(param.motor_speed);
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2RevoluteJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
float RevoluteJoint::GetJointAngle() const
@ -514,15 +465,7 @@ namespace kiwano
{
}
RopeJoint::RopeJoint(World* world, b2RopeJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
RopeJoint::RopeJoint(World* world, RopeJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool RopeJoint::InitJoint(World* world, RopeJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -533,8 +476,9 @@ namespace kiwano
def.localAnchorB = world->Stage2World(param.local_anchor_b);
def.maxLength = world->Stage2World(param.max_length);
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2RopeJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
void RopeJoint::SetMaxLength(float length)
@ -559,15 +503,7 @@ namespace kiwano
{
}
WeldJoint::WeldJoint(World* world, b2WeldJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
WeldJoint::WeldJoint(World* world, WeldJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool WeldJoint::InitJoint(World* world, WeldJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -576,8 +512,9 @@ namespace kiwano
def.frequencyHz = param.frequency_hz;
def.dampingRatio = param.damping_ratio;
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2WeldJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
@ -591,15 +528,7 @@ namespace kiwano
{
}
WheelJoint::WheelJoint(World* world, b2WheelJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
WheelJoint::WheelJoint(World* world, WheelJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool WheelJoint::InitJoint(World* world, WheelJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -611,8 +540,9 @@ namespace kiwano
def.frequencyHz = param.frequency_hz;
def.dampingRatio = param.damping_ratio;
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2WheelJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
float WheelJoint::GetJointTranslation() const
@ -649,15 +579,7 @@ namespace kiwano
{
}
MouseJoint::MouseJoint(World* world, b2MouseJointDef* def)
: Joint(world, def)
, raw_joint_(nullptr)
{
}
MouseJoint::MouseJoint(World* world, MouseJoint::Param const& param)
: Joint()
, raw_joint_(nullptr)
bool MouseJoint::InitJoint(World* world, MouseJoint::Param const& param)
{
KGE_ASSERT(param.body_a && param.body_b);
@ -669,8 +591,9 @@ namespace kiwano
def.frequencyHz = param.frequency_hz;
def.dampingRatio = param.damping_ratio;
Init(world, &def);
Joint::InitJoint(world, &def);
raw_joint_ = static_cast<b2MouseJoint*>(GetB2Joint());
return raw_joint_ != nullptr;
}
void MouseJoint::SetMaxForce(float length)

View File

@ -47,7 +47,7 @@ namespace kiwano
/// \~chinese
/// @brief 关节
class KGE_API Joint
: public virtual RefCounter
: public virtual ObjectBase
{
public:
/// \~chinese
@ -87,13 +87,12 @@ namespace kiwano
};
Joint();
Joint(b2Joint* joint);
Joint(World* world, b2JointDef* joint_def);
virtual ~Joint();
/// \~chinese
/// @brief 初始化关节
void Init(World* world, b2JointDef* joint_def);
bool InitJoint(World* world, b2JointDef* joint_def);
/// \~chinese
/// @brief 获取关节连接的物体A
@ -107,6 +106,10 @@ namespace kiwano
/// @brief 获取物理世界
World* GetWorld() const;
/// \~chinese
/// @brief 销毁关节
void Destroy();
b2Joint* GetB2Joint() const;
void SetB2Joint(b2Joint* joint);
@ -160,8 +163,10 @@ namespace kiwano
};
DistanceJoint();
DistanceJoint(World* world, b2DistanceJointDef* def);
DistanceJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 设置关节长度
@ -229,8 +234,10 @@ namespace kiwano
};
FrictionJoint();
FrictionJoint(World* world, b2FrictionJointDef* def);
FrictionJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 设置最大摩擦力
@ -263,8 +270,8 @@ namespace kiwano
/// @brief 齿轮关节参数
struct Param : public Joint::ParamBase
{
JointPtr joint_a; ///< 关节A旋转关节/平移关节)
JointPtr joint_b; ///< 关节B旋转关节/平移关节)
Joint* joint_a; ///< 关节A旋转关节/平移关节)
Joint* joint_b; ///< 关节B旋转关节/平移关节)
float ratio; ///< 齿轮传动比
Param(
@ -288,8 +295,10 @@ namespace kiwano
};
GearJoint();
GearJoint(World* world, b2GearJointDef* def);
GearJoint(World* world, Param param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 设定齿轮传动比
@ -343,8 +352,10 @@ namespace kiwano
};
MotorJoint();
MotorJoint(World* world, b2MotorJointDef* def);
MotorJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 设置最大摩擦力
@ -426,8 +437,10 @@ namespace kiwano
};
PrismaticJoint();
PrismaticJoint(World* world, b2PrismaticJointDef* def);
PrismaticJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 获取参考角
@ -537,8 +550,10 @@ namespace kiwano
};
PulleyJoint();
PulleyJoint(World* world, b2PulleyJointDef* def);
PulleyJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 物体A对应的滑轮的位置
@ -628,8 +643,10 @@ namespace kiwano
};
RevoluteJoint();
RevoluteJoint(World* world, b2RevoluteJointDef* def);
RevoluteJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 获取参考角
@ -731,8 +748,10 @@ namespace kiwano
};
RopeJoint();
RopeJoint(World* world, b2RopeJointDef* def);
RopeJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 设置关节最大长度
@ -786,8 +805,10 @@ namespace kiwano
};
WeldJoint();
WeldJoint(World* world, b2WeldJointDef* def);
WeldJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 获取物体B相对于物体A的角度
@ -869,8 +890,10 @@ namespace kiwano
};
WheelJoint();
WheelJoint(World* world, b2WheelJointDef* def);
WheelJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 获取关节当前的平移距离
@ -970,8 +993,10 @@ namespace kiwano
};
MouseJoint();
MouseJoint(World* world, b2MouseJointDef* def);
MouseJoint(World* world, Param const& param);
/// \~chinese
/// @brief 初始化关节
bool InitJoint(World* world, Param const& param);
/// \~chinese
/// @brief 设定最大摩擦力 [N]

View File

@ -60,6 +60,10 @@ namespace kiwano
{
}
Actor::~Actor()
{
}
void Actor::Update(Duration dt)
{
UpdateActions(this, dt);
@ -176,35 +180,47 @@ namespace kiwano
if (!visible_)
return;
ActorPtr prev;
for (auto child = children_.last_item(); child; child = prev)
// Dispatch to children those are greater than 0 in Z-Order
Actor* child = children_.last_item().get();
while (child)
{
prev = child->prev_item();
if (child->GetZOrder() < 0)
break;
child->Dispatch(evt);
child = child->prev_item().get();
}
HandleEvent(evt);
while (child)
{
child->Dispatch(evt);
child = child->prev_item().get();
}
}
void Actor::HandleEvent(Event& evt)
{
EventDispatcher::Dispatch(evt);
if (responsible_)
{
if (evt.IsType<MouseMoveEvent>())
{
auto& mouse_evt = evt.SafeCast<MouseMoveEvent>();
if (!mouse_evt.target && ContainsPoint(mouse_evt.pos))
bool contains = ContainsPoint(mouse_evt.pos);
if (!hover_ && contains)
{
mouse_evt.target = this;
hover_ = true;
if (!hover_)
{
hover_ = true;
MouseHoverEvent hover;
hover.pos = mouse_evt.pos;
hover.left_btn_down = mouse_evt.left_btn_down;
hover.right_btn_down = mouse_evt.right_btn_down;
hover.target = this;
EventDispatcher::Dispatch(hover);
}
MouseHoverEvent hover;
hover.pos = mouse_evt.pos;
hover.left_btn_down = mouse_evt.left_btn_down;
hover.right_btn_down = mouse_evt.right_btn_down;
EventDispatcher::Dispatch(hover);
}
else if (hover_)
else if (hover_ && !contains)
{
hover_ = false;
pressed_ = false;
@ -213,7 +229,6 @@ namespace kiwano
out.pos = mouse_evt.pos;
out.left_btn_down = mouse_evt.left_btn_down;
out.right_btn_down = mouse_evt.right_btn_down;
out.target = this;
EventDispatcher::Dispatch(out);
}
}
@ -221,27 +236,22 @@ namespace kiwano
if (evt.IsType<MouseDownEvent>() && hover_)
{
pressed_ = true;
evt.SafeCast<MouseDownEvent>().target = this;
}
if (evt.IsType<MouseUpEvent>() && pressed_)
{
pressed_ = false;
auto mouse_up_evt = evt.SafeCast<MouseUpEvent>();
mouse_up_evt.target = this;
auto& mouse_up_evt = evt.SafeCast<MouseUpEvent>();
MouseClickEvent click;
click.pos = mouse_up_evt.pos;
click.left_btn_down = mouse_up_evt.left_btn_down;
click.right_btn_down = mouse_up_evt.right_btn_down;
click.target = this;
click.button = mouse_up_evt.button;
EventDispatcher::Dispatch(click);
}
}
EventDispatcher::Dispatch(evt);
}
Matrix3x2 const & Actor::GetTransformMatrix() const

View File

@ -19,14 +19,13 @@
// THE SOFTWARE.
#pragma once
#include <kiwano/core/common.h>
#include <kiwano/math/math.h>
#include <kiwano/core/time.h>
#include <kiwano/core/ObjectBase.h>
#include <kiwano/math/math.h>
#include <kiwano/2d/Transform.h>
#include <kiwano/2d/action/ActionManager.h>
#include <kiwano/core/TimerManager.h>
#include <kiwano/core/EventDispatcher.h>
#include <kiwano/2d/Transform.h>
#include <kiwano/2d/action/ActionManager.h>
namespace kiwano
{
@ -52,11 +51,11 @@ namespace kiwano
* @details
*/
class KGE_API Actor
: public ObjectBase
: public virtual ObjectBase
, public TimerManager
, public ActionManager
, public EventDispatcher
, public IntrusiveListItem<ActorPtr>
, protected IntrusiveListItem<ActorPtr>
{
friend class Director;
friend class Transition;
@ -73,6 +72,8 @@ namespace kiwano
Actor();
virtual ~Actor();
/// \~chinese
/// @brief 更新角色
/// @details 每帧画面刷新前调用该函数,重载该函数以实现角色的更新处理
@ -117,34 +118,6 @@ namespace kiwano
/// @brief 获取 y 坐标
float GetPositionY() const;
/// \~chinese
/// @brief 获取缩放比例
Point const& GetScale() const;
/// \~chinese
/// @brief 获取横向缩放比例
float GetScaleX() const;
/// \~chinese
/// @brief 获取纵向缩放比例
float GetScaleY() const;
/// \~chinese
/// @brief 获取错切角度
Point const& GetSkew() const;
/// \~chinese
/// @brief 获取横向错切角度
float GetSkewX() const;
/// \~chinese
/// @brief 获取纵向错切角度
float GetSkewY() const;
/// \~chinese
/// @brief 获取旋转角度
float GetRotation() const;
/// \~chinese
/// @brief 获取宽度
float GetWidth() const;
@ -189,6 +162,34 @@ namespace kiwano
/// @brief 获取显示透明度
float GetDisplayedOpacity() const;
/// \~chinese
/// @brief 获取旋转角度
float GetRotation() const;
/// \~chinese
/// @brief 获取缩放比例
Point const& GetScale() const;
/// \~chinese
/// @brief 获取横向缩放比例
float GetScaleX() const;
/// \~chinese
/// @brief 获取纵向缩放比例
float GetScaleY() const;
/// \~chinese
/// @brief 获取错切角度
Point const& GetSkew() const;
/// \~chinese
/// @brief 获取横向错切角度
float GetSkewX() const;
/// \~chinese
/// @brief 获取纵向错切角度
float GetSkewY() const;
/// \~chinese
/// @brief 获取变换
Transform GetTransform() const;
@ -362,10 +363,6 @@ namespace kiwano
/// @brief 从父角色移除
void RemoveFromParent();
/// \~chinese
/// @brief 判断点是否在角色内
virtual bool ContainsPoint(const Point& point) const;
/// \~chinese
/// @brief 暂停角色更新
void PauseUpdating();
@ -386,6 +383,10 @@ namespace kiwano
/// @brief 获取更新时的回调函数
UpdateCallback GetCallbackOnUpdate() const;
/// \~chinese
/// @brief 判断点是否在角色内
virtual bool ContainsPoint(const Point& point) const;
/// \~chinese
/// @brief 渲染角色边界
void ShowBorder(bool show);
@ -435,6 +436,10 @@ namespace kiwano
/// @brief 设置节点所在舞台
void SetStage(Stage* stage);
/// \~chinese
/// @brief 处理事件
void HandleEvent(Event& evt);
private:
bool visible_;
bool update_pausing_;

View File

@ -18,7 +18,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/ui/Button.h>
#include <kiwano/2d/Button.h>
#include <kiwano/2d/Stage.h>
#include <kiwano/platform/Window.h>
@ -26,16 +26,8 @@ namespace kiwano
{
Button::Button()
: enabled_(true)
, is_selected_(false)
, click_callback_(nullptr)
, status_(Status::Normal)
{
SetResponsible(true);
AddListener<MouseHoverEvent>(Closure(this, &Button::UpdateStatus));
AddListener<MouseOutEvent>(Closure(this, &Button::UpdateStatus));
AddListener<MouseDownEvent>(Closure(this, &Button::UpdateStatus));
AddListener<MouseUpEvent>(Closure(this, &Button::UpdateStatus));
}
Button::Button(const Callback& click)
@ -99,50 +91,119 @@ namespace kiwano
{
if (status_ != status)
{
status_ = status;
}
}
Status old_status = status_;
void Button::UpdateStatus(Event& evt)
{
KGE_ASSERT(evt.IsType<MouseEvent>());
if (enabled_ && (evt.SafeCast<MouseEvent>().target == this))
{
if (evt.IsType<MouseHoverEvent>())
if (status == Status::Normal)
{
SetStatus(Status::Hover);
Window::instance().SetCursor(CursorType::Hand);
if (mouse_over_callback_)
mouse_over_callback_(this);
}
else if (evt.IsType<MouseOutEvent>())
{
SetStatus(Status::Normal);
Window::instance().SetCursor(CursorType::Arrow);
if (mouse_out_callback_)
mouse_out_callback_(this);
}
else if (evt.IsType<MouseDownEvent>() && status_ == Status::Hover)
else if (status == Status::Hover)
{
SetStatus(Status::Pressed);
Window::instance().SetCursor(CursorType::Hand);
if (old_status == Status::Pressed)
{
if (released_callback_)
released_callback_(this);
}
else
{
if (mouse_over_callback_)
mouse_over_callback_(this);
}
}
else if (status == Status::Pressed)
{
if (pressed_callback_)
pressed_callback_(this);
}
else if (evt.IsType<MouseUpEvent>() && status_ == Status::Pressed)
{
SetStatus(Status::Hover);
if (released_callback_)
released_callback_(this);
if (click_callback_)
click_callback_(this);
}
status_ = status;
}
}
Button::Status Button::GetStatus() const
{
return status_;
}
void Button::UpdateStatus(Event& evt)
{
if (!enabled_)
return;
if (evt.IsType<MouseHoverEvent>())
{
SetStatus(Status::Hover);
}
else if (evt.IsType<MouseOutEvent>())
{
SetStatus(Status::Normal);
}
else if (evt.IsType<MouseDownEvent>() && status_ == Status::Hover)
{
SetStatus(Status::Pressed);
}
else if (evt.IsType<MouseUpEvent>() && status_ == Status::Pressed)
{
SetStatus(Status::Hover);
}
else if (evt.IsType<MouseClickEvent>())
{
if (click_callback_)
click_callback_(this);
}
}
SpriteButton::SpriteButton()
: SpriteButton(nullptr, nullptr, nullptr, nullptr)
{
}
SpriteButton::SpriteButton(Callback const& click)
: SpriteButton(click, nullptr, nullptr, nullptr)
{
}
SpriteButton::SpriteButton(Callback const& click, Callback const& pressed, Callback const& mouse_over, Callback const& mouse_out)
: Button(click, pressed, mouse_over, mouse_out)
{
SetResponsible(true);
EventListener::Callback handler = Closure(this, &SpriteButton::UpdateStatus);
AddListener<MouseHoverEvent>(handler);
AddListener<MouseOutEvent>(handler);
AddListener<MouseDownEvent>(handler);
AddListener<MouseUpEvent>(handler);
AddListener<MouseClickEvent>(handler);
}
TextButton::TextButton()
: TextButton(nullptr, nullptr, nullptr, nullptr)
{
}
TextButton::TextButton(Callback const& click)
: TextButton(click, nullptr, nullptr, nullptr)
{
}
TextButton::TextButton(Callback const& click, Callback const& pressed, Callback const& mouse_over, Callback const& mouse_out)
: Button(click, pressed, mouse_over, mouse_out)
{
SetResponsible(true);
EventListener::Callback handler = Closure(this, &TextButton::UpdateStatus);
AddListener<MouseHoverEvent>(handler);
AddListener<MouseOutEvent>(handler);
AddListener<MouseDownEvent>(handler);
AddListener<MouseUpEvent>(handler);
AddListener<MouseClickEvent>(handler);
}
}

View File

@ -20,17 +20,20 @@
#pragma once
#include <kiwano/2d/Sprite.h>
#include <kiwano/2d/TextActor.h>
namespace kiwano
{
KGE_DECLARE_SMART_PTR(Button);
KGE_DECLARE_SMART_PTR(SpriteButton);
KGE_DECLARE_SMART_PTR(TextButton);
/**
* \~chinese
* @brief
*/
class KGE_API Button
: public Sprite
: public virtual ObjectBase
{
public:
/// \~chinese
@ -45,7 +48,7 @@ namespace kiwano
explicit Button(Callback const& click);
/// \~chinese
/// @brief 获取按钮状态是启用还是禁用
/// @brief 构造按钮
/// @param click 按钮点击回调函数
/// @param pressed 按钮按下回调函数
/// @param mouse_over 按钮移入回调函数
@ -82,16 +85,30 @@ namespace kiwano
/// @brief 设置鼠标移出按钮时的回调函数
void SetMouseOutCallback(const Callback& func);
private:
enum class Status { Normal, Hover, Pressed };
/// \~chinese
/// @brief 按钮状态
enum class Status
{
Normal, ///< 普通
Hover, ///< 鼠标在按钮内
Pressed ///< 被按下
};
/// \~chinese
/// @brief 设置按钮状态
void SetStatus(Status status);
/// \~chinese
/// @brief 获取按钮状态
Status GetStatus() const;
protected:
/// \~chinese
/// @brief 更新按钮状态
void UpdateStatus(Event& evt);
private:
bool enabled_;
bool is_selected_;
Status status_;
Callback click_callback_;
Callback pressed_callback_;
@ -99,4 +116,52 @@ namespace kiwano
Callback mouse_over_callback_;
Callback mouse_out_callback_;
};
/// \~chinese
/// @brief 精灵按钮
class SpriteButton
: public Sprite
, public Button
{
public:
SpriteButton();
/// \~chinese
/// @brief 构造精灵按钮
/// @param click 按钮点击回调函数
explicit SpriteButton(Callback const& click);
/// \~chinese
/// @brief 构造精灵按钮
/// @param click 按钮点击回调函数
/// @param pressed 按钮按下回调函数
/// @param mouse_over 按钮移入回调函数
/// @param mouse_out 按钮移出回调函数
SpriteButton(Callback const& click, Callback const& pressed, Callback const& mouse_over, Callback const& mouse_out);
};
/// \~chinese
/// @brief 文字按钮
class TextButton
: public TextActor
, public Button
{
public:
TextButton();
/// \~chinese
/// @brief 构造文字按钮
/// @param click 按钮点击回调函数
explicit TextButton(Callback const& click);
/// \~chinese
/// @brief 构造文字按钮
/// @param click 按钮点击回调函数
/// @param pressed 按钮按下回调函数
/// @param mouse_over 按钮移入回调函数
/// @param mouse_out 按钮移出回调函数
TextButton(Callback const& click, Callback const& pressed, Callback const& mouse_over, Callback const& mouse_out);
};
}

View File

@ -42,8 +42,6 @@ namespace kiwano
return "\03";
}
};
std::locale comma_locale(std::locale(), new comma_numpunct);
}
DebugActor::DebugActor()
@ -53,20 +51,21 @@ namespace kiwano
SetResponsible(true);
SetCascadeOpacityEnabled(true);
comma_locale_ = std::locale(std::locale(), new comma_numpunct);
background_brush_ = new Brush;
background_brush_->SetColor(Color(0.0f, 0.0f, 0.0f, 0.7f));
debug_text_ = new TextActor;
debug_text_->SetPosition(Point{ 10, 10 });
this->AddChild(debug_text_);
BrushPtr fill_brush = new Brush;
fill_brush->SetColor(Color::White);
TextStyle style;
style.font_family = L"Arial";
style.font_size = 16.f;
style.font_weight = FontWeight::Normal;
style.line_spacing = 20.f;
debug_text_->SetStyle(style);
debug_text_->SetFillColor(Color::White);
style.fill_brush = fill_brush;
debug_text_.SetStyle(style);
AddListener<MouseHoverEvent>([=](Event&) { SetOpacity(0.4f); });
AddListener<MouseOutEvent>([=](Event&) { SetOpacity(1.f); });
@ -80,6 +79,8 @@ namespace kiwano
{
rt->SetCurrentBrush(background_brush_);
rt->FillRoundedRectangle(GetBounds(), Vec2{ 5.f, 5.f });
rt->DrawTextLayout(debug_text_, Point(10, 10));
}
void DebugActor::OnUpdate(Duration dt)
@ -95,7 +96,7 @@ namespace kiwano
StringStream ss;
// For formatting integers with commas
(void)ss.imbue(comma_locale);
(void)ss.imbue(comma_locale_);
ss << "Fps: " << frame_time_.size() << std::endl;
@ -124,16 +125,18 @@ namespace kiwano
ss << pmc.PrivateUsage / 1024 << "Kb";
}
debug_text_->SetText(ss.str());
debug_text_.SetText(ss.str());
debug_text_.Update();
if (debug_text_->GetWidth() > GetWidth() - 20)
Size layout_size = debug_text_.GetLayoutSize();
if (layout_size.x > GetWidth() - 20)
{
SetWidth(20 + debug_text_->GetWidth());
SetWidth(20 + layout_size.x);
}
if (debug_text_->GetHeight() > GetHeight() - 20)
if (layout_size.y > GetHeight() - 20)
{
SetHeight(20 + debug_text_->GetHeight());
SetHeight(20 + layout_size.y);
}
}

View File

@ -20,9 +20,7 @@
#pragma once
#include <kiwano/2d/Actor.h>
#include <kiwano/2d/TextActor.h>
#include <kiwano/renderer/Color.h>
#include <kiwano/renderer/Brush.h>
#include <kiwano/renderer/TextLayout.h>
namespace kiwano
{
@ -51,8 +49,9 @@ namespace kiwano
bool CheckVisibilty(RenderTarget* rt) const override;
private:
std::locale comma_locale_;
BrushPtr background_brush_;
TextActorPtr debug_text_;
TextLayout debug_text_;
Vector<Time> frame_time_;
};

View File

@ -31,7 +31,7 @@ namespace kiwano
* @brief ͼÏñÖ¡
*/
class KGE_API Frame
: public ObjectBase
: public virtual ObjectBase
{
public:
/// \~chinese

View File

@ -32,7 +32,7 @@ namespace kiwano
* @brief ÐòÁÐÖ¡
*/
class KGE_API FrameSequence
: public ObjectBase
: public virtual ObjectBase
{
public:
/// \~chinese

View File

@ -69,6 +69,10 @@ namespace kiwano
/// @brief 获取文本布局
const TextLayout& GetLayout() const;
/// \~chinese
/// @brief 获取文本布局大小
Size GetLayoutSize() const;
/// \~chinese
/// @brief 获取填充画刷
BrushPtr GetFillBrush() const;
@ -201,6 +205,11 @@ namespace kiwano
return text_layout_;
}
inline Size TextActor::GetLayoutSize() const
{
return text_layout_.GetLayoutSize();
}
inline BrushPtr TextActor::GetFillBrush() const
{
return text_layout_.GetFillBrush();

View File

@ -39,7 +39,7 @@ namespace kiwano
* @brief
*/
class KGE_API Transition
: public ObjectBase
: public virtual ObjectBase
{
friend class Director;

View File

@ -45,7 +45,7 @@ namespace kiwano
/// \~chinese
/// @brief 动画
class KGE_API Action
: public ObjectBase
: public virtual ObjectBase
, protected IntrusiveListItem<ActionPtr>
{
friend class ActionManager;

View File

@ -40,7 +40,7 @@ namespace kiwano
/// task->Start();
/// @endcode
class AsyncTask
: public ObjectBase
: public virtual ObjectBase
{
public:
/// \~chinese

View File

@ -38,7 +38,7 @@ namespace kiwano
* @brief
*/
class KGE_API EventListener
: public ObjectBase
: public virtual ObjectBase
, protected IntrusiveListItem<EventListenerPtr>
{
friend class EventDispatcher;

View File

@ -33,7 +33,7 @@ namespace kiwano
* @brief
*/
class KGE_API ObjectBase
: public virtual RefCounter
: public RefCounter
{
public:
/// \~chinese

View File

@ -32,7 +32,7 @@ namespace kiwano
/// @brief 定时器
/// @details 定时器用于每隔一段时间执行一次回调函数,且可以指定执行总次数
class KGE_API Timer
: public ObjectBase
: public virtual ObjectBase
, protected IntrusiveListItem<TimerPtr>
{
friend class TimerManager;

View File

@ -7,7 +7,6 @@ namespace kiwano
, pos()
, left_btn_down(false)
, right_btn_down(false)
, target(nullptr)
{
}

View File

@ -25,8 +25,6 @@
namespace kiwano
{
class Actor;
/**
* \addtogroup Events
* @{
@ -41,7 +39,6 @@ namespace kiwano
Point pos; ///< 鼠标位置
bool left_btn_down; ///< 鼠标左键是否按下
bool right_btn_down; ///< 鼠标右键是否按下
Actor* target; ///< Äżąę
MouseEvent(EventType const& type);
};

View File

@ -100,6 +100,7 @@
#include <kiwano/2d/GifSprite.h>
#include <kiwano/2d/TextActor.h>
#include <kiwano/2d/Canvas.h>
#include <kiwano/2d/Button.h>
#include <kiwano/2d/ShapeActor.h>
#include <kiwano/2d/DebugActor.h>
@ -122,11 +123,3 @@
#include <kiwano/utils/UserData.h>
#include <kiwano/utils/LocalStorage.h>
#include <kiwano/utils/ResourceCache.h>
//
// ui
//
#include <kiwano/ui/Button.h>
#include <kiwano/ui/Menu.h>

View File

@ -181,11 +181,14 @@ namespace kiwano
void Director::HandleEvent(Event& evt)
{
if (debug_actor_)
debug_actor_->Dispatch(evt);
if (current_stage_)
current_stage_->Dispatch(evt);
if (next_stage_)
next_stage_->Dispatch(evt);
if (debug_actor_)
debug_actor_->Dispatch(evt);
}
}

View File

@ -84,25 +84,23 @@ namespace kiwano
{
auto solid_brush = dynamic_cast<ID2D1SolidColorBrush*>(raw_.get());
KGE_ASSERT(solid_brush != nullptr);
solid_brush->SetColor(DX::ConvertToColorF(color));
}
else
{
Renderer::instance().CreateSolidBrush(*this, color);
type_ = Type::SolidColor;
}
}
void Brush::SetStyle(LinearGradientStyle const& style)
{
Renderer::instance().CreateLinearGradientBrush(*this, style.begin, style.end, style.stops, style.extend_mode);
type_ = Type::LinearGradient;
}
void Brush::SetStyle(RadialGradientStyle const& style)
{
Renderer::instance().CreateRadialGradientBrush(*this, style.center, style.offset, style.radius, style.stops, style.extend_mode);
type_ = Type::RadialGradient;
}
void Brush::SetBrush(ComPtr<ID2D1Brush> brush, Type type)

View File

@ -86,7 +86,7 @@ namespace kiwano
* @brief »­Ë¢
*/
class KGE_API Brush
: public ObjectBase
: public virtual ObjectBase
{
friend class RenderTarget;
friend class Renderer;

View File

@ -40,7 +40,7 @@ namespace kiwano
* @brief ×ÖÌå
*/
class Font
: public ObjectBase
: public virtual ObjectBase
{
friend class Renderer;

View File

@ -38,7 +38,7 @@ namespace kiwano
* @brief GIFͼÏñ
*/
class KGE_API GifImage
: public ObjectBase
: public virtual ObjectBase
{
friend class Renderer;

View File

@ -55,7 +55,7 @@ namespace kiwano
/// @brief 渲染目标
/// @details 渲染目标将完成基础图元的绘制,并将绘制结果输出到特定的目标中(如窗口或纹理)
class KGE_API RenderTarget
: public ObjectBase
: public virtual ObjectBase
{
friend class Renderer;

View File

@ -870,15 +870,15 @@ namespace kiwano
hr = E_UNEXPECTED;
}
ComPtr<ID2D1SolidColorBrush> output;
if (SUCCEEDED(hr))
{
ComPtr<ID2D1SolidColorBrush> output;
hr = d2d_res_->GetDeviceContext()->CreateSolidColorBrush(DX::ConvertToColorF(color), &output);
}
if (SUCCEEDED(hr))
{
brush.SetBrush(output, Brush::Type::SolidColor);
if (SUCCEEDED(hr))
{
brush.SetBrush(output, Brush::Type::SolidColor);
}
}
win32::ThrowIfFailed(hr);
@ -894,7 +894,7 @@ namespace kiwano
if (SUCCEEDED(hr))
{
ID2D1GradientStopCollection* collection = nullptr;
ComPtr<ID2D1GradientStopCollection> collection;
hr = d2d_res_->GetDeviceContext()->CreateGradientStopCollection(
reinterpret_cast<const D2D1_GRADIENT_STOP*>(&stops[0]),
UINT32(stops.size()),
@ -911,7 +911,7 @@ namespace kiwano
DX::ConvertToPoint2F(begin),
DX::ConvertToPoint2F(end)
),
collection,
collection.get(),
&output
);
@ -936,7 +936,7 @@ namespace kiwano
if (SUCCEEDED(hr))
{
ID2D1GradientStopCollection* collection = nullptr;
ComPtr<ID2D1GradientStopCollection> collection;
hr = d2d_res_->GetDeviceContext()->CreateGradientStopCollection(
reinterpret_cast<const D2D1_GRADIENT_STOP*>(&stops[0]),
UINT32(stops.size()),
@ -955,7 +955,7 @@ namespace kiwano
radius.x,
radius.y
),
collection,
collection.get(),
&output
);

View File

@ -51,7 +51,7 @@ namespace kiwano
* @brief
*/
class KGE_API Texture
: public ObjectBase
: public virtual ObjectBase
{
friend class RenderTarget;
friend class TextureRenderTarget;

View File

@ -1,91 +0,0 @@
// Copyright (c) 2016-2018 Kiwano - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include <kiwano/ui/Menu.h>
namespace kiwano
{
Menu::Menu()
: enabled_(true)
{
}
bool Menu::IsEnable() const
{
return enabled_;
}
size_t Menu::GetButtonCount() const
{
return buttons_.size();
}
void Menu::SetEnabled(bool enabled)
{
if (enabled_ != enabled)
{
enabled_ = enabled;
for (auto& button : buttons_)
{
button->SetEnabled(enabled);
}
}
}
void Menu::AddButton(ButtonPtr button)
{
if (button)
{
this->AddChild(button);
buttons_.push_back(button);
button->SetEnabled(enabled_);
}
}
bool Menu::RemoveButton(ButtonPtr button)
{
if (buttons_.empty())
{
return false;
}
this->RemoveChild(button);
if (button)
{
auto iter = std::find(buttons_.begin(), buttons_.end(), button);
if (iter != buttons_.end())
{
// ÒÆ³ý°´Å¥Ç°£¬½«ËüÆôÓÃ
button->SetEnabled(true);
buttons_.erase(iter);
return true;
}
}
return false;
}
Vector<ButtonPtr> const& Menu::GetAllButtons() const
{
return buttons_;
}
}

View File

@ -1,67 +0,0 @@
// Copyright (c) 2016-2018 Kiwano - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#pragma once
#include <kiwano/ui/Button.h>
namespace kiwano
{
KGE_DECLARE_SMART_PTR(Menu);
/**
* \~chinese
* @brief
*/
class KGE_API Menu
: public Actor
{
public:
Menu();
/// \~chinese
/// @brief 获取菜单是否禁用
bool IsEnable() const;
/// \~chinese
/// @brief 获取菜单中的按钮数量
size_t GetButtonCount() const;
/// \~chinese
/// @brief 设置菜单启用或禁用
void SetEnabled(bool enabled);
/// \~chinese
/// @brief 添加按钮
void AddButton(ButtonPtr button);
/// \~chinese
/// @brief 移除按钮
bool RemoveButton(ButtonPtr button);
/// \~chinese
/// @brief 获取所有按钮
Vector<ButtonPtr> const& GetAllButtons() const;
private:
bool enabled_;
Vector<ButtonPtr> buttons_;
};
}