情节链设计3

//--[[
 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");
}


 


 

你可能感兴趣的:(File,null,delete,System,Class)