OpenGL game
Vlastní skriptovací jazyk

Druhý jednoduchý skript

zdroják ke stažení (4kB)

16.12.2005

Do předešlého skriptu přidáme string data. Do konzole se vypíše toto:

I am talking.
this is printed

Do třídy
CInstruction
přidáme data

char* m_strData;


Celá třída vypadá takto:

  class CInstruction 
	{
		EScriptOpCode  m_eCode;
		size_t  m_tDataSize;
		char* m_strData;
	public:
		CInstruction(EScriptOpCode _eCode) : m_eCode(_eCode), m_tDataSize(0), m_strData(0){}
		CInstruction(EScriptOpCode _eCode, const char* _strData, size_t _tDataSize) 
			: m_eCode(_eCode),m_tDataSize(_tDataSize), m_strData(new char[_tDataSize])
		{
			memcpy(m_strData, _strData, _tDataSize);
		}
		~CInstruction(){}

		void Delete()
		{
			delete [] m_strData;
		}

		EScriptOpCode GetCode() const         
		{ 
			return m_eCode; 
		}

		const char* GetData() const         
		{ 
			return m_strData; 
		}

		size_t GetSize()
		{
			return m_tDataSize;
		}
	};


Když vytváříme novou instrukci, použijeme druhý konstruktor. Tento konstruktor alokuje paměť odpovídající délky pro ukládání dat.

m_strData(new char[_tDataSize]


Data konstruktoru překopírujeme do lokálních dat

memcpy(m_strData, _strData, _tDataSize);


Tyto data jsou dále jen pro čtení, nebude se s nimi nijak namipulovat.
Funkce
Delete();
alokovanou paměť vymaže

delete [] m_strData;


Nyní přidáme nový skript
K_OP_PRINT
do enumerátoru

  enum EScriptOpCode
  {
    K_OP_TALK,
    K_OP_PRINT,
    K_OP_END
  };


Nakonec přidáme
print
skript do třídy
CVirtualMachine

  void CVirtualMachine::Execute(size_t _uiScriptId)
  {
	/// Select root script by script index
	SelectScript(_uiScriptId);	
	/// Set our iterator to the beginning       
	m_tInstrCurr = m_tInstrRoot;	
	while (m_tInstrCurr)
	{
		switch(m_tInstrCurr->GetCode())
		{
			/// message functionality
		case K_OP_TALK:
			std::cout << "I am talking." << std::endl;
			// Iterate
			++m_tInstrCurr;	
			break;
		case K_OP_PRINT:
			std::cout << m_tInstrCurr->GetData() << std::endl;    /// print data
			/// Iterate			
			++m_tInstrCurr;   
			break;

			/// Ends
		case K_OP_END:
			/// Discontinue the loop
			m_tInstrCurr = 0;	
			break;
		}
	}
}


Test nového skriptu

Při načítání scény:
Vytvoříme virtual machine VR

CVirtualMachine kVM;


Vytvoříme instrukce a skript

  vector<CInstruction> vInstr;
  vInstr.push_back(CInstruction(K_OP_TALK));	// talk twice
  vInstr.push_back(CInstruction(K_OP_PRINT, strBuffer, strlen(strBuffer)+1));  // print
  vInstr.push_back(CInstruction(K_OP_END));	// then end
  CScript kScript(vInstr);


Načteme skript a získáme jeho index.

size_t uiScriptId = kVM.Load(kScript);



Při běhu aplikace
Předáváme VM index skriptu. Tento skript se aktivuje

kVM.Execute(uiScriptId);



Při ukončování aplikace vymažeme alokovaná data

kScript.Delete();




home / opengl game


Valid XHTML 1.0 Transitional