|
Druhý jednoduchý skript
|
|
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