Accessing other game objects

Started by
10 comments, last by pinebanana 11 years, 4 months ago
u can use template && typeid() :-)
sample ::


#include <vector>
#include <Windows.h>
#include <iostream>

class GameObject
{
public:
float x,y; //position :-)
virtual void onUpdate(){};
};
class Scene
{
std::vector<GameObject*> objects; //all objects in scene :)

public:
void update(); //update all objects :D
//Add New Object To Scene :->
template < class T> T* addObject(float _x, float _y)
{
T* l_maintype = new T;
GameObject* l_obj = (GameObject*)l_maintype;
l_obj->x = _x;
l_obj->y = _y;
objects.push_back(l_obj);
return l_maintype;
}
template < class T> T* getObjectFromFirst()
{
int l_size = objects.size();
int i = 0;
const type_info& l_type = typeid(T);
while( i < l_size)
{
if(typeid(*objects) == l_type)
return (T*)objects;
i++;
}
return NULL;
}
template < class T> T* getObjectFromLast()
{
int l_size = objects.size()-1;
const type_info& l_type = typeid(T);
while(l_size > -1)
{
if(typeid(*objects[l_size]) == l_type)
return (T*)objects[l_size];
l_size--;
}
return NULL;
}
template < class T> std::vector<T*> getObjects()
{
std::vector<T*> l_vec;
int l_size = objects.size();
int i = 0;
const type_info& l_type = typeid(T);
while( i < l_size)
{
if(typeid(*objects) == l_type)
l_vec.push_back( (T*)objects );
i++;
}
return l_vec;
}
};
void Scene::update()
{
int l_size = objects.size();
int i = 0;
while(i < l_size)
{
objects->onUpdate();
i++;
}
}
//----------------------------
class Player : public GameObject
{
public:
float m_speed;
void onUpdate();
};
void Player::onUpdate()
{
x += m_speed;
y += m_speed;
}

int main(int argc, char* argv[])
{
Scene l_scene;
l_scene.addObject<Player>(0, 0)->m_speed = 2;
l_scene.addObject<Player>(100, 100)->m_speed = 4;
l_scene.addObject<Player>(256, 256)->m_speed = 8;
while(1)
{
l_scene.update();
Sleep(1000);
std::cout << l_scene.getObjectFromFirst<Player>()->x << '\n';
}
std::cin.get();
return 0;
}
Advertisement

u can use template && typeid() :-)
sample ::


#include <vector>
#include <Windows.h>
#include <iostream>

class GameObject
{
public:
float x,y; //position :-)
virtual void onUpdate(){};
};
class Scene
{
std::vector<GameObject*> objects; //all objects in scene :)

public:
void update(); //update all objects :D
//Add New Object To Scene :->
template < class T> T* addObject(float _x, float _y)
{
T* l_maintype = new T;
GameObject* l_obj = (GameObject*)l_maintype;
l_obj->x = _x;
l_obj->y = _y;
objects.push_back(l_obj);
return l_maintype;
}
template < class T> T* getObjectFromFirst()
{
int l_size = objects.size();
int i = 0;
const type_info& l_type = typeid(T);
while( i < l_size)
{
if(typeid(*objects) == l_type)
return (T*)objects;
i++;
}
return NULL;
}
template < class T> T* getObjectFromLast()
{
int l_size = objects.size()-1;
const type_info& l_type = typeid(T);
while(l_size > -1)
{
if(typeid(*objects[l_size]) == l_type)
return (T*)objects[l_size];
l_size--;
}
return NULL;
}
template < class T> std::vector<T*> getObjects()
{
std::vector<T*> l_vec;
int l_size = objects.size();
int i = 0;
const type_info& l_type = typeid(T);
while( i < l_size)
{
if(typeid(*objects) == l_type)
l_vec.push_back( (T*)objects );
i++;
}
return l_vec;
}
};
void Scene::update()
{
int l_size = objects.size();
int i = 0;
while(i < l_size)
{
objects->onUpdate();
i++;
}
}
//----------------------------
class Player : public GameObject
{
public:
float m_speed;
void onUpdate();
};
void Player::onUpdate()
{
x += m_speed;
y += m_speed;
}

int main(int argc, char* argv[])
{
Scene l_scene;
l_scene.addObject<Player>(0, 0)->m_speed = 2;
l_scene.addObject<Player>(100, 100)->m_speed = 4;
l_scene.addObject<Player>(256, 256)->m_speed = 8;
while(1)
{
l_scene.update();
Sleep(1000);
std::cout << l_scene.getObjectFromFirst<Player>()->x << '\n';
}
std::cin.get();
return 0;
}



It's possible to not use type_id, or that for loop checking the type of the object. Plus I heard type_id was slow, and not supported on all platforms.

As I suggested in my previous posts, if you sort the objects added by type before-hand, it will be faster to access each GameObject.

anax - An open source C++ entity system

This topic is closed to new replies.

Advertisement