//--[[
file name : GameEvents.lua
author : Clark/陈泽丹
created : 8-30-2011
purpose : 故事情节线
//--]]
#pragma once
#include <vector>
using namespace std;
class StoryFun
{
public:
virtual ~StoryFun(){}
virtual void Execute() = 0;
protected:
StoryFun(){}
};
class SayFun: public StoryFun
{
public:
SayFun(const char* _pText);
virtual ~SayFun();
virtual void Execute();
protected:
char* m_pText;
};
class StoryNode
{
public:
StoryNode();
virtual ~StoryNode(void);
void start();
void pushChild(StoryNode* _pChildNode);
void deleteAll();
protected:
virtual void initThis() = 0;
virtual void runThis() = 0;
virtual void deleteThis() = 0;
void init();
void run();
void initChild();
void runChild();
private:
vector<StoryNode*> m_vChildNode;
};
class FunNode: public StoryNode
{
public:
FunNode(StoryFun* _pFun);
virtual ~FunNode(void);
protected:
virtual void initThis();
virtual void runThis();
virtual void deleteThis();
private:
StoryFun* m_pFun;
};
#include "Story.h"
SayFun::SayFun(const char* _pText)
{
int iLen = strlen(_pText);
m_pText = new char[iLen+1];
strcpy(m_pText, _pText);
}
SayFun::~SayFun()
{
if( NULL != m_pText)
{
printf("delete %s\n", m_pText);
delete m_pText;
m_pText = NULL;
}
}
void SayFun::Execute()
{
printf("%s\n", m_pText);
}
//--------------------------------------------------------------------
StoryNode::StoryNode(){}
StoryNode::~StoryNode(void){}
void StoryNode::start()
{
init();
run();
}
void StoryNode::init()
{
initThis();
initChild();
}
void StoryNode::run()
{
runThis();
runChild();
}
void StoryNode::pushChild(StoryNode* _pChildNode)
{
m_vChildNode.push_back(_pChildNode);
}
void StoryNode::deleteAll()
{
int iLen = m_vChildNode.size();
for(int i=0; i<iLen; i++)
{
m_vChildNode[i]->deleteAll();
m_vChildNode[i] = NULL;
}
m_vChildNode.clear();
deleteThis();
}
void StoryNode::initChild()
{
int iLen = m_vChildNode.size();
for(int i=0; i<iLen; i++)
{
m_vChildNode[i]->init();
}
}
void StoryNode::runChild()
{
int iLen = m_vChildNode.size();
for(int i=0; i<iLen; i++)
{
m_vChildNode[i]->run();
}
}
FunNode::FunNode(StoryFun* _pFun)
{
m_pFun = _pFun;
}
FunNode::~FunNode(void){}
void FunNode::initThis(){}
void FunNode::runThis()
{
m_pFun->Execute();
}
void FunNode::deleteThis()
{
if( NULL != m_pFun)
{
delete m_pFun;
m_pFun = NULL;
}
}
#include <iostream>
#include "Story.h"
using namespace std;
void main()
{
FunNode* pNode1 = new FunNode(new SayFun("event 1"));
FunNode* pNode2 = new FunNode(new SayFun("event 2"));
FunNode* pNode3 = new FunNode(new SayFun("event 3"));
FunNode* pNode4 = new FunNode(new SayFun("event 4"));
FunNode* pNode5 = new FunNode(new SayFun("event 5"));
pNode1->pushChild(pNode2);
pNode1->pushChild(pNode3);
pNode2->pushChild(pNode4);
pNode4->pushChild(pNode5);
pNode1->start();
pNode1->deleteAll();
delete pNode1;
pNode1 = NULL;
//--下一版结合触发器实现,就会出现杀伤力了
system("pause");
}