GameLogic - pree-sprint merge

This commit is contained in:
Dennis Andersen 2014-01-20 15:47:52 +01:00
parent b85439bd5e
commit 6c3c234be1
36 changed files with 631 additions and 451 deletions

View File

@ -75,7 +75,7 @@ namespace DanBias
if(!m_data->recieverObj->gameClientState->Init(m_data->recieverObj->nwClient)) if(!m_data->recieverObj->gameClientState->Init(m_data->recieverObj->nwClient))
return DanBiasClientReturn_Error; return DanBiasClientReturn_Error;
m_data->timer = new Utility::WinTimer(); m_data->timer = new Utility::WinTimer(); //why dynamic memory?
m_data->timer->reset(); m_data->timer->reset();
return DanBiasClientReturn_Sucess; return DanBiasClientReturn_Sucess;
} }

View File

@ -56,7 +56,6 @@ struct GameRecieverObject :public Oyster::Network::ProtocolRecieverObject
case protocol_Gameplay_CreateObject: case protocol_Gameplay_CreateObject:
{ {
Client::GameClientState::NewObj* protocolData = new Client::GameClientState::NewObj; Client::GameClientState::NewObj* protocolData = new Client::GameClientState::NewObj;
protocolData->object_ID = p[1].value.netInt; protocolData->object_ID = p[1].value.netInt;
protocolData->path = p[2].value.netCharPtr; protocolData->path = p[2].value.netCharPtr;

View File

@ -173,11 +173,6 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="Launcher.cpp" /> <ClCompile Include="Launcher.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DanBiasGame\DanBiasGame.vcxproj">
<Project>{2a1bc987-af42-4500-802d-89cd32fc1309}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@ -20,6 +20,7 @@ int WINAPI WinMain( HINSTANCE hinst, HINSTANCE prevInst, PSTR cmdLine, int cmdSh
//gameDesc.port = 15152; //gameDesc.port = 15152;
//gameDesc.IP = "193.11.184.196"; //gameDesc.IP = "193.11.184.196";
//gameDesc.IP = "193.11.184.31"; //gameDesc.IP = "193.11.184.31";
//gameDesc.IP = "194.47.150.56";
gameDesc.IP = "127.0.0.1"; gameDesc.IP = "127.0.0.1";
gameDesc.hinst = hinst; gameDesc.hinst = hinst;
gameDesc.nCmdShow = cmdShow; gameDesc.nCmdShow = cmdShow;

View File

@ -112,7 +112,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<DelayLoadDLLs>GameLogic_$(PlatformShortName)D.dll;%(DelayLoadDLLs);NetworkAPI_$(PlatformShortName)D.dll;GamePhysics_$(PlatformShortName)D.dll</DelayLoadDLLs> <DelayLoadDLLs>GameLogic_$(PlatformShortName)D.dll;NetworkAPI_$(PlatformShortName)D.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<AdditionalDependencies>NetworkAPI_$(PlatformShortName)D.lib;WindowManager_$(PlatformShortName)D.lib;GameLogic_$(PlatformShortName)D.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>NetworkAPI_$(PlatformShortName)D.lib;WindowManager_$(PlatformShortName)D.lib;GameLogic_$(PlatformShortName)D.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -128,7 +128,7 @@
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<DelayLoadDLLs>GameLogic_$(PlatformShortName)D.dll;%(DelayLoadDLLs);NetworkAPI_$(PlatformShortName)D.dll;GamePhysics_$(PlatformShortName)D.dll</DelayLoadDLLs> <DelayLoadDLLs>GameLogic_$(PlatformShortName)D.dll;NetworkAPI_$(PlatformShortName)D.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<AdditionalDependencies>NetworkAPI_$(PlatformShortName)D.lib;WindowManager_$(PlatformShortName)D.lib;GameLogic_$(PlatformShortName)D.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>NetworkAPI_$(PlatformShortName)D.lib;WindowManager_$(PlatformShortName)D.lib;GameLogic_$(PlatformShortName)D.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -148,7 +148,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<DelayLoadDLLs>GameLogic_$(PlatformShortName).dll;%(DelayLoadDLLs);NetworkAPI_$(PlatformShortName).dll;GamePhysics_$(PlatformShortName).dll</DelayLoadDLLs> <DelayLoadDLLs>GameLogic_$(PlatformShortName).dll;NetworkAPI_$(PlatformShortName).dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<AdditionalDependencies>NetworkAPI_$(PlatformShortName).lib;WindowManager_$(PlatformShortName).lib;GameLogic_$(PlatformShortName).lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>NetworkAPI_$(PlatformShortName).lib;WindowManager_$(PlatformShortName).lib;GameLogic_$(PlatformShortName).lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -168,7 +168,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<DelayLoadDLLs>GameLogic_$(PlatformShortName).dll;%(DelayLoadDLLs);NetworkAPI_$(PlatformShortName).dll;GamePhysics_$(PlatformShortName).dll</DelayLoadDLLs> <DelayLoadDLLs>GameLogic_$(PlatformShortName).dll;NetworkAPI_$(PlatformShortName).dll;%(DelayLoadDLLs)</DelayLoadDLLs>
<AdditionalDependencies>NetworkAPI_$(PlatformShortName).lib;WindowManager_$(PlatformShortName).lib;GameLogic_$(PlatformShortName).lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>NetworkAPI_$(PlatformShortName).lib;WindowManager_$(PlatformShortName).lib;GameLogic_$(PlatformShortName).lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
@ -206,9 +206,6 @@
<ClInclude Include="LobbySessions\NetworkSession.h" /> <ClInclude Include="LobbySessions\NetworkSession.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\GamePhysics\GamePhysics.vcxproj">
<Project>{104fa3e9-94d9-4e1d-a941-28a03bc8a095}</Project>
</ProjectReference>
<ProjectReference Include="..\..\Misc\Misc.vcxproj"> <ProjectReference Include="..\..\Misc\Misc.vcxproj">
<Project>{2ec4dded-8f75-4c86-a10b-e1e8eb29f3ee}</Project> <Project>{2ec4dded-8f75-4c86-a10b-e1e8eb29f3ee}</Project>
</ProjectReference> </ProjectReference>

View File

@ -4,7 +4,6 @@
#include "GameClient.h" #include "GameClient.h"
#include "..\LobbySessions\NetworkSession.h" #include "..\LobbySessions\NetworkSession.h"
#include <Game.h>
#include <Protocols.h> #include <Protocols.h>
using namespace Utility::DynamicMemory; using namespace Utility::DynamicMemory;
@ -13,7 +12,7 @@ using namespace GameLogic;
static int gameClientIDCount = 1; static int gameClientIDCount = 1;
GameClient::GameClient(SmartPointer<LobbyClient> client, Game::PlayerData* player, Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> value) GameClient::GameClient(SmartPointer<LobbyClient> client, IPlayerData* player, Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> value)
{ {
this->callbackValue = value; this->callbackValue = value;
this->client = client; this->client = client;
@ -37,13 +36,13 @@ void GameClient::SetCallback(Oyster::Callback::OysterCallback<void, NetworkSessi
this->callbackValue = value; this->callbackValue = value;
} }
GameLogic::Game::PlayerData* GameClient::GetPlayer() GameLogic::IPlayerData* GameClient::GetPlayer()
{ {
return this->player; return this->player;
} }
GameLogic::Game::PlayerData* GameClient::ReleasePlayer() GameLogic::IPlayerData* GameClient::ReleasePlayer()
{ {
GameLogic::Game::PlayerData *temp = this->player; GameLogic::IPlayerData *temp = this->player;
this->player = 0; this->player = 0;
return temp; return temp;
} }

View File

@ -6,22 +6,22 @@
#include "..\LobbySessions\LobbyClient.h" #include "..\LobbySessions\LobbyClient.h"
#include <PostBox\PostBox.h> #include <PostBox\PostBox.h>
#include <Game.h> #include <GameAPI.h>
namespace DanBias namespace DanBias
{ {
class GameClient: Oyster::Callback::CallbackObject<void, NetworkSession::NetEvent> class GameClient: Oyster::Callback::CallbackObject<void, NetworkSession::NetEvent>
{ {
public: public:
GameClient(Utility::DynamicMemory::SmartPointer<LobbyClient> client, GameLogic::Game::PlayerData* player, Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> value); GameClient(Utility::DynamicMemory::SmartPointer<LobbyClient> client, GameLogic::IPlayerData* player, Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> value);
virtual~GameClient(); virtual~GameClient();
void SetCallback(Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> value); void SetCallback(Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> value);
/* */ /* */
GameLogic::Game::PlayerData* GetPlayer(); GameLogic::IPlayerData* GetPlayer();
GameLogic::Game::PlayerData* ReleasePlayer(); GameLogic::IPlayerData* ReleasePlayer();
LobbyClient* GetClient() const; LobbyClient* GetClient() const;
Utility::DynamicMemory::SmartPointer<LobbyClient> ReleaseClient(); Utility::DynamicMemory::SmartPointer<LobbyClient> ReleaseClient();
@ -29,7 +29,7 @@ namespace DanBias
private: private:
//Utility::DynamicMemory::SmartPointer<GameLogic::Player> player; //Utility::DynamicMemory::SmartPointer<GameLogic::Player> player;
GameLogic::Game::PlayerData* player; GameLogic::IPlayerData* player;
Utility::DynamicMemory::SmartPointer<LobbyClient> client; Utility::DynamicMemory::SmartPointer<LobbyClient> client;
Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> callbackValue; Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> callbackValue;
int id; int id;

View File

@ -11,7 +11,7 @@
#include <WinTimer.h> #include <WinTimer.h>
#include <PostBox\IPostBox.h> #include <PostBox\IPostBox.h>
#include <Thread\OysterThread.h> #include <Thread\OysterThread.h>
#include <Game.h> #include <GameAPI.h>
#include <Queue.h> #include <Queue.h>
namespace DanBias namespace DanBias
@ -31,19 +31,6 @@ namespace DanBias
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<LobbyClient>> clients; Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<LobbyClient>> clients;
}; };
struct GameSessionEvent
{
union EventData
{
GameLogic::Game::PlayerData* player;
} data;
enum EventType
{
EventType_Player,
EventType_DynamicObject,
} value;
};
public: public:
GameSession(); GameSession();
virtual~GameSession(); virtual~GameSession();
@ -77,7 +64,7 @@ namespace DanBias
//Handles all general events //Handles all general events
void ParseGeneralEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c); void ParseGeneralEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c);
//Adds a client to the client list //Adds a client to the client list
void AddClient(Utility::DynamicMemory::SmartPointer<GameClient> obj); void InsertClient(Utility::DynamicMemory::SmartPointer<GameClient> obj);
//Removes a client from the client list //Removes a client from the client list
void RemoveClient(DanBias::GameClient* obj); void RemoveClient(DanBias::GameClient* obj);
//Sends a protocol ta all clients in session //Sends a protocol ta all clients in session
@ -97,11 +84,14 @@ namespace DanBias
Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<GameClient>> clients; Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<GameClient>> clients;
Oyster::IPostBox<DanBias::NetworkSession::NetEvent> *box; Oyster::IPostBox<DanBias::NetworkSession::NetEvent> *box;
Oyster::Thread::OysterThread worker; Oyster::Thread::OysterThread worker;
GameLogic::Game gameInstance; GameLogic::GameAPI& gameInstance;
GameLogic::ILevelData *levelData;
NetworkSession* owner; NetworkSession* owner;
bool isCreated; bool isCreated;
bool isRunning; bool isRunning;
Utility::Container::Queue<GameSessionEvent> modifiedClient; Utility::WinTimer timer;
static void ObjectMove(GameLogic::IObjectData* movedObject);
private: private:
friend class AdminInterface; friend class AdminInterface;

View File

@ -25,6 +25,8 @@ namespace DanBias
if( !this->box->IsEmpty() ) if( !this->box->IsEmpty() )
{ {
NetworkSession::NetEvent &e = this->box->Fetch(); NetworkSession::NetEvent &e = this->box->Fetch();
static int ii = 0;
printf("%i - Message recieved! [%i]\n", ii++, e.protocol[0].value);
if(e.protocol[0].type != Oyster::Network::NetAttributeType_Short) return; if(e.protocol[0].type != Oyster::Network::NetAttributeType_Short) return;
@ -38,10 +40,6 @@ namespace DanBias
void GameSession::ParseGameplayEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c) void GameSession::ParseGameplayEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c)
{ {
GameSessionEvent e;
e.data.player = c->GetPlayer();
e.value = GameSessionEvent::EventType_Player;
switch (p[protocol_INDEX_ID].value.netShort) switch (p[protocol_INDEX_ID].value.netShort)
{ {
case protocol_Gameplay_PlayerNavigation: case protocol_Gameplay_PlayerNavigation:
@ -60,9 +58,6 @@ namespace DanBias
if(p[6].value.netBool) //bool bStrafeLeft; if(p[6].value.netBool) //bool bStrafeLeft;
//world.v[3].y = -2; //world.v[3].y = -2;
c->GetPlayer()->Move(GameLogic::PLAYER_MOVEMENT_LEFT); c->GetPlayer()->Move(GameLogic::PLAYER_MOVEMENT_LEFT);
} }
break; break;
case protocol_Gameplay_PlayerMouseMovement: case protocol_Gameplay_PlayerMouseMovement:
@ -77,11 +72,7 @@ namespace DanBias
case protocol_Gameplay_ObjectPosition: case protocol_Gameplay_ObjectPosition:
break; break;
} }
this->modifiedClient.Push(e);
} }
void GameSession::ParseGeneralEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c) void GameSession::ParseGeneralEvent(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c)
@ -116,5 +107,15 @@ namespace DanBias
} }
} }
void GameSession::ObjectMove(GameLogic::IObjectData* movedObject)
{
//if (movedObject->)
//{
//
//}
//movedObject->GetOrientation();
}
}//End namespace DanBias }//End namespace DanBias

View File

@ -20,6 +20,7 @@ using namespace GameLogic;
namespace DanBias namespace DanBias
{ {
GameSession::GameSession() GameSession::GameSession()
:gameInstance(GameAPI::Instance())
{ {
this->owner = 0; this->owner = 0;
this->box = 0; this->box = 0;
@ -36,30 +37,60 @@ namespace DanBias
bool GameSession::Create(GameDescription& desc) bool GameSession::Create(GameDescription& desc)
{ {
/* Do some error checking */
if(desc.clients.Size() == 0) return false; if(desc.clients.Size() == 0) return false;
if(!desc.owner) return false; if(!desc.owner) return false;
if(!desc.mapName.size()) return false; if(!desc.mapName.size()) return false;
if(this->isCreated) return false; if(this->isCreated) return false;
/* standard initialization of some data */
this->clients.Resize(desc.clients.Size()); this->clients.Resize(desc.clients.Size());
this->box = new PostBox<NetworkSession::NetEvent>(); this->box = new PostBox<NetworkSession::NetEvent>();
this->owner = desc.owner; this->owner = desc.owner;
/* Initiate the game instance */
if(!this->gameInstance.Initiate())
{
printf("Failed to initiate the game instance\n");
}
/* Create the game level */
if(!(this->levelData = this->gameInstance.CreateLevel()))
{
printf("Level not created!");
return false;
}
/* Create a callback object */
Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> c; Oyster::Callback::OysterCallback<void, NetworkSession::NetEvent> c;
c.value.callbackPostBox = this->box; c.value.callbackPostBox = this->box;
c.callbackType = Oyster::Callback::CallbackType_PostBox; c.callbackType = Oyster::Callback::CallbackType_PostBox;
/* Create the players in the game instance */
GameLogic::IPlayerData* p = 0;
for (unsigned int i = 0; i < desc.clients.Size(); i++) for (unsigned int i = 0; i < desc.clients.Size(); i++)
{ {
this->clients[i] = new GameClient(desc.clients[i], gameInstance.CreatePlayer(), c); if( (p = this->gameInstance.CreatePlayer()) )
{
this->clients[i] = new GameClient(desc.clients[i], p, c);
}
else
{
printf("Failed to create player (%i)\n", i);
}
} }
if(this->worker.Create(this, true, true) != OYSTER_THREAD_ERROR_SUCCESS) return false; /* Create the worker thread */
if(this->worker.Create(this, true, true) != OYSTER_THREAD_ERROR_SUCCESS)
return false;
this->worker.SetPriority(Oyster::Thread::OYSTER_THREAD_PRIORITY_3);
/* Set some gameinstance data options */
this->gameInstance.SetSubscription(GameLogic::GameEvent::ObjectEventFunctionType_OnMove, GameSession::ObjectMove);
this->isCreated = true; this->isCreated = true;
return this->isCreated;
return true;
} }
void GameSession::Run() void GameSession::Run()
@ -69,8 +100,7 @@ namespace DanBias
if(this->clients.Size() > 0) if(this->clients.Size() > 0)
{ {
this->worker.SetPriority(OYSTER_THREAD_PRIORITY_1);
this->worker.SetPriority(OYSTER_THREAD_PRIORITY_2);
this->isRunning = true; this->isRunning = true;
} }
} }
@ -84,7 +114,7 @@ namespace DanBias
c.callbackType = Oyster::Callback::CallbackType_PostBox; c.callbackType = Oyster::Callback::CallbackType_PostBox;
SmartPointer<GameClient> obj = new GameClient(client, this->gameInstance.CreatePlayer(), c); SmartPointer<GameClient> obj = new GameClient(client, this->gameInstance.CreatePlayer(), c);
AddClient(obj); InsertClient(obj);
return true; return true;
} }
@ -105,7 +135,7 @@ namespace DanBias
this->Clean(); this->Clean();
} }
void GameSession::AddClient(SmartPointer<GameClient> obj) void GameSession::InsertClient(SmartPointer<GameClient> obj)
{ {
for (unsigned int i = 0; i < clients.Size(); i++) for (unsigned int i = 0; i < clients.Size(); i++)
{ {

View File

@ -10,6 +10,11 @@
#include <Windows.h> #include <Windows.h>
#include <OysterMath.h> #include <OysterMath.h>
#define DELTA_TIME_24 0.04166666666666666666666666666667f
#define DELTA_TIME_30 0.03333333333333333333333333333333f
#define DELTA_TIME_60 0.01666666666666666666666666666667f
#define DELTA_TIME_120 0.00833333333333333333333333333333f
using namespace Utility::DynamicMemory; using namespace Utility::DynamicMemory;
using namespace Oyster; using namespace Oyster;
using namespace Oyster::Network; using namespace Oyster::Network;
@ -19,6 +24,8 @@ using namespace GameLogic;
namespace DanBias namespace DanBias
{ {
bool GameSession::DoWork( ) bool GameSession::DoWork( )
{
if(this->isRunning)
{ {
if(GetAsyncKeyState(VK_UP)) if(GetAsyncKeyState(VK_UP))
{ {
@ -34,39 +41,32 @@ namespace DanBias
Sleep(100); Sleep(100);
} }
double dt = this->timer.getElapsedSeconds();
gameInstance.SetFrameTimeLength((float)dt);
if(dt >= DELTA_TIME_60)
{
this->ParseEvents(); this->ParseEvents();
this->gameInstance.NewFrame(); this->gameInstance.NewFrame();
this->UpdateGameObjects(); this->UpdateGameObjects();
this->timer.reset();
}
}
return this->isRunning; return this->isRunning;
} }
void GameSession::UpdateGameObjects() void GameSession::UpdateGameObjects()
{ {
while(!this->modifiedClient.IsEmpty()) if(clients.Size() >= 1 && clients[0])
{
//There is something that needs update
GameSessionEvent e = this->modifiedClient.Pop();
switch (e.value)
{
case GameSessionEvent::EventType_Player:
//e.data.player->GetOrientation();
break;
}
}
if(clients.Size() == 1)
{ {
Oyster::Math::Float4x4 world = this->clients[0]->GetPlayer()->GetOrientation(); Oyster::Math::Float4x4 world = this->clients[0]->GetPlayer()->GetOrientation();
Protocol_ObjectPosition p(world, 1); Protocol_ObjectPosition p(world, 1);
Send(p.GetProtocol()); Send(p.GetProtocol());
Sleep(100); //Sleep(100);
} }
} }

View File

@ -1,19 +1,10 @@
#include "Game.h" #include "Game.h"
#include "Player.h"
#include "Level.h"
#include <DynamicArray.h>
#include <GID.h>
#include <PhysicsAPI.h>
#include <WinTimer.h>
using namespace GameLogic; using namespace GameLogic;
using namespace Utility::DynamicMemory; using namespace Utility::DynamicMemory;
using namespace Oyster::Physics; using namespace Oyster::Physics;
#define DELTA_TIME 0.01666666666666666666666666666667f template<typename T> int InsertObject(DynamicArray<T*>& list, T* obj)
template<typename T>
int InsertObject(DynamicArray<T*>& list, T* obj)
{ {
for (unsigned int i = 0; i < list.Size(); i++) for (unsigned int i = 0; i < list.Size(); i++)
{ {
@ -26,8 +17,7 @@ int InsertObject(DynamicArray<T*>& list, T* obj)
list.Push(obj); list.Push(obj);
return list.Size() - 1; return list.Size() - 1;
} }
template<typename T> template<typename T> int RemoveObject(DynamicArray<T*>& list, T* obj)
int RemoveObject(DynamicArray<T*>& list, T* obj)
{ {
for (unsigned int i = 0; i < list.Size(); i++) for (unsigned int i = 0; i < list.Size(); i++)
{ {
@ -41,37 +31,33 @@ int RemoveObject(DynamicArray<T*>& list, T* obj)
return list.Size() - 1; return list.Size() - 1;
} }
struct Game::PrivateData
{
PrivateData()
{ }
~PrivateData() Game gameInstance;
GameAPI& GameAPI::Instance()
{ {
for (unsigned int i = 0; i < players.Size(); i++) return gameInstance;
{
this->players[i]->player = 0;
} }
}
DynamicArray<PlayerData*> players;
LevelData* level;
Utility::WinTimer timer;
}myData;
Game::Game(void) Game::Game(void)
{ : initiated(false)
myData = new PrivateData(); , onMoveFnc(0)
} , onDeadFnc(0)
, frameTime(1.0f/120.0f)
{}
Game::~Game(void) Game::~Game(void)
{ {
if(myData) for (unsigned int i = 0; i < gameInstance.players.Size(); i++)
{ {
delete myData; delete gameInstance.players[i];
} }
gameInstance.players.Clear();
delete this->level;
this->level = 0;
initiated = false;
} }
void Game::GetAllPlayerPositions() const void Game::GetAllPlayerPositions() const
@ -81,21 +67,23 @@ void Game::GetAllPlayerPositions() const
Game::PlayerData* Game::CreatePlayer() Game::PlayerData* Game::CreatePlayer()
{ {
Player *newPlayer = new Player(); // Find a free space in array or insert at end
PlayerData *newPdata = new PlayerData(); int id = InsertObject(this->players, (PlayerData*)0);
newPdata->player = newPlayer;
int id = InsertObject(this->myData->players, newPdata); this->players[id] = new PlayerData();
return this->myData->players[id]; this->players[id]->player->GetRigidBody()->SetSubscription(Game::PhysicsOnMove);
return this->players[id];
} }
Game::LevelData* Game::CreateLevel() Game::LevelData* Game::CreateLevel()
{ {
Level *newLevel = new Level(); if(this->level) return this->level;
newLevel->InitiateLevel(1000);
LevelData *newLdata = new LevelData(); this->level = new LevelData();
newLdata->level = newLevel; this->level->level->InitiateLevel(1000);
myData->level = newLdata;
return myData->level; return this->level;
} }
void Game::CreateTeam() void Game::CreateTeam()
@ -103,27 +91,72 @@ void Game::CreateTeam()
} }
void Game::NewFrame() bool Game::NewFrame()
{ {
double dt = this->myData->timer.getElapsedSeconds(); for (unsigned int i = 0; i < this->players.Size(); i++)
//60 fps sec is currently staticly
if(dt >= DELTA_TIME)
{ {
for (int i = 0; i < this->myData->players.Size(); i++) if(this->players[i]->player) this->players[i]->player->BeginFrame();
{
if(this->myData->players[i]->player)
this->myData->players[i]->player->BeginFrame();
} }
API::Instance().Update(); API::Instance().Update();
for (int i = 0; i < this->myData->players.Size(); i++) for (unsigned int i = 0; i < this->players.Size(); i++)
{ {
if(this->myData->players[i]->player) if(this->players[i]->player) this->players[i]->player->EndFrame();
this->myData->players[i]->player->EndFrame();
} }
this->myData->timer.reset(); return true;
} }
void Game::SetFPS(int FPS)
{
this->frameTime = 1.0f / FPS;
} }
void Game::SetFrameTimeLength( float seconds )
{
this->frameTime = seconds;
}
void Game::SetSubscription(GameEvent::ObjectEventFunctionType type, GameEvent::ObjectEventFunction functionPointer)
{
switch (type)
{
case GameLogic::GameEvent::ObjectEventFunctionType_OnMove:
this->onMoveFnc = functionPointer;
break;
case GameLogic::GameEvent::ObjectEventFunctionType_OnDead:
this->onDeadFnc = functionPointer;
break;
}
}
bool Game::Initiate()
{
API::Instance().Init((int)pow(2u, 9u), 1u, Oyster::Math::Float3());
API::Instance().SetSubscription(Game::PhysicsOnDestroy);
this->initiated = true;
return true;
}
float Game::GetFrameTime() const
{
return this->frameTime;
}
/**********************************************/
/*********** Private methods ******************/
/***************************************************************************************************/
void Game::PhysicsOnMove(const ICustomBody *object)
{
IObjectData* temp = 0;
//IObjectData* temp = ((IObjectData*)object->GetDataTag());
if(gameInstance.onMoveFnc) gameInstance.onMoveFnc(temp);
}
void Game::PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer<ICustomBody> proto)
{
if(gameInstance.onDeadFnc) gameInstance.onDeadFnc(0);
}

View File

@ -5,112 +5,84 @@
#ifndef GAME_H #ifndef GAME_H
#define GAME_H #define GAME_H
#include "GameLogicDef.h" //Includes windows so we need to undef minmax
#include "GameLogicStates.h" #define NOMINMAX
#include <OysterMath.h> #include <vld.h>
#include "GameAPI.h"
#include "Player.h"
#include "Level.h"
#include <DynamicArray.h>
#include <GID.h>
#include <PhysicsAPI.h>
#include <WinTimer.h>
namespace GameLogic namespace GameLogic
{ {
class Player; class Game :public GameAPI
class Level;
class DANBIAS_GAMELOGIC_DLL Game
{ {
public: public:
struct DANBIAS_GAMELOGIC_DLL PlayerData class PlayerData :public IPlayerData
{ {
private: public:
friend class Game;
Player *player;
PlayerData(); PlayerData();
PlayerData(int playerID,int teamID); PlayerData(int playerID,int teamID);
~PlayerData(); ~PlayerData();
public: void Move(const PLAYER_MOVEMENT &movement) override;
/******************************************************** void UseWeapon(int playerID, const WEAPON_FIRE &usage) override;
* Moves the chosen player based on input int GetTeamID() const override;
* @param playerID: ID of the player you want to recieve the message PLAYER_STATE GetState() const override;
* @param movement: enum value on what kind of action is to be taken Oyster::Math::Float3 GetPosition() override;
********************************************************/ Oyster::Math::Float4x4 GetOrientation() override;
void Move(const PLAYER_MOVEMENT &movement); int GetID() const override;
OBJECT_TYPE GetObjectType() const override;
/******************************************************** Player *player;
* Uses the chosen players weapon based on input
* @param playerID: ID of the player you want to recieve the message
* @param Usage: enum value on what kind of action is to be taken
********************************************************/
void UseWeapon(int playerID, const WEAPON_FIRE &usage);
/********************************************************
* Gets players position
* @param playerID: ID of the player whos position you want
********************************************************/
Oyster::Math::Float3 GetPosition();
/********************************************************
* Gets players current orientation
* @param playerID: ID of the player whos position you want
********************************************************/
Oyster::Math::Float4x4 GetOrientation();
/********************************************************
* Check player state
* @return The current player state
********************************************************/
PLAYER_STATE GetState() const;
/***/
int GetID() const;
/***/
int GetTeamID() const;
}; };
struct DANBIAS_GAMELOGIC_DLL LevelData class LevelData :public ILevelData
{ {
private: public:
friend class Game;
Level *level;
LevelData(); LevelData();
~LevelData(); ~LevelData();
Oyster::Math::Float3 GetPosition() override;
Oyster::Math::Float4x4 GetOrientation() override;
int GetID() const override;
OBJECT_TYPE GetObjectType() const override;
public: Level *level;
}; };
public: public:
Game(void); Game();
~Game(void); ~Game();
/******************************************************** void GetAllPlayerPositions() const override;
* Gets the position of all players currently in the game PlayerData* CreatePlayer() override;
********************************************************/ LevelData* CreateLevel() override;
void GetAllPlayerPositions() const; void CreateTeam() override;
bool NewFrame() override;
void SetFPS( int FPS ) override;
void SetFrameTimeLength( float seconds ) override;
void SetSubscription(GameEvent::ObjectEventFunctionType type, GameEvent::ObjectEventFunction functionPointer) override;
bool Initiate() override;
/******************************************************** float GetFrameTime() const;
* Creates a player and returns PlayerData
********************************************************/
PlayerData* CreatePlayer();
/********************************************************
* Creates a level and returns LevelData
********************************************************/
LevelData* CreateLevel();
/********************************************************
* Creates a team
********************************************************/
void CreateTeam();
/********************************************************
* Runs a update of the gamelogic and physics
********************************************************/
void NewFrame();
private: private:
struct PrivateData; static void PhysicsOnMove(const Oyster::Physics::ICustomBody *object);
PrivateData *myData; static void PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer<Oyster::Physics::ICustomBody> proto);
private:
Utility::DynamicMemory::DynamicArray<PlayerData*> players;
LevelData* level;
float frameTime;
bool initiated;
GameEvent::ObjectEventFunction onDeadFnc;
GameEvent::ObjectEventFunction onMoveFnc;
}; };
} }

View File

@ -0,0 +1,160 @@
/////////////////////////////////////////////////////////////////////
// Created by [Erik Persson] [2013]
/////////////////////////////////////////////////////////////////////
#ifndef GAME_API_H
#define GAME_API_H
//Includes windows so we need to undef minmax
#define NOMINMAX
#include <vld.h>
#include "GameLogicDef.h"
#include "GameLogicStates.h"
#include <OysterMath.h>
namespace GameLogic
{
class IObjectData;
/**
* Collection of various event structures that may be used to get events grom the game.
*/
namespace GameEvent
{
/**
* The type of event to listen on.
*/
enum ObjectEventFunctionType
{
ObjectEventFunctionType_OnMove,
ObjectEventFunctionType_OnDead,
};
typedef void(*ObjectEventFunction)(IObjectData* object); // Callback method that recieves and object
//etc...
};
/**
* An object that collects the standard usage functions
*/
class IObjectData
{
public:
/********************************************************
* Gets players position
* @param playerID: ID of the player whos position you want
********************************************************/
virtual Oyster::Math::Float3 GetPosition() = 0;
/********************************************************
* Gets players current orientation
* @param playerID: ID of the player whos position you want
********************************************************/
virtual Oyster::Math::Float4x4 GetOrientation() = 0;
/** Get the uniuqe id for the object
* @return The id for the object.
*/
virtual int GetID() const = 0;
/** Get the type of the object
* @return The OBJECT_TYPE of the object is returned
*/
virtual OBJECT_TYPE GetObjectType() const = 0;
};
class IPlayerData :public IObjectData
{
public:
/********************************************************
* Moves the chosen player based on input
* @param playerID: ID of the player you want to recieve the message
* @param movement: enum value on what kind of action is to be taken
********************************************************/
virtual void Move(const PLAYER_MOVEMENT &movement) = 0;
/********************************************************
* Uses the chosen players weapon based on input
* @param playerID: ID of the player you want to recieve the message
* @param Usage: enum value on what kind of action is to be taken
********************************************************/
virtual void UseWeapon(int playerID, const WEAPON_FIRE &usage) = 0;
/***/
virtual int GetTeamID() const = 0;
/********************************************************
* Check player state
* @return The current player state
********************************************************/
virtual PLAYER_STATE GetState() const = 0;
};
class ILevelData :public IObjectData
{
public:
};
class DANBIAS_GAMELOGIC_DLL GameAPI
{
public:
/** A global function to get an instance of the API
* @return Returns the GameAPI instance
*/
static GameAPI& Instance( void );
public:
/** Initiates the Game instance.
* - This method must be called before the API can be used.
* @return If the return value is false, something went wrong.
*/
virtual bool Initiate( void ) = 0;
/********************************************************
* Gets the position of all players currently in the game
********************************************************/
virtual void GetAllPlayerPositions( void ) const = 0;
/** Creates a player
* @return Returns a IPlayerData container to use for player manipulation.
*/
virtual IPlayerData* CreatePlayer( void ) = 0;
/** Creates a level
* @return Returns a ILevelData container to use for level manipulation
*/
virtual ILevelData* CreateLevel( void ) = 0;
/** Creates a team
* @return ?
*/
virtual void CreateTeam( void ) = 0;
/** Runs a update of the gamelogic and physics
* @return Returns true if a frame was proccessed
*/
virtual bool NewFrame( void ) = 0;
/** Set the frame time in fps
* @param FPS The fps to set
*/
virtual void SetFPS( int FPS = 60 ) = 0;
/** Set the frames time in seconds
* @param seconds The frame length
*/
virtual void SetFrameTimeLength( float seconds ) = 0;
/** Set a specific object event subscription callback
* @param
*/
virtual void SetSubscription(GameEvent::ObjectEventFunctionType type, GameEvent::ObjectEventFunction functionPointer) = 0;
};
}
#endif

View File

@ -69,26 +69,30 @@
<OutDir>$(SolutionDir)..\Bin\DLL\</OutDir> <OutDir>$(SolutionDir)..\Bin\DLL\</OutDir>
<IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir> <IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir>
<TargetName>$(ProjectName)_$(PlatformShortName)D</TargetName> <TargetName>$(ProjectName)_$(PlatformShortName)D</TargetName>
<LibraryPath>$(SolutionDir)..\Bin\DLL;$(LibraryPath)</LibraryPath> <LibraryPath>$(SolutionDir)..\Bin\DLL;C:\Program Files %28x86%29\Visual Leak Detector\lib\Win32;$(LibraryPath)</LibraryPath>
<TargetExt>.dll</TargetExt> <TargetExt>.dll</TargetExt>
<IncludePath>C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)..\Bin\DLL\</OutDir> <OutDir>$(SolutionDir)..\Bin\DLL\</OutDir>
<IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir> <IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir>
<TargetName>$(ProjectName)_$(PlatformShortName)</TargetName> <TargetName>$(ProjectName)_$(PlatformShortName)</TargetName>
<LibraryPath>$(SolutionDir)..\Bin\DLL;$(LibraryPath)</LibraryPath> <LibraryPath>$(SolutionDir)..\Bin\DLL;C:\Program Files %28x86%29\Visual Leak Detector\lib\Win32;$(LibraryPath)</LibraryPath>
<IncludePath>C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)..\Bin\DLL\</OutDir> <OutDir>$(SolutionDir)..\Bin\DLL\</OutDir>
<IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir> <IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir>
<TargetName>$(ProjectName)_$(PlatformShortName)D</TargetName> <TargetName>$(ProjectName)_$(PlatformShortName)D</TargetName>
<LibraryPath>$(SolutionDir)..\Bin\DLL;$(LibraryPath)</LibraryPath> <LibraryPath>$(SolutionDir)..\Bin\DLL;C:\Program Files %28x86%29\Visual Leak Detector\lib\Win64;$(LibraryPath)</LibraryPath>
<IncludePath>C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)..\Bin\DLL\</OutDir> <OutDir>$(SolutionDir)..\Bin\DLL\</OutDir>
<IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir> <IntDir>$(SolutionDir)..\Obj\$(ProjectName)\$(PlatformShortName)\$(Configuration)\</IntDir>
<TargetName>$(ProjectName)_$(PlatformShortName)</TargetName> <TargetName>$(ProjectName)_$(PlatformShortName)</TargetName>
<LibraryPath>$(SolutionDir)..\Bin\DLL;$(LibraryPath)</LibraryPath> <LibraryPath>$(SolutionDir)..\Bin\DLL;C:\Program Files %28x86%29\Visual Leak Detector\lib\Win64;$(LibraryPath)</LibraryPath>
<IncludePath>C:\Program Files %28x86%29\Visual Leak Detector\include;$(IncludePath)</IncludePath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
@ -174,6 +178,7 @@
<ClInclude Include="CollisionManager.h" /> <ClInclude Include="CollisionManager.h" />
<ClInclude Include="DynamicObject.h" /> <ClInclude Include="DynamicObject.h" />
<ClInclude Include="Game.h" /> <ClInclude Include="Game.h" />
<ClInclude Include="GameAPI.h" />
<ClInclude Include="GameLogicDef.h" /> <ClInclude Include="GameLogicDef.h" />
<ClInclude Include="GameLogicStates.h" /> <ClInclude Include="GameLogicStates.h" />
<ClInclude Include="GameMode.h" /> <ClInclude Include="GameMode.h" />

View File

@ -24,7 +24,8 @@ namespace GameLogic
{ {
OBJECT_TYPE_PLAYER = 0, OBJECT_TYPE_PLAYER = 0,
OBJECT_TYPE_BOX = 1, OBJECT_TYPE_BOX = 1,
OBJECT_TYPE_UNKNOWN = 2, OBJECT_TYPE_WORLD = 2,
OBJECT_TYPE_UNKNOWN = -1,
}; };
enum WEAPON_FIRE enum WEAPON_FIRE

View File

@ -3,28 +3,13 @@
using namespace GameLogic; using namespace GameLogic;
struct GameMode::PrivateData
{
PrivateData()
{
}
~PrivateData()
{
}
}myData;
GameMode::GameMode() GameMode::GameMode()
{ {
myData = new PrivateData();
} }
GameMode::~GameMode(void) GameMode::~GameMode(void)
{ {
delete myData;
} }

View File

@ -13,9 +13,9 @@ namespace GameLogic
public: public:
GameMode(void); GameMode(void);
~GameMode(void); ~GameMode(void);
private: private:
struct PrivateData;
PrivateData *myData;
}; };
} }

View File

@ -5,10 +5,33 @@ using namespace GameLogic;
Game::LevelData::LevelData() Game::LevelData::LevelData()
{ {
this->level = new Level();
} }
Game::LevelData::~LevelData() Game::LevelData::~LevelData()
{ {
delete this->level;
this->level = 0;
}
Oyster::Math::Float3 Game::LevelData::GetPosition()
{
//return this->level->GetCenter();
return Oyster::Math::Float3();
}
Oyster::Math::Float4x4 Game::LevelData::GetOrientation()
{
//return this->level->GetOrientation();
return Oyster::Math::Float4x4();
}
int Game::LevelData::GetID() const
{
//this->level->GetID();
return -1;
}
OBJECT_TYPE Game::LevelData::GetObjectType() const
{
//return this->level->GetType();
return OBJECT_TYPE_UNKNOWN;
} }

View File

@ -5,15 +5,15 @@ using namespace GameLogic;
Game::PlayerData::PlayerData() Game::PlayerData::PlayerData()
{ {
this->player = new Player();
} }
Game::PlayerData::PlayerData(int playerID,int teamID) Game::PlayerData::PlayerData(int playerID,int teamID)
{ {
this->player = new Player();
} }
Game::PlayerData::~PlayerData() Game::PlayerData::~PlayerData()
{ {
delete this->player;
} }
void Game::PlayerData::Move(const PLAYER_MOVEMENT &movement) void Game::PlayerData::Move(const PLAYER_MOVEMENT &movement)
@ -44,3 +44,7 @@ int Game::PlayerData::GetTeamID() const
{ {
return this->player->GetTeamID(); return this->player->GetTeamID();
} }
OBJECT_TYPE Game::PlayerData::GetObjectType() const
{
return this->player->GetType();
}

View File

@ -1,47 +1,16 @@
#include "Level.h" #include "Level.h"
#include "StaticObject.h" #include "CollisionManager.h"
#include "DynamicObject.h"
#include "GameMode.h"
#include "Player.h"
#include "PhysicsAPI.h"
#include "TeamManager.h"
#include "DynamicArray.h"
using namespace GameLogic; using namespace GameLogic;
using namespace Utility::DynamicMemory; using namespace Utility::DynamicMemory;
using namespace Oyster::Physics; using namespace Oyster::Physics;
struct Level::PrivateData
{
PrivateData()
{
}
~PrivateData()
{
}
SmartPointer<TeamManager> teamManager;
DynamicArray<SmartPointer<StaticObject>> staticObjects;
DynamicArray<SmartPointer<DynamicObject>> dynamicObjects;
SmartPointer<GameMode> gameMode;
SmartPointer<ICustomBody> rigidBodyLevel;
}myData;
Level::Level(void) Level::Level(void)
{ {
myData = new PrivateData();
} }
Level::~Level(void) Level::~Level(void)
{ {
delete myData;
} }
void Level::InitiateLevel(std::string levelPath) void Level::InitiateLevel(std::string levelPath)
@ -50,39 +19,40 @@ void Level::InitiateLevel(std::string levelPath)
} }
void Level::InitiateLevel(float radius) void Level::InitiateLevel(float radius)
{ {
API::SphericalBodyDescription sbDesc; //API::SphericalBodyDescription sbDesc;
sbDesc.centerPosition = Oyster::Math::Float4(0,0,0,1); //sbDesc.centerPosition = Oyster::Math::Float4(0,0,0,1);
sbDesc.ignoreGravity = true; //sbDesc.ignoreGravity = true;
sbDesc.radius = radius; //sbDesc.radius = radius;
sbDesc.mass = 1e16; //10^16 //sbDesc.mass = 1e16f; //10^16
sbDesc.subscription = CollisionManager::LevelCollision; //sbDesc.mass = 0; //10^16
//sbDesc.subscription_onCollision = CollisionManager::LevelCollision;
//
//ICustomBody* rigidBody = API::Instance().CreateRigidBody(sbDesc).Release();
//API::Instance().AddObject(rigidBody);
ICustomBody* rigidBody = API::Instance().CreateRigidBody(sbDesc).Release(); //API::Gravity gravityWell;
API::Instance().AddObject(rigidBody); //
//gravityWell.gravityType = API::Gravity::GravityType_Well;
API::Gravity gravityWell; //gravityWell.well.mass = 1e16f;
//gravityWell.well.position = Oyster::Math::Float4(0,0,0,1);
gravityWell.gravityType = API::Gravity::GravityType_Well; //
gravityWell.well.mass = (float)1e16; //API::Instance().AddGravity(gravityWell);
gravityWell.well.position = Oyster::Math::Float4(0,0,0,1);
API::Instance().AddGravity(gravityWell);
} }
void Level::AddPlayerToTeam(Player *player, int teamID) void Level::AddPlayerToTeam(Player *player, int teamID)
{ {
myData->teamManager->AddPlayerToTeam(player,teamID); this->teamManager.AddPlayerToTeam(player,teamID);
} }
void Level::CreateTeam(int teamSize) void Level::CreateTeam(int teamSize)
{ {
myData->teamManager->CreateTeam(teamSize); this->teamManager.CreateTeam(teamSize);
} }
void Level::RespawnPlayer(Player *player) void Level::RespawnPlayer(Player *player)
{ {
myData->teamManager->RespawnPlayerRandom(player); this->teamManager.RespawnPlayerRandom(player);
} }

View File

@ -4,7 +4,15 @@
#ifndef LEVEL_H #ifndef LEVEL_H
#define LEVEL_H #define LEVEL_H
#include <string> #include <string>
#include "Player.h" #include "Player.h"
#include "StaticObject.h"
#include "DynamicObject.h"
#include "GameMode.h"
#include "Player.h"
#include "PhysicsAPI.h"
#include "TeamManager.h"
#include "DynamicArray.h"
namespace GameLogic namespace GameLogic
{ {
@ -44,10 +52,11 @@ namespace GameLogic
void RespawnPlayer(Player *player); void RespawnPlayer(Player *player);
private: private:
TeamManager teamManager;
private: Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<StaticObject>> staticObjects;
struct PrivateData; Utility::DynamicMemory::DynamicArray<Utility::DynamicMemory::SmartPointer<DynamicObject>> dynamicObjects;
PrivateData *myData; GameMode gameMode;
Utility::DynamicMemory::SmartPointer<Oyster::Physics::ICustomBody> rigidBodyLevel;
}; };

View File

@ -3,6 +3,7 @@
#include "CollisionManager.h" #include "CollisionManager.h"
#include "GID.h" #include "GID.h"
#include "PhysicsAPI.h" #include "PhysicsAPI.h"
#include "Game.h"
using namespace GameLogic; using namespace GameLogic;
@ -10,6 +11,8 @@ using namespace GameLogic;
using namespace Oyster::Math; using namespace Oyster::Math;
using namespace Oyster::Physics; using namespace Oyster::Physics;
const Game *Object::gameInstance = (Game*)(&Game::Instance());
Object::Object() Object::Object()
{ {
API::SimpleBodyDescription sbDesc; API::SimpleBodyDescription sbDesc;
@ -34,7 +37,7 @@ Object::Object(void* collisionFunc, OBJECT_TYPE type)
//sbDesc.centerPosition = //sbDesc.centerPosition =
//poi //poi
ICustomBody* temp = rigidBody = API::Instance().CreateRigidBody(sbDesc).Release(); this->rigidBody = API::Instance().CreateRigidBody(sbDesc).Release();
Oyster::Physics::API::Instance().AddObject(rigidBody); Oyster::Physics::API::Instance().AddObject(rigidBody);
@ -66,3 +69,14 @@ Oyster::Physics::ICustomBody* Object::GetRigidBody()
{ {
return this->rigidBody; return this->rigidBody;
} }
void Object::BeginFrame()
{
this->rigidBody->SetState(this->setState);
}
void Object::EndFrame()
{
this->rigidBody->GetState(this->getState);
this->setState = this->getState;
}

View File

@ -6,12 +6,13 @@
#ifndef OBJECT_H #ifndef OBJECT_H
#define OBJECT_H #define OBJECT_H
#include "GameLogicStates.h" #include "GameLogicStates.h"
#include <PhysicsAPI.h> #include <PhysicsAPI.h>
namespace GameLogic namespace GameLogic
{ {
class Game;
class Object class Object
{ {
public: public:
@ -21,17 +22,22 @@ namespace GameLogic
OBJECT_TYPE GetType() const; OBJECT_TYPE GetType() const;
int GetID() const; int GetID() const;
Oyster::Physics::ICustomBody* GetRigidBody(); Oyster::Physics::ICustomBody* GetRigidBody();
void BeginFrame();
void EndFrame();
private: private:
OBJECT_TYPE type; OBJECT_TYPE type;
int objectID; int objectID;
protected: protected:
Oyster::Physics::ICustomBody *rigidBody; Oyster::Physics::ICustomBody *rigidBody;
Oyster::Physics::ICustomBody::State setState; Oyster::Physics::ICustomBody::State setState;
Oyster::Physics::ICustomBody::State getState; Oyster::Physics::ICustomBody::State getState;
static const Game* gameInstance;
}; };
} }

View File

@ -1,6 +1,8 @@
#include "Player.h" #include "Player.h"
#include "Weapon.h" #include "Weapon.h"
#include "CollisionManager.h"
#include "Game.h"
using namespace GameLogic; using namespace GameLogic;
using namespace Oyster::Physics; using namespace Oyster::Physics;
@ -14,17 +16,11 @@ Player::Player()
teamID = -1; teamID = -1;
playerState = PLAYER_STATE::PLAYER_STATE_IDLE; playerState = PLAYER_STATE::PLAYER_STATE_IDLE;
lookDir = Oyster::Math::Float4(0,0,-1,0); lookDir = Oyster::Math::Float4(0,0,-1,0);
Oyster::Physics::ICustomBody::State state;
this->rigidBody->GetState( this->setState );
setState.SetLinearMomentum( Oyster::Math::Float4(20, 0, 0, 0) );
this->rigidBody->SetState( setState );
} }
Player::~Player(void) Player::~Player(void)
{ {
delete weapon; delete weapon;
weapon = NULL; weapon = NULL;
} }
@ -57,26 +53,26 @@ void Player::Move(const PLAYER_MOVEMENT &movement)
void Player::MoveForward() void Player::MoveForward()
{ {
setState.ApplyLinearImpulse(this->lookDir * 100); setState.ApplyLinearImpulse(this->lookDir * (100 * this->gameInstance->GetFrameTime()));
} }
void Player::MoveBackwards() void Player::MoveBackwards()
{ {
setState.ApplyLinearImpulse(-this->lookDir * 100); setState.ApplyLinearImpulse(-this->lookDir * 100 * this->gameInstance->GetFrameTime());
} }
void Player::MoveRight() void Player::MoveRight()
{ {
//Do cross product with forward vector and negative gravity vector //Do cross product with forward vector and negative gravity vector
Oyster::Math::Float4 r = Oyster::Math::Float4(1, 0, 0, 0 ); Oyster::Math::Float4 r = Oyster::Math::Float4(1, 0, 0, 0 );
//Oyster::Math::Float4 r = (-rigidBody->GetGravityNormal()).Cross((Oyster::Math::Float3)this->lookDir); //Oyster::Math::Float4 r = (-rigidBody->GetGravityNormal()).Cross((Oyster::Math::Float3)this->lookDir);
setState.ApplyLinearImpulse(r * 100); setState.ApplyLinearImpulse(r * 100 * this->gameInstance->GetFrameTime());
} }
void Player::MoveLeft() void Player::MoveLeft()
{ {
//Do cross product with forward vector and negative gravity vector //Do cross product with forward vector and negative gravity vector
Oyster::Math::Float4 r = Oyster::Math::Float4(1, 0, 0, 0 ); Oyster::Math::Float4 r = Oyster::Math::Float4(1, 0, 0, 0 );
//Oyster::Math::Float4 r = -(-rigidBody->GetGravityNormal()).Cross((Oyster::Math::Float3)this->lookDir); //Oyster::Math::Float4 r1 = -(-rigidBody->GetGravityNormal()).Cross((Oyster::Math::Float3)this->lookDir); //Still get zero
setState.ApplyLinearImpulse(-r * 100); setState.ApplyLinearImpulse(-r * 100 * this->gameInstance->GetFrameTime());
} }
void Player::UseWeapon(const WEAPON_FIRE &usage) void Player::UseWeapon(const WEAPON_FIRE &usage)
@ -136,12 +132,3 @@ void Player::DamageLife(int damage)
this->life -= damage; this->life -= damage;
} }
void Player::BeginFrame()
{
this->rigidBody->SetState(this->setState);
}
void Player::EndFrame()
{
this->rigidBody->GetState(this->getState);
this->setState = this->getState;
}

View File

@ -7,9 +7,6 @@
#include "GameLogicStates.h" #include "GameLogicStates.h"
#include "OysterMath.h" #include "OysterMath.h"
#include "Object.h" #include "Object.h"
#include "OysterMath.h"
#include "CollisionManager.h"
namespace GameLogic namespace GameLogic
@ -58,10 +55,6 @@ namespace GameLogic
void DamageLife(int damage); void DamageLife(int damage);
//Do frame calculations
void BeginFrame();
void EndFrame();
private: private:
void Jump(); void Jump();

View File

@ -1,60 +1,54 @@
#include "Team.h" #include "Team.h"
#include "Player.h"
using namespace GameLogic; using namespace GameLogic;
struct Team::PrivateData
{
PrivateData()
{
players = 0;
nrOfPlayers = 0;
teamSize = 0;
}
~PrivateData()
{
}
Player **players;
int nrOfPlayers;
int teamSize;
}myData;
Team::Team(void) Team::Team(void)
{ : players(5)
myData = new PrivateData(); , teamSize(5)
} {}
Team::Team(int teamSize) Team::Team(int teamSize)
{ : players((unsigned int)teamSize)
myData = new PrivateData(); , teamSize(teamSize)
myData->teamSize = teamSize; {}
}
Team::~Team(void) Team::~Team(void)
{ {
delete myData; this->players.Clear();
} }
Player* Team::GetPlayer(int playerID) Player* Team::GetPlayer(int playerID)
{ {
return myData->players[playerID]; if(playerID >= 0 && playerID < this->teamSize)
return this->players[playerID];
return NULL;
} }
bool Team::AddPlayer(Player *player) bool Team::AddPlayer(Player *player)
{ {
if (myData->nrOfPlayers >= myData->teamSize) if ((int)this->players.Size() >= this->teamSize)
{ {
return false; return false;
} }
else else
{ {
myData->players[myData->nrOfPlayers] = player; int k = -1;
myData->nrOfPlayers++; for (int i = 0; k == -1 && i < this->teamSize; i++)
{
if(!this->players[i])
k = i;
}
if(k == -1)
{
this->players.Push(player);
}
else
{
this->players[k] = player;
}
} }
return true; return true;

View File

@ -4,7 +4,9 @@
#ifndef TEAM_H #ifndef TEAM_H
#define TEAM_H #define TEAM_H
#include "Player.h" #include "Player.h"
#include "DynamicArray.h"
namespace GameLogic namespace GameLogic
{ {
@ -29,8 +31,8 @@ namespace GameLogic
bool AddPlayer(Player *player); bool AddPlayer(Player *player);
private: private:
struct PrivateData; Utility::DynamicMemory::DynamicArray<Player*> players;
PrivateData *myData; int teamSize;
}; };
} }
#endif #endif

View File

@ -1,69 +1,56 @@
#include "TeamManager.h" #include "TeamManager.h"
#include "Team.h"
using namespace GameLogic; using namespace GameLogic;
struct TeamManager::PrivateData
{
PrivateData()
{
teams = 0;
nrOfTeams = 0;
}
~PrivateData()
{
}
Team **teams;
int nrOfTeams;
int maxNrOfTeams;
}myData;
TeamManager::TeamManager(void) TeamManager::TeamManager(void)
: teams(10)
, maxNrOfTeams(10)
{ {
myData = new PrivateData(); for (int i = 0; i < 10; i++)
myData->maxNrOfTeams = 10; {
myData->teams = new Team*[myData->maxNrOfTeams]; teams[i] = 0;
}
} }
TeamManager::TeamManager(int maxNrOfTeams) TeamManager::TeamManager(int maxNrOfTeams)
: teams(maxNrOfTeams)
, maxNrOfTeams(maxNrOfTeams)
{ {
myData = new PrivateData(); for (int i = 0; i < this->maxNrOfTeams; i++)
myData->maxNrOfTeams = maxNrOfTeams;
myData->teams = new Team*[myData->maxNrOfTeams];
for (int i = 0; i < myData->maxNrOfTeams; i++)
{ {
myData->teams[i] = 0; teams[i] = 0;
} }
} }
TeamManager::~TeamManager(void) TeamManager::~TeamManager(void)
{ {
delete myData; for (int i = 0; i < this->maxNrOfTeams; i++)
{
delete this->teams[i];
this->teams[i] = 0;
}
} }
void TeamManager::RespawnPlayerRandom(Player *player) void TeamManager::RespawnPlayerRandom(Player *player)
{ {
// Whats going on here?
int teamID = player->GetTeamID(); int teamID = player->GetTeamID(); // ?
// ?
Player *respawnOnThis = myData->teams[teamID]->GetPlayer(0); Player *respawnOnThis = this->teams[teamID]->GetPlayer(0); // ?
// ?
player->Respawn(respawnOnThis->GetPosition()); player->Respawn(respawnOnThis->GetPosition()); // ?
// player->Respawn(player->GetPosition()); ?
} }
void TeamManager::CreateTeam(int teamSize) void TeamManager::CreateTeam(int teamSize)
{ {
if (myData->nrOfTeams < myData->maxNrOfTeams) //if (this->nrOfTeams < this->maxNrOfTeams)
{ //{
myData->teams[myData->nrOfTeams] = new Team(teamSize); // this->teams[this->nrOfTeams] = new Team(teamSize);
myData->nrOfTeams++; // this->nrOfTeams++;
} //}
} }
void TeamManager::RemoveTeam(int teamID) void TeamManager::RemoveTeam(int teamID)
@ -73,10 +60,10 @@ void TeamManager::RemoveTeam(int teamID)
bool TeamManager::AddPlayerToTeam(Player *player,int teamID) bool TeamManager::AddPlayerToTeam(Player *player,int teamID)
{ {
if (IsValidTeam(teamID)) //if (IsValidTeam(teamID))
{ //{
return myData->teams[teamID]->AddPlayer(player); // return this->teams[teamID]->AddPlayer(player);
} //}
return false; return false;
} }
@ -87,10 +74,10 @@ bool TeamManager::AddPlayerToTeam(Player *player)
bool TeamManager::IsValidTeam(int teamID) bool TeamManager::IsValidTeam(int teamID)
{ {
if (teamID < myData->nrOfTeams && teamID > 0 && myData->teams[teamID] != NULL) //if (teamID < this->nrOfTeams && teamID > 0 && this->teams[teamID] != NULL)
{ //{
return true; // return true;
} //}
return false; return false;
} }

View File

@ -4,7 +4,10 @@
#ifndef TEAMMANAGER_H #ifndef TEAMMANAGER_H
#define TEAMMANAGER_H #define TEAMMANAGER_H
#include "Player.h" #include "Player.h"
#include "Team.h"
#include <DynamicArray.h>
namespace GameLogic namespace GameLogic
{ {
@ -56,8 +59,8 @@ namespace GameLogic
bool IsValidTeam(int teamID); bool IsValidTeam(int teamID);
private: private:
struct PrivateData; Utility::DynamicMemory::DynamicArray<Team*> teams;
PrivateData *myData; int maxNrOfTeams;
}; };
} }
#endif #endif

View File

@ -83,7 +83,7 @@ bool Weapon::IsReloading()
bool Weapon::IsValidSocket(int socketID) bool Weapon::IsValidSocket(int socketID)
{ {
if(socketID < myData->attatchmentSockets.Size() && socketID >= 0) if(socketID < (int)myData->attatchmentSockets.Size() && socketID >= 0)
{ {
if (myData->attatchmentSockets[socketID]->GetAttatchment() != 0) if (myData->attatchmentSockets[socketID]->GetAttatchment() != 0)
{ {
@ -102,7 +102,7 @@ int Weapon::GetCurrentSocketID()
void Weapon::AddNewAttatchment(IAttatchment *attatchment, Player *owner) void Weapon::AddNewAttatchment(IAttatchment *attatchment, Player *owner)
{ {
if(myData->currentNrOfAttatchments < myData->attatchmentSockets.Size()) if(myData->currentNrOfAttatchments < (int)myData->attatchmentSockets.Size())
{ {
myData->attatchmentSockets[myData->currentNrOfAttatchments]->SetAttatchment(attatchment); myData->attatchmentSockets[myData->currentNrOfAttatchments]->SetAttatchment(attatchment);
myData->currentNrOfAttatchments++; myData->currentNrOfAttatchments++;

View File

@ -46,6 +46,7 @@ namespace GameLogic
struct Protocol_General_Text :public Oyster::Network::CustomProtocolObject struct Protocol_General_Text :public Oyster::Network::CustomProtocolObject
{ {
char* text; char* text;
int destination;
Protocol_General_Text() Protocol_General_Text()
{ {

View File

@ -150,6 +150,10 @@
<ClCompile Include="Resource\Loaders\CustomLoader.cpp" /> <ClCompile Include="Resource\Loaders\CustomLoader.cpp" />
<ClCompile Include="Resource\OResourceHandler.cpp" /> <ClCompile Include="Resource\OResourceHandler.cpp" />
<ClCompile Include="Resource\OResource.cpp" /> <ClCompile Include="Resource\OResource.cpp" />
<ClCompile Include="Resource\ResourceManager.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="Thread\OysterMutex.cpp" /> <ClCompile Include="Thread\OysterMutex.cpp" />
<ClCompile Include="Thread\OysterThread_Impl.cpp" /> <ClCompile Include="Thread\OysterThread_Impl.cpp" />
<ClCompile Include="Utilities.cpp" /> <ClCompile Include="Utilities.cpp" />
@ -165,6 +169,10 @@
<ClInclude Include="Queue.h" /> <ClInclude Include="Queue.h" />
<ClInclude Include="Resource\OysterResource.h" /> <ClInclude Include="Resource\OysterResource.h" />
<ClInclude Include="Resource\OResource.h" /> <ClInclude Include="Resource\OResource.h" />
<ClInclude Include="Resource\ResourceManager.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="ThreadSafeQueue.h" /> <ClInclude Include="ThreadSafeQueue.h" />
<ClInclude Include="Thread\IThreadObject.h" /> <ClInclude Include="Thread\IThreadObject.h" />
<ClInclude Include="Thread\OysterMutex.h" /> <ClInclude Include="Thread\OysterMutex.h" />

View File

@ -45,6 +45,9 @@
<ClCompile Include="Thread\OysterThread_Impl.cpp"> <ClCompile Include="Thread\OysterThread_Impl.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Resource\ResourceManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Utilities.h"> <ClInclude Include="Utilities.h">
@ -104,5 +107,8 @@
<ClInclude Include="Queue.h"> <ClInclude Include="Queue.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Resource\ResourceManager.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -101,7 +101,7 @@ using namespace Utility::DynamicMemory;
else else
this->threadData->state = OYSTER_THREAD_STATE_IDLE; this->threadData->state = OYSTER_THREAD_STATE_IDLE;
threadData->ownerObj = worker; threadData->ownerObj = worker;
threadData->prio = OYSTER_THREAD_PRIORITY_3; threadData->prio = OYSTER_THREAD_PRIORITY_2;
workerThread = std::thread(fnc, this->threadData); workerThread = std::thread(fnc, this->threadData);

View File

@ -73,6 +73,7 @@ struct ClientDataContainer
}; };
unsigned int ClientDataContainer::currID = 0; unsigned int ClientDataContainer::currID = 0;
struct NetworkClient::PrivateData : public IThreadObject struct NetworkClient::PrivateData : public IThreadObject
{ {
Utility::DynamicMemory::SmartPointer<ClientDataContainer> data; Utility::DynamicMemory::SmartPointer<ClientDataContainer> data;
@ -92,6 +93,7 @@ struct NetworkClient::PrivateData : public IThreadObject
return true; return true;
} }
void Send(CustomNetProtocol* protocol) void Send(CustomNetProtocol* protocol)
{ {
if(!data) return; if(!data) return;
@ -175,12 +177,14 @@ struct NetworkClient::PrivateData : public IThreadObject
NetworkClient::NetworkClient() NetworkClient::NetworkClient()
{ {
privateData = new PrivateData(); privateData = new PrivateData();
this->privateData->data->thread.SetPriority(Oyster::Thread::OYSTER_THREAD_PRIORITY_1);
} }
NetworkClient::NetworkClient(unsigned int socket) NetworkClient::NetworkClient(unsigned int socket)
{ {
privateData = new PrivateData(socket); privateData = new PrivateData(socket);
this->privateData->data->thread.Create(this->privateData, true); this->privateData->data->thread.Create(this->privateData, true);
this->privateData->data->thread.SetPriority(Oyster::Thread::OYSTER_THREAD_PRIORITY_1);
} }
NetworkClient::NetworkClient(RecieverObject recvObj, NetworkProtocolCallbackType type) NetworkClient::NetworkClient(RecieverObject recvObj, NetworkProtocolCallbackType type)
@ -196,6 +200,7 @@ NetworkClient::NetworkClient(RecieverObject recvObj, NetworkProtocolCallbackType
this->privateData->data->callbackType = type; this->privateData->data->callbackType = type;
this->privateData->data->recvObj = recvObj; this->privateData->data->recvObj = recvObj;
this->privateData->data->thread.Create(this->privateData, true); this->privateData->data->thread.Create(this->privateData, true);
this->privateData->data->thread.SetPriority(Oyster::Thread::OYSTER_THREAD_PRIORITY_1);
} }
NetworkClient::NetworkClient(const NetworkClient& obj) NetworkClient::NetworkClient(const NetworkClient& obj)