Just a quick note. I have managed to write Player Manager class which is kind a prototype.. the two issues that I am having are how to get an offset of a map.. if I am trying to set up offset to static DXDVECTOR3 variable inside Level class linker is complaining, passing as attribute well it is a option but then I need to modify other classes.
Second problem is click in a frame. actually I have just figured this out :).. wow sometimes one sec break and step back can do the trick.
Anyway deep beta presents PlayerManager prototype class – probably it will be totally modified but as far as now I have something like that:
// PlayerManager.h
#pragma once
#ifndef PLAYERMANAGER_H
#define PLAYERMANAGER_H
[...]
#include "Entity.h"
#include "Level.h"
class PlayerManager
{
private:
//players entities
static std::map playersEntities;
static std::map playersSelectedEntities;
public:
static PlayerManager* instance;
static void init();
static void registerPlayersEntity(Entity* playersEntity); // called in players unity type constructor
static void removePlayersEntity(Entity* playersEntity);
static Entity* getPlayersEntity(int id);
static void clearSelected();
static void addEntityToSelected(POINT mousePosition);
PlayerManager();
~PlayerManager();
};
#endif
// PlayerManager.cpp
#include "PlayerManager.h"
#include "Collision.h"
PlayerManager* PlayerManager::instance =0;
std::map PlayerManager::playersEntities = std::map ();
std::map PlayerManager::playersSelectedEntities = std::map ();
PlayerManager::PlayerManager(){}
void PlayerManager::init(){
PlayerManager::instance = new PlayerManager();
}
PlayerManager::~PlayerManager(){
//clear selected units list
std::map ::iterator iter = playersSelectedEntities.begin();
for(; iter != playersSelectedEntities.end(); ++iter){
delete iter->second;
iter->second = 0;
}
playersSelectedEntities.clear();
playersEntities.clear();
}
//register entity in players list
void PlayerManager::registerPlayersEntity(Entity* entity){
//register entity called only once and after registration in entity manager
// we have entity ID and I am pretty sure it will not dublicate.
playersEntities[entity->getID()] = entity;
}
void PlayerManager::removePlayersEntity(Entity* entity){
//removes selecred entity from players entities lise
std::map ::iterator iter = playersEntities.find(entity->getID());
if(iter != playersEntities.end())
playersEntities.erase(iter);
}
Entity* PlayerManager::getPlayersEntity(int id){
//returns pointer to entity defined by id
std::map ::iterator iter = playersEntities.find(id);
if(iter != playersEntities.end())
return iter->second;
return 0;
}
void PlayerManager::addEntityToSelected(POINT mousePosition){
D3DXVECTOR3 position(0.0f,0.0f,0.0f);
float radius = 1.0f;
D3DXVECTOR3 mPosition(mousePosition.x, mousePosition.y, 0.0f);
Circle mouseCircle = {mPosition, radius };
Circle unitCircle = {position, radius };
mouseCircle.position.x = mousePosition.x; // need to figure out how to apply offset
mouseCircle.position.y = mousePosition.y;
mouseCircle.position.z = 0.0f;
mouseCircle.radius = 2.0f;
std::map ::iterator iter = playersEntities.begin();
for(; iter != playersEntities.end(); ++iter){
unitCircle.position = iter->second->getPosition();
unitCircle.radius = 20.0f; // need to set this global instead of calculated based on number images etc like TILEBASEWIDTH or something
CollisionResults collisionResult = TestCollisionCircle(mouseCircle, unitCircle);
if(collisionResult == OVERLAPPING){
std::cout < < "AWESOME";
}else {
PlayerManager::clearSelected();
std::cout << "NOT";
}
}
}
void PlayerManager::clearSelected(){
std::map::iterator iter = playersSelectedEntities.begin();
for(; iter != playersSelectedEntities.end(); ++iter){
if(iter->second){
delete iter->second;
iter->second = 0;
}
}
playersSelectedEntities.clear();
}