DebugNode.h
#ifndef __DEBUG_NODE_H__ #define __DEBUG_NODE_H__ #include "cocos2d.h" USING_NS_CC; class DebugNode : public Node { public: DebugNode(); virtual ~DebugNode(); CREATE_FUNC(DebugNode); public: virtual bool init(); void apply(const std::string &script); private: std::string m_script; }; #endif
DebugNode.cpp
#include#include #include "DebugNode.h" DebugNode::DebugNode() { m_script = ""; } DebugNode::~DebugNode() { stopAllActions(); } bool DebugNode::init() { Node::init(); return true; } void DebugNode::apply(const std::string &script) { m_script = script; LuaEngine *luaEngine = LuaEngine::getInstance(); ScriptEngineManager::getInstance()->setScriptEngine(luaEngine); auto L = luaEngine->getLuaStack()->getLuaState(); // DebugNode의 부모 Node를 루아 스크립트 전역 변수 rootNode로 지정한다. luaEngine->getLuaStack()->pushObject(getParent(), "cc.Node"); lua_setglobal(L, "rootNode"); // 지정된 스크립트 파일을 실행한다. luaEngine->executeScriptFile(m_script.c_str()); // 이후 1초 마다 스트립트를 재실행한다. auto action = RepeatForever::create( Sequence::createWithTwoActions( DelayTime::create(1.0f), CallFunc::create( [&]() { LuaEngine::getInstance()->reload(m_script.c_str()); }))); runAction(action); }
제어할 Scene 노드의 자식으로 DebugNode 객체를 생성해서 추가하고 apply 함수를 호출하면 1초에 한 번씩 지정된 Lua 스트립트 파일을 실행하는데 제어할 Scene 자식 노드는 setName 함수를 사용하여 유일한 이름을 지정해 주어야 한다. 다음의 샘플은 Cocos2d-x에 포함된 cpp-empty-test 프로젝트에 DebugNode를 적용한 부분의 코드 조각이다.
HelloWorldScene.cpp
bool HelloWorld::init() { (생략) ///////////////////////////// // 3. add your codes below... // add a label shows "Hello World" // create and initialize a label auto label = LabelTTF::create("Hello World", "Arial", TITLE_FONT_SIZE); // 스크립트에서 참조할 이름을 지정한다. label->setName("label"); (생략) auto debugNode = DebugNode::create(); this->addChild(debugNode); debugNode->apply("HelloWorldScene.lua"); return true; }
HelloWorldScene.lua
label = rootNode:getChildByName("label") label:setPosition(100, 200)
HelloWorldScene.lua 파일을 텍스트 에디터에서 열고 setPosition의 인자를 변경한 후에 저장하면 바로 위치 값이 적용되는 것을 확인할 수 있다.
댓글 없음:
댓글 쓰기