/* Moonfall Copyright (C) 2008 Alex Yatskov This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #pragma once class ActorManager; class ActorProperty; class Actor : private boost::noncopyable { public: Actor(const char* alias, const char* name); void Render(const boost::shared_ptr& target); void Update(float elapsed); void SetPosition(const Vector2i& position); Vector2i GetPosition() const; void SetPositionSoft(const Vector2f& position); Vector2f GetPositionSoft() const; void SetLayer(ActorLayer layer); ActorLayer GetLayer() const; void SetDynamic(bool dynamic); bool IsDynamic() const; void SetName(const char* name); const char* GetName() const; Token GetId() const; const char* GetAlias() const; template boost::weak_ptr AddProperty() { ASSERT(T::GetStaticType() < ARRAY_SIZE(m_properties)); boost::shared_ptr& property = m_properties[T::GetStaticType()]; if (!property) { property = boost::shared_ptr(new T(this)); } return GetProperty(); } template void RemoveProperty() { ASSERT(T::GetStaticType() < ARRAY_SIZE(m_properties)); m_properties[T::GetStaticType()].reset(); } template boost::weak_ptr GetProperty() const { ASSERT(T::GetStaticType() < ARRAY_SIZE(m_properties)); return boost::static_pointer_cast(m_properties[T::GetStaticType()]); } template boost::weak_ptr GetProperty() { ASSERT(T::GetStaticType() < ARRAY_SIZE(m_properties)); return boost::static_pointer_cast(m_properties[T::GetStaticType()]); } bool HasProperty(ActorPropertyType property) const { ASSERT(property < ARRAY_SIZE(m_properties)); return m_properties[property]; } void SetOwner(ActorManager* owner); const ActorManager* GetOwner() const; ActorManager* GetOwner(); void GetShape(ActorShapeType type, int* data, Vector2i* position, Vector2i* size) const; void SetShape(ActorShapeType type, int data, const Vector2i& position, const Vector2i& size); ActorShape GetShape(ActorShapeType type) const; void SetShape(ActorShapeType type, const ActorShape& shape); void EnableShape(ActorShapeType type); void DisableShape(ActorShapeType type); bool IsShapeEnabled(ActorShapeType type) const; private: void RenderShapes(const boost::shared_ptr& target); static Token RegisterId(); void SetId(Token id); boost::shared_ptr m_properties[ACTOR_PROPERTY_TYPE_COUNT]; ActorShape m_shapes[ACTOR_SHAPE_TYPE_COUNT]; ActorManager* m_owner; bool m_dynamic; ActorLayer m_layer; Vector2f m_position; std::string m_alias; std::string m_name; Token m_id; boost::shared_ptr m_shapeSurface; };