初始化内容
This commit is contained in:
+119
@@ -0,0 +1,119 @@
|
||||
#include "gameobj.h"
|
||||
#include "scriptmgr.h"
|
||||
#include "gamemgr.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
CGameObj::CGameObj(char dispChar, int x, int y)
|
||||
{
|
||||
// The first reference is already counted when the object is created
|
||||
refCount = 1;
|
||||
|
||||
isDead = false;
|
||||
displayCharacter = dispChar;
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
controller = 0;
|
||||
|
||||
weakRefFlag = 0;
|
||||
}
|
||||
|
||||
CGameObj::~CGameObj()
|
||||
{
|
||||
if( weakRefFlag )
|
||||
{
|
||||
// Tell the ones that hold weak references that the object is destroyed
|
||||
weakRefFlag->Set(true);
|
||||
weakRefFlag->Release();
|
||||
}
|
||||
|
||||
if( controller )
|
||||
controller->Release();
|
||||
}
|
||||
|
||||
asILockableSharedBool *CGameObj::GetWeakRefFlag()
|
||||
{
|
||||
if( !weakRefFlag )
|
||||
weakRefFlag = asCreateLockableSharedBool();
|
||||
|
||||
return weakRefFlag;
|
||||
}
|
||||
|
||||
int CGameObj::AddRef()
|
||||
{
|
||||
return ++refCount;
|
||||
}
|
||||
|
||||
int CGameObj::Release()
|
||||
{
|
||||
if( --refCount == 0 )
|
||||
{
|
||||
delete this;
|
||||
return 0;
|
||||
}
|
||||
return refCount;
|
||||
}
|
||||
|
||||
void CGameObj::DestroyAndRelease()
|
||||
{
|
||||
// Since there might be other object's still referencing this one, we
|
||||
// cannot just delete it. Here we will release all other references that
|
||||
// this object holds, so it doesn't end up holding circular references.
|
||||
if( controller )
|
||||
{
|
||||
controller->Release();
|
||||
controller = 0;
|
||||
}
|
||||
|
||||
Release();
|
||||
}
|
||||
|
||||
void CGameObj::OnThink()
|
||||
{
|
||||
// Call the script controller's OnThink method
|
||||
if( controller )
|
||||
scriptMgr->CallOnThink(controller);
|
||||
}
|
||||
|
||||
bool CGameObj::Move(int dx, int dy)
|
||||
{
|
||||
// Check if it is actually possible to move to the desired position
|
||||
int x2 = x + dx;
|
||||
if( x2 < 0 || x2 > 9 ) return false;
|
||||
|
||||
int y2 = y + dy;
|
||||
if( y2 < 0 || y2 > 9 ) return false;
|
||||
|
||||
// Check with the game manager if another object isn't occupying this spot
|
||||
CGameObj *obj = gameMgr->GetGameObjAt(x2, y2);
|
||||
if( obj ) return false;
|
||||
|
||||
// Now we can make the move
|
||||
x = x2;
|
||||
y = y2;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGameObj::Send(CScriptHandle msg, CGameObj *other)
|
||||
{
|
||||
if( other && other->controller )
|
||||
scriptMgr->CallOnMessage(other->controller, msg, this);
|
||||
}
|
||||
|
||||
void CGameObj::Kill()
|
||||
{
|
||||
// Just flag the object as dead. The game manager will
|
||||
// do the actual destroying at the end of the frame
|
||||
isDead = true;
|
||||
}
|
||||
|
||||
int CGameObj::GetX() const
|
||||
{
|
||||
return x;
|
||||
}
|
||||
|
||||
int CGameObj::GetY() const
|
||||
{
|
||||
return y;
|
||||
}
|
||||
Reference in New Issue
Block a user