• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
pinebanana

Questions about Events in my Entity System

1 post in this topic

[size=6][b]EDIT:[/b][/size]
I solved my own problem, and I am going to use an observer pattern but I am going to re-code some parts of my ES, thanks.

At the moment I'm designing an Entity System, in C++, which is some-what based off of the Java Artemis Entity System. Now I'm not 100% sure about the design of my Entity System, mostly handling events. I have multiple choices on what I should do, BUT I just don't know what to do!

Currently I have my code hosted on [url="https://bitbucket.org/miguelishawt/anax-entity-system"]BitBucket[/url], however, it's incomplete and going to most likely be redesigned.

Here is the basic classes of my Entity System:[list]
[*][b]Entity[/b] - An Id (and some methods to add/remove/get/etc Components)
[*][b]Component[/b] - An empty abstract class
[*][b]ComponentManager[/b] - Manages ALL components for ALL entities within a Scene
[*][b]EntitySystem[/b] - Processes entities with specific components
[*][b]Aspect[/b] - The class that is used to help determine what Components an Entity must contain so a specific EntitySystem can process it
[*][b]EntitySystemManager[/b] - Manages all EntitySystems within a Scene
[*][b]EntityManager[/b] - Manages entities (i.e. holds all Entities, used to determine whether an Entity has been changed, enables/disables them, etc.)
[*][b]EntityFactory[/b] - Creates (and destroys) entities and assigns an ID to them
[*][b]Scene[/b] - Contains an EntityManager, EntityFactory, EntitySystemManager and ComponentManager. Has functions to update and initialise the scene.
[/list]
Now with the current design, here's a brief of what it does/will look like:
[CODE]
Scene scene;
EntityPtr entity = scene.getEntityFactory().createEntity(); // create an Entity
entity.addComponent(new VelocityComponent(1, 1, 1)); // add a component to the Entity

// add an EntitySystem to the Scene
scene.getSystemManager().addSystem(new MovementSystem());

// activate the Entity (this method wraps the method: scene.activate(EntityPtr entity)), however
// This tells the SystemManager to determine if the systems in the SystemManager object should process an Entity
entity.activate();

// init the scene
scene.initialize();

// Example of a game loop...
while(isRunning)
{
// poll our input, etc, etc

// update the scene
scene.update();
}
[/CODE]

Now here's my issue, it is to do with [i]event[/i], as I am not sure how to implement them. Whenever I [u]activat[i]e[/i][/u]an Entity, the EntitySystemManager (or EntitySystems within the manager) require to be notified when this occurs, to check if the Entity is valid for processing. The ways I am currently thinking of doing this is:

1. Having different Listener objects (or an EntityObserver class), e.g.
[CODE]
void Entity::activate()
{
getScene()->getEntityManager().activate(this);
}


void EntityManager::activate(EntityPtr entity)
{
// register the entity
register(entity); // (simply adds it to an array of entities, for storage)

// pseudo code
for(each entityManagerListener)
{
// notify the listener object
entityManagerListener->onActivate(entity);
}
}

// overridden method from an EntityManagerListener class
void EntitySystemManager::onActivate(EntityPtr entity)
{
// pseudo code
for(each system)
{
// check the entity
system.check(entity);
}
}
[/CODE]
2. Calling explicitly these functions in other classes, e.g.
[CODE]
void Entity::activate()
{
getScene()->getEntityManager().activate(this);
}

void EntityManager::activate(EntityPtr entity)
{
// register the entity
register(entity); // (simply adds it to an array of entities, for storage)

// tell the system manager we activated an object
getScene()->getSystemManager().onActivate(entity);
}

void EntitySystemManager::onActivate(EntityPtr entity)
{
// pseudo code
for(each system)
{
// check the entity
system.check(entity);
}
}
[/CODE]
3. Just about duplicating the Artemis framework with EntityObserver (with this I have to rewrite some code)
4. Another way of handling these events?
5. All of the above and see which one "feels" better?

Also, is it better to send out events before an update or after an Entity, i.e.
[CODE]
void Scene::update()
{
handleEvents(); // handle the events that occurred first, i.e. this will fire out methods to listener/observer objects
updateEverythingNecessary(); // then update everything
}
[/CODE]
I was told that this would be better, as there are "less" loops?


[size=5][b]NOTE:[/b][/size]
I just realised I shouldn't really be going
[CODE]
EntityPtr e = scene.getEntityFactory().createEntity();
[/CODE]
Instead.. I should be doing
[CODE]
EntityPtr e = scene.createEntity();
[/CODE]
... And so on...
That way I can implement the scene in various ways, without the interface depending on those objects. Edited by pinebanana
0

Share this post


Link to post
Share on other sites
Hi Pinebanana,

I wanted to let you know of 2 different entity systems I have created and used in the past, both of them available in my Journal.

[url="http://www.gamedev.net/blog/1385/entry-2254814-entity-system-redux/"]This post[/url] explains the system I designed based loosely off the Artemis system, where the components are solely data, and they are acted upon by systems.

[url="http://www.gamedev.net/blog/1385/entry-2253941-my-component-base-entity-system-part-1/"]This post[/url] is the 1st post of 4 that explains my original Entity system, where the components were data and logic, and it communicated via events passed between them. You could look here to see how I handled event passing.

FWIW, I like the Artemis-based entity systems that uses system to act on the components as the systems make more sense to me. Good luck!
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0