mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00

You can now create folders as a means to organize your objects when editing a scene or an external layout. Thanks to @Silver-Streak, Matt Pin, @arthuro555, SnailMail, @TheGemDev, Peeble, Rasterisko for all the help designing and testing the feature. Note that object tags have been dropped in this version since they were not practical to use thus not widespread used.
295 lines
8.2 KiB
C++
295 lines
8.2 KiB
C++
/*
|
|
* GDevelop Core
|
|
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights
|
|
* reserved. This project is released under the MIT License.
|
|
*/
|
|
#ifndef GDCORE_OBJECT_H
|
|
#define GDCORE_OBJECT_H
|
|
#include <map>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "GDCore/Project/Behavior.h"
|
|
#include "GDCore/Project/EffectsContainer.h"
|
|
#include "GDCore/Project/ObjectConfiguration.h"
|
|
#include "GDCore/Project/VariablesContainer.h"
|
|
#include "GDCore/String.h"
|
|
#include "GDCore/Tools/MakeUnique.h"
|
|
#include "GDCore/Vector2.h"
|
|
|
|
namespace gd {
|
|
class PropertyDescriptor;
|
|
class Project;
|
|
class Layout;
|
|
class ArbitraryResourceWorker;
|
|
class InitialInstance;
|
|
class SerializerElement;
|
|
class EffectsContainer;
|
|
} // namespace gd
|
|
|
|
namespace gd {
|
|
|
|
/**
|
|
* \brief Represent an object of a platform
|
|
*
|
|
* \ingroup PlatformDefinition
|
|
*/
|
|
class GD_CORE_API Object {
|
|
public:
|
|
/**
|
|
* Create a new object with the name passed as argument.
|
|
*/
|
|
Object(const gd::String& name,
|
|
const gd::String& type,
|
|
std::unique_ptr<gd::ObjectConfiguration> configuration);
|
|
|
|
/**
|
|
* Create a new object with the name passed as argument.
|
|
*
|
|
* Object takes the ownership of the configuration.
|
|
*/
|
|
Object(const gd::String& name,
|
|
const gd::String& type,
|
|
gd::ObjectConfiguration* configuration);
|
|
|
|
/**
|
|
* Copy constructor. Calls Init().
|
|
*/
|
|
Object(const gd::Object& object) { Init(object); };
|
|
|
|
/**
|
|
* Assignment operator. Calls Init().
|
|
*/
|
|
Object& operator=(const gd::Object& object) {
|
|
if ((this) != &object) Init(object);
|
|
return *this;
|
|
}
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
virtual ~Object();
|
|
|
|
/**
|
|
* Must return a pointer to a copy of the object. A such method is needed to
|
|
* do polymorphic copies. Just redefine this method in your derived object
|
|
* class like this:
|
|
* \code
|
|
* return gd::make_unique<MyObject>(*this);
|
|
* \endcode
|
|
*/
|
|
virtual std::unique_ptr<gd::Object> Clone() const {
|
|
return gd::make_unique<gd::Object>(*this);
|
|
}
|
|
|
|
/**
|
|
* \brief Return the object configuration.
|
|
*/
|
|
gd::ObjectConfiguration& GetConfiguration();
|
|
|
|
const gd::ObjectConfiguration& GetConfiguration() const;
|
|
|
|
/** \name Common properties
|
|
* Members functions related to common properties
|
|
*/
|
|
///@{
|
|
|
|
/** \brief Change the name of the object with the name passed as parameter.
|
|
*/
|
|
void SetName(const gd::String& name_) { name = name_; };
|
|
|
|
/** \brief Return the name of the object.
|
|
*/
|
|
const gd::String& GetName() const { return name; };
|
|
|
|
/** \brief Change the asset store id of the object.
|
|
*/
|
|
void SetAssetStoreId(const gd::String& assetStoreId_) {
|
|
assetStoreId = assetStoreId_;
|
|
};
|
|
|
|
/** \brief Return the asset store id of the object.
|
|
*/
|
|
const gd::String& GetAssetStoreId() const { return assetStoreId; };
|
|
|
|
/** \brief Change the type of the object.
|
|
*/
|
|
void SetType(const gd::String& type_) { configuration->SetType(type_); }
|
|
|
|
/** \brief Return the type of the object.
|
|
*/
|
|
const gd::String& GetType() const { return configuration->GetType(); }
|
|
|
|
/** \brief Shortcut to check if the object is a 3D object.
|
|
*/
|
|
bool Is3DObject() const { return configuration->Is3DObject(); }
|
|
///@}
|
|
|
|
/** \name Behaviors management
|
|
* Members functions related to behaviors management.
|
|
*/
|
|
///@{
|
|
|
|
/**
|
|
* \brief Return a vector containing the names of all the behaviors used by
|
|
* the object
|
|
*/
|
|
std::vector<gd::String> GetAllBehaviorNames() const;
|
|
|
|
/**
|
|
* \brief Return a reference to the content of the behavior called \a name.
|
|
*/
|
|
Behavior& GetBehavior(const gd::String& name);
|
|
|
|
/**
|
|
* \brief Return a reference to the content of the behavior called \a name.
|
|
*/
|
|
const Behavior& GetBehavior(const gd::String& name) const;
|
|
|
|
/**
|
|
* \brief Return true if object has a behavior called \a name.
|
|
*/
|
|
bool HasBehaviorNamed(const gd::String& name) const;
|
|
|
|
/**
|
|
* \brief Remove behavior called \a name
|
|
*/
|
|
void RemoveBehavior(const gd::String& name);
|
|
|
|
/**
|
|
* \brief Change the name of behavior called name to newName.
|
|
* \return true if name was successfully changed
|
|
*/
|
|
bool RenameBehavior(const gd::String& name, const gd::String& newName);
|
|
|
|
/**
|
|
* \brief Add the behavior of the specified \a type with the specified \a
|
|
* name.
|
|
*
|
|
* The project's current platform is used to initialize the content.
|
|
*
|
|
* \return A pointer to the newly added behavior content. NULL if the creation
|
|
* failed.
|
|
*/
|
|
gd::Behavior* AddNewBehavior(const gd::Project& project,
|
|
const gd::String& type,
|
|
const gd::String& name);
|
|
|
|
/**
|
|
* \brief Get a read-only access to the map containing the behaviors with
|
|
* their properties.
|
|
*/
|
|
const std::map<gd::String, std::unique_ptr<gd::Behavior>>&
|
|
GetAllBehaviorContents() const {
|
|
return behaviors;
|
|
};
|
|
///@}
|
|
|
|
/** \name Variable management
|
|
* Members functions related to object variables management.
|
|
*/
|
|
///@{
|
|
/**
|
|
* \brief Provide access to the gd::VariablesContainer member containing the
|
|
* object variables
|
|
*/
|
|
const gd::VariablesContainer& GetVariables() const { return objectVariables; }
|
|
|
|
/**
|
|
* \brief Provide access to the gd::VariablesContainer member containing the
|
|
* object variables
|
|
*/
|
|
gd::VariablesContainer& GetVariables() { return objectVariables; }
|
|
///@}
|
|
|
|
/**
|
|
* \name Effects management
|
|
* Member functions related to effects management.
|
|
*/
|
|
///@{
|
|
/**
|
|
* \brief Provide access to the gd::EffectsContainer member containing the
|
|
* effects.
|
|
*/
|
|
const gd::EffectsContainer& GetEffects() const { return effectsContainer; }
|
|
|
|
/**
|
|
* \brief Provide access to the gd::EffectsContainer member containing the
|
|
* effects.
|
|
*/
|
|
gd::EffectsContainer& GetEffects() { return effectsContainer; }
|
|
///@}
|
|
|
|
/** \name Serialization
|
|
* Members functions related to serialization of the object
|
|
*/
|
|
///@{
|
|
/**
|
|
* \brief Serialize the object.
|
|
* \see DoSerializeTo
|
|
*/
|
|
void SerializeTo(SerializerElement& element) const;
|
|
|
|
/**
|
|
* \brief Unserialize the object.
|
|
* \see DoUnserializeFrom
|
|
*/
|
|
void UnserializeFrom(gd::Project& project, const SerializerElement& element);
|
|
|
|
/**
|
|
* \brief Reset the persistent UUID, used to recognize
|
|
* the same object between serialization.
|
|
*/
|
|
Object& ResetPersistentUuid();
|
|
|
|
/**
|
|
* \brief Remove the persistent UUID - when the object no
|
|
* longer need to be recognized between serializations.
|
|
*/
|
|
Object& ClearPersistentUuid();
|
|
///@}
|
|
|
|
protected:
|
|
gd::String name; ///< The full name of the object
|
|
gd::String assetStoreId; ///< The ID of the asset if the object comes from
|
|
///< the store.
|
|
std::unique_ptr<gd::ObjectConfiguration> configuration;
|
|
std::map<gd::String, std::unique_ptr<gd::Behavior>>
|
|
behaviors; ///< Contains all behaviors and their properties for the
|
|
///< object. Behavior contents are the ownership of the
|
|
///< object.
|
|
gd::VariablesContainer
|
|
objectVariables; ///< List of the variables of the object
|
|
gd::EffectsContainer
|
|
effectsContainer; ///< The effects container for the object.
|
|
mutable gd::String persistentUuid; ///< A persistent random version 4 UUID,
|
|
///< useful for computing changesets.
|
|
|
|
/**
|
|
* Initialize object using another object. Used by copy-ctor and assign-op.
|
|
* Don't forget to update me if members were changed!
|
|
*
|
|
* It's needed because there is no default copy for a map of unique_ptr like
|
|
* behaviors and it must be a deep copy.
|
|
*/
|
|
void Init(const gd::Object& object);
|
|
};
|
|
|
|
/**
|
|
* \brief Functor testing object name
|
|
*
|
|
* \see gd::Object
|
|
*/
|
|
struct ObjectHasName : public std::binary_function<std::unique_ptr<gd::Object>,
|
|
gd::String,
|
|
bool> {
|
|
bool operator()(const std::unique_ptr<gd::Object>& object,
|
|
const gd::String& name) const {
|
|
return object->GetName() == name;
|
|
}
|
|
};
|
|
|
|
} // namespace gd
|
|
|
|
#endif // GDCORE_OBJECT_H
|