Angelscript/samples/game/source/gamemgr.cpp

196 lines
4.4 KiB
C++
Raw Permalink Normal View History

2021-04-12 18:25:02 +00:00
#include "gamemgr.h"
#include "gameobj.h"
#include "scriptmgr.h"
#include <string.h> // strcpy
#include <stdio.h> // rand
#include <stdlib.h> // rand
#include <iostream> // cout
using namespace std;
CGameMgr::CGameMgr()
{
gameOn = false;
}
CGameMgr::~CGameMgr()
{
for( unsigned int n = 0; n < gameObjects.size(); n++ )
gameObjects[n]->DestroyAndRelease();
}
int CGameMgr::StartGame()
{
// Set up the game level
// In a real game this would probably be loaded from a file, that would define
// the position of each object and other things that would be placed in the game world.
// The properties for each object type would probably also be loaded from a file.
// The map file, would only have to specify the position and the type of the object.
// Based on the type, the game manager would retrieve the graphics object and script
// controller that should be used.
// Create some stones
for( unsigned int n = 0; n < 10; n++ )
SpawnObject("stone", '0', rand()%10, rand()%10);
// Create some zombies
for( unsigned int n = 0; n < 3; n++ )
SpawnObject("zombie", 'z', rand()%10, rand()%10);
// Create the player
CGameObj *obj = SpawnObject("player", 'p', rand()%10, rand()%10);
if( obj )
obj->name = "player";
// Check if there were any compilation errors during the script loading
if( scriptMgr->hasCompileErrors )
return -1;
return 0;
}
CGameObj *CGameMgr::SpawnObject(const std::string &type, char dispChar, int x, int y)
{
CGameObj *obj = new CGameObj(dispChar, x, y);
gameObjects.push_back(obj);
// Set the controller based on type
obj->controller = scriptMgr->CreateController(type, obj);
return obj;
}
void CGameMgr::Run()
{
gameOn = true;
while( gameOn )
{
// Render the frame
Render();
// Get input from user
GetInput();
// Call the onThink method on each game object
for( unsigned int n = 0; n < gameObjects.size(); n++ )
gameObjects[n]->OnThink();
// Kill the objects that have been queued for killing
for( unsigned int n = 0; n < gameObjects.size(); n++ )
{
if( gameObjects[n]->isDead )
{
// We won't actually delete the memory here, as we do not know
// exactly who might still be referencing the object, but we
// make sure to destroy the internals in order to avoid
// circular references.
gameObjects[n]->DestroyAndRelease();
gameObjects.erase(gameObjects.begin()+n);
n--;
}
}
}
}
void CGameMgr::EndGame(bool win)
{
gameOn = false;
if( win )
cout << "Congratulations, you've defeated the zombies!" << endl;
else
cout << "Too bad, the zombies ate your brain!" << endl;
// Get something to let the player see the message before exiting
char buf[2];
cin.getline(buf, 1);
}
void CGameMgr::Render()
{
// Clear the buffer
char buf[10][11];
for( int y = 0; y < 10; y++ )
memcpy(buf[y], "..........\0", 11);
// Render each object into the buffer
for( unsigned int n = 0; n < gameObjects.size(); n++ )
buf[gameObjects[n]->y][gameObjects[n]->x] = gameObjects[n]->displayCharacter;
// Clear the screen
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
// Print some useful information and start the input loop
cout << "Sample game using AngelScript " << asGetLibraryVersion() << "." << endl;
cout << "Type u(p), d(own), l(eft), r(ight) to move the player." << endl;
cout << "Type q(uit) to exit the game." << endl;
cout << "Try to avoid getting eaten by the zombies, hah hah." << endl;
cout << endl;
// Present the buffer
for( int y = 0; y < 10; y++ )
cout << buf[y] << endl;
}
void CGameMgr::GetInput()
{
cout << "> ";
char buf[10];
cin.getline(buf, 10);
memset(actionStates, 0, sizeof(actionStates));
switch( buf[0] )
{
case 'u':
actionStates[0] = true;
break;
case 'd':
actionStates[1] = true;
break;
case 'l':
actionStates[2] = true;
break;
case 'r':
actionStates[3] = true;
break;
case 'q':
gameOn = false;
break;
}
}
bool CGameMgr::GetActionState(int action)
{
if( action < 0 || action >= 4 ) return false;
return actionStates[action];
}
CGameObj *CGameMgr::GetGameObjAt(int x, int y)
{
for( unsigned int n = 0; n < gameObjects.size(); n++ )
if( gameObjects[n]->x == x && gameObjects[n]->y == y )
return gameObjects[n];
return 0;
}
CGameObj *CGameMgr::FindGameObjByName(const string &name)
{
for( unsigned int n = 0; n < gameObjects.size(); n++ )
{
if( gameObjects[n]->name == name )
return gameObjects[n];
}
return 0;
}