Skip to content

Cocos2dx:CCAcceleration

간단한 사용방법

우선, 관련 이벤트를 획득하기 위한 메서드를 상속받는다.

virtual void onEnter();
virtual void didAccelerate(cocos2d::CCAcceleration * acceleration);

덧붙여서, onEnter()는 아래와 같이 설명되어있다.

  • Event callback that is invoked every time when CCNode enters the 'stage'.
  • If the CCNode enters the 'stage' with a transition, this event is called when the transition starts. During onEnter you can't access a "sister/brother" node. If you override onEnter, you shall call its parent's one, e.g., CCNode::onEnter().

onEnter()에 가속도 센서의 사용여부를 추가한다.

void GameScene::onEnter()
{
    CCLayer::onEnter();
    setAccelerometerEnabled(true);
}

센서를 적용할 경우 화면밖으로 나가지 않도록 조정할 매크로를 작성한다.

#define FIX_POSITION(pos, min, max) \
    if (pos < min) { \
        pos = min; \
    } else if (pos > max) { \
        pos = max; \
    }

플레이어 CCSprite 캐릭터를 init()에 생성한다.

_player = CCSprite::create(kPlayerPng);
if (_player != NULL) {
    _player->setPosition(ccp(window_size.width / 2.0f, window_size.height / 2.0f));
    _player->retain();
    addChild(_player);
}

중요한 점은 플레이어 객체는 멤버변수로 적용하며, 소멸자에서 _player->release();를 호출해야 한다. 마지막으로, didAccelerate()를 구현한다.

void GameScene::didAccelerate(cocos2d::CCAcceleration * acceleration)
{
    using namespace cocos2d;

    CCDirector * director = CCDirector::sharedDirector();
    if (_player == NULL || director == NULL) {
        return;
    }

    CCSize player_size = _player->getContentSize();

    CCPoint player_position = _player->getPosition();
    CCPoint ui_position = director->convertToUI(player_position);

    ui_position.x += acceleration->x * kGravityConstant;
    ui_position.y -= acceleration->y * kGravityConstant;

    CCPoint next_position = director->convertToGL(ui_position);

    CCSize window_size = CCDirector::sharedDirector()->getWinSize();

    FIX_POSITION(next_position.x,
            (player_size.width  / 2.0f),
            (window_size.width  - player_size.width  / 2.0f));
    FIX_POSITION(next_position.y,
            (player_size.height / 2.0f),
            (window_size.height - player_size.height / 2.0f));

    _player->setPosition(next_position);
}

See also