본문 바로가기

Cocos2d-x v3.17/고급 기능

[Cocos2d-x 고급기능]스크립트 사용하기

반응형

스크립트 사용하기

스크립트 컴포넌트

 

스크립트 컴포넌트는 c++노드 개체를 확장하기 위한 방법입니다.

당신은 스크립트 컴포넌트를 노드에 바인딩하면 스크립트는 onEnteronExit  update 이벤트를 받을수 있습니다.

 

스크립트 컴포넌트는 JavaScript Lua 언어 지원합니다.

사용한 스크립트 컴포넌트는 바인딩된 스크립트의 언어와 매칭됩니다.

예를들면 ComponentJS  JavaScript 바인딩한다면 ComponentLua  Lua스크립트를 바인딩합니다.

스크립트 컴포넌트가 있으면 당신은 Cocos2d-x에서 아주 쉽게 스크립트를 사용할수 있습니다.

주의해야 할점은 프로젝트당 여러 언어를 혼합해서 사용하면 안됩니다.

프로젝트에서 JavaScript 사용할건지 Lua 사용할건지 결정하고 한가지만 사용해야 합니다.


Lua 스크립트 사용하기

C++

// create a Sprite and add a LUA component
auto player = Sprite::create("player.png");

auto luaComponent = ComponentLua::create("player.lua");
player->addComponent(luaComponent);

Lua

-- player.lua

local player = {
    onEnter =
function(self)
       
-- do some things in onEnter
   
end,

onExit = function(self)
       
-- do some things in onExit
   
end,

update = function(self)
       
-- do some things every frame
   
end
}

-- it is needed to return player to let c++ nodes know it
return player


JavaScript 사용하기:

C++

// create a Sprite and add a LUA component
auto player = Sprite::create("player.png");

auto jsComponent = ComponentJS::create("player.js");
player->addComponent(jsComponent);

JavaScript

// player.js
Player = cc.ComponentJS.extend({
    generateProjectile:
function (x, y) {
       
var projectile = new cc.Sprite("components/Projectile.png", cc.rect(0, 0, 20, 20));
       
var scriptComponent = new cc.ComponentJS("src/ComponentTest/projectile.js");
        projectile.addComponent(scriptComponent);
       
this.getOwner().getParent().addChild(projectile);

// set position
       
var winSize = cc.director.getVisibleSize();
       
var visibleOrigin = cc.director.getVisibleOrigin();
        projectile.setPosition(cc.p(visibleOrigin.x +
20, visibleOrigin.y + winSize.height/2));

// run action
       
var posX = projectile.getPositionX();
       
var posY = projectile.getPositionY();
       
var offX = x - posX;
       
var offY = y - posY;

if (offX <= 0) {
           
return;
        }

var contentSize = projectile.getContentSize();
       
var realX = visibleOrigin.x + winSize.width + contentSize.width/2;
       
var ratio = offY / offX;
       
var realY = (realX * ratio) + posY;
       
var realDest = cc.p(realX, realY);

var offRealX = realX - posX;
       
var offRealY = realY - posY;
       
var length = Math.sqrt((offRealX * offRealX) + (offRealY * offRealY));
       
var velocity = 960;
       
var realMoveDuration = length / velocity;

projectile.runAction(cc.moveTo(realMoveDuration, realDest));
    },

onEnter: function() {
       
var owner = this.getOwner();
        owner.playerComponent =
this;
        cc.eventManager.addListener({
            event: cc.EventListener.TOUCH_ALL_AT_ONCE,
            onTouchesEnded:
function (touches, event) {
               
var target = event.getCurrentTarget();
               
if (target.playerComponent) {
                   
var location = touches[0].getLocation();
                    target.playerComponent.generateProjectile(location.x, location.y);
                    jsb.AudioEngine.play2d(
"pew-pew-lei.wav");
                }
            }
        }, owner);
    }
});


주의 : 루아 컴포넌트를 사용할땐 Lua 개체를 리턴해야 하고 JavaScript 컴포넌트를 사용할땐 스크립트는 cc.ComponentJS extend 해서 사용해야 합니다.


더욱 자세한 사용법을 알고 싶으면 Cocos2d-x 엔진의 테스트 프로젝트인 tests/lua-tests/src/ComponentTest and tests/js-tests/src/ComponentTest。를 참고하세요.

 

출처: <http://cocos2d-x.org/docs/cocos2d-x/zh/scripting/>

 


반응형