Jump to content

  • Log In with Google      Sign In   
  • Create Account


#Actualpinebanana

Posted 02 December 2012 - 05:05 AM

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 <img src='http://public.gamedev.net//public/style_emoticons/default/smile.png' class='bbc_emoticon' alt=':)' />

public:
void update(); //update all objects <img src='http://public.gamedev.net//public/style_emoticons/default/biggrin.png' class='bbc_emoticon' alt=':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[i]) == l_type)
	return (T*)objects[i];
   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[i]) == l_type)
	l_vec.push_back( (T*)objects[i] );
   i++;
  }
  return l_vec;
}
};
void Scene::update()
{
int l_size = objects.size();
int i = 0;
while(i < l_size)
{
  objects[i]->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.

#2pinebanana

Posted 02 December 2012 - 05:02 AM

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 <img src='http://public.gamedev.net//public/style_emoticons/default/smile.png' class='bbc_emoticon' alt=':)' />

public:
void update(); //update all objects <img src='http://public.gamedev.net//public/style_emoticons/default/biggrin.png' class='bbc_emoticon' alt=':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[i]) == l_type)
	return (T*)objects[i];
   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[i]) == l_type)
	l_vec.push_back( (T*)objects[i] );
   i++;
  }
  return l_vec;
}
};
void Scene::update()
{
int l_size = objects.size();
int i = 0;
while(i < l_size)
{
  objects[i]->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.

#1pinebanana

Posted 02 December 2012 - 05:02 AM

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 <img src='http://public.gamedev.net//public/style_emoticons/default/smile.png' class='bbc_emoticon' alt=':)' />

public:
void update(); //update all objects <img src='http://public.gamedev.net//public/style_emoticons/default/biggrin.png' class='bbc_emoticon' alt=':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[i]) == l_type)
	return (T*)objects[i];
   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[i]) == l_type)
	l_vec.push_back( (T*)objects[i] );
   i++;
  }
  return l_vec;
}
};
void Scene::update()
{
int l_size = objects.size();
int i = 0;
while(i < l_size)
{
  objects[i]->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.

PARTNERS