• 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
Fiodis

Pointer trouble in entity system [Solved]

3 posts in this topic

After reading about them, I've been trying to switch over from an OOP setup to using an entity-component system, but I've had some trouble with dependencies.  For example, an entity might want to help members of the same team, so when the AI system is doing processing on that entity's components, it needs a list of other entities on the same team.  I saw some examples maintained a list of pointers to entities on the same team, so I tried doing something similar: I defined a Group struct that contains a label and a vector of pointers to the entities that make up that Group:

struct Group {
    std::string name;

    std::vector<Entity*> entities;

};

Both Entities and Groups are contained in larger objects called Scenes, which have as part of their constructor:

entList.push_back(Entity());// First entity added to a std::vector<Entity> called entList
    entList[0].entName = std::string("Cam0");



groupList.push_back(Group());//First group added to an std::vector<Group> called groupList

    groupList[0].name = std::string("Cameras");

    groupList[0].entities.push_back(&entList[0])// Hopefully adds a pointer to the first entity in the Scene's entList

This way I can easily and directly access entities in a specific group without having to iterate all the time over ever entity in the entList.  The entity list itself seems to be working fine, but I have trouble whenever I try to access entities through the groupList.  Code like the following gives me an access violation error:

Scene scn = Scene();
std::cout << "\n" << scn.entList[0].entName;// This works

std::cout << "\n" << scn.groupList[0].entities[0]->entName;// This gives me an access violation

I think there's something wrong with my understanding of pointers.  This thread presented a problem similar to mine, with the suggestion that the OP had made a pointer but hadn't initialized it yet.  I'm pretty sure I'm initializing it to &entList[0] with the line groupList[0].entities.push_back(&entList[0]); but maybe vectors of pointers work differently.  A google search for "C++ vectors of pointers" didn't seem to indicate that, though.  push_back ought to copy the given value to a new element at the vector's end, no?  So it should be initialized.

 

 

In another attempt to debug, I tried making the following change in Scene's initializer:

groupList.push_back(Group());//First group added to an std::vector<Group> called groupList
    groupList[0].name = std::string("Cameras");
    groupList[0].entities.push_back(NULL)// Initialize it to NULL
grouplist[0].entities[0] = &entList[0];// Change it to point to the first entity in the Scene's entList.

Then this runs fine and outputs the text "not null":

if (groupList[0].entities[0] != NULL) std::cout << "not null"

Which makes me think even more that the initialization is going fine, but then why am I still getting an access violation error whenever I try to access that entity's members through the group's pointer list?

Perhaps it's a simple error but it's driving me mad trying to find it; all the tutorials I re-read about pointers convince me I've got the right idea, but somehow I must not.

0

Share this post


Link to post
Share on other sites
Modifying your vector of entities (typically inserting new entities) could reallocate the storage of the vector, invalidating all of the pointers in the group. There's also a problem if you remove or insert an entity ahead of where your group member resides, which could leave the pointer pointing to some entity, but no longer the correct one.

Note: if your pointer is no longer valid, it's not going to automatically change to NULL for you. I unfortunately have to debug pointers that are non-null but still totally wrong very often.
0

Share this post


Link to post
Share on other sites

As a solution, instead of storing a pointer/reference to a specific memory location, you should store an index into the vector. As long as you dont yourself rearrange the entities within the vector, you are guaranteed that the index of the entity within the vector will remain the same regardless of what the vector does with the actual memory location.

 

You need to give access to the entity vector for the code that accesses the entity through the index (what before was a pointer/reference) because you now depend on the vector to hand you the entity, wherever in RAM it resides at that moment.

 

You can still take references/pointers to objects stored in these memory rearranging containers, but you need to be absolutely certain that no operation is done on the container that could move the objects in memory (eg. nothing should be added/removed while you access the object through a raw pointer/reference)

1

Share this post


Link to post
Share on other sites

That was the problem, thanks guys.  Since the entity vector and the group vector are both accessed through their parent Scene, giving access to both when I need them shouldn't be a problem.  I don't know why I didn't just store indices to start with; I guess I thought there'd be more overhead using the index to access another vector than using a pointer/reference directly.  Ah well; wherever the bottleneck is going to be, it's probably not going to be in the difference between entList[groupList[0].entIndex[0]] and groupList[0].entities[0].  

 

Thanks again! smile.png

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