인디 게임 강좌

전체보기

모바일 상단 메뉴

본문 페이지

[코코스2D] [Box2D] #17 - 중력가속도계

아이콘 내폰젤무거워
댓글: 1 개
조회: 2544
2017-07-17 21:28:55

Document Version : V1.3 - 2017.07.17 with cocos2d-x 3.15.1

Document Version : V1.2 - 2015.06.08 with cocos2d-x 3.6

Document Version : V1.1 - 2014.03.14 with cocos2d-x 3.0beta2

Document Version : V1.0 - 2013.07.10 with cocos2d-x 2.1.4


제 책인 "시작하세요! Cocos2d-x 3.0 프로그래밍" 내용을  3.15.1 버전에 맞게 수정하여 올리고 있습니다.

이 글은 네이버카페 "Cocos2d-x 사용자 모임"에 동시에 게재되고 있습니다.


개발환경 : 

  • Windows7
  • Visual Studio Community 2017
  • Cocos2d-x 3.15.1
  • 사용 프로젝트 : proj.win32


중력가속도계 (Accelerometer)

cocos2d-x에서도 스마트폰에서 제공하는 센서 기능인 중력가속도계를 사용할 수 있습니다. 제공되는 클래스는 Acceleration 입니다. 중력가속도계를 이용할 수 있다는 말은 스마트폰의 기울기를 통해 더 멋진 사용자 인터페이스를 구현할 수 있다는 의미입니다. 가령 자동차 경주의 경우 핸들 없이 폰을 기울임으로써 방향을 조정하는 동작을 할 수 있습니다.

커맨드창을 열어 원하는 디렉터리로 이동한 후에, 다음과 같이 cocos 명령어를 이용하여 새로운 프로젝트를 생성합니다.


c:> cocos new Box2dEx16 -p com.study.box16 -l cpp  ↵


Box2dEx02의 모든 코드를 방금 만든 Box2dEx16에 적용시킵니다.

Box2dEx02의 Classes 폴더의 다음 파일들을 Box2dEx16의 Classes 폴더에 덮어 쓰면 됩니다.


■ HelloWorldScene.h

■ HelloWorldScene.cpp

■ GLES-Render.h

■ GLES-Render.cpp



그러고 나서 다음의 디렉터리에서 

{Cocos2d-x가 설치된 디렉터리} / tests / cpp-tests / Resources / Images

아래의 파일을 찾아 리소스 폴더에 추가합니다.


■  blocks.png


Box2dEx16은 Box2dEx02 - 디버그 모드까지 적용된 상태에서 시작합니다.




헤더 부분에는 중력가속도를 처리할 메서드 선언을 추가합니다.

[ HelloWorldScene.h  박스2D 중력가속도계 ]

#ifndef __HELLOWORLD_SCENE_H__

#define __HELLOWORLD_SCENE_H__


#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

#pragma execution_character_set("utf-8")

#endif


#include "cocos2d.h"

#include "Box2D/Box2D.h"

#include <GLES-Render.h>


#define PTM_RATIO 32


using namespace cocos2d;


class HelloWorld : public cocos2d::Scene

{

public:

    static cocos2d::Scene* createScene();

    virtual bool init();

    CREATE_FUNC(HelloWorld);


    Size winSize;

    Texture2D* texture;

    b2World* _world;


    // For debugging

    GLESDebugDraw* m_debugDraw;

    cocos2d::CustomCommand _customCmd;


    bool createBox2dWorld(bool debug);

    void setBox2dWorld();

    ~HelloWorld();

    virtual void draw(cocos2d::Renderer* renderer, const cocos2d::Mat4& transform,

                               uint32_t flags) override;

    void onDraw(const cocos2d::Mat4& transform, uint32_t flags);


    void onEnter();

    void onExit();

    void tick(float dt);


    b2Body* addNewSprite(Vec2 point, Size size, b2BodyType bodytype,

                                          const char* spriteName, int type);

    void onAcceleration(Acceleration* acc, Event* event);

};


#endif // __HELLOWORLD_SCENE_H__



다음은 중력가속도계 프로젝트에서 Box2dEx04와 달라진 코드 부분입니다.
onEnter 메서드에서 중력가속도를 감지할 리스너를 추가해주고, onAcceleration 메서드에서 중력가속도에 따라서 월드에 작용하는 중력의 방향을 바꾸어 주는 코드를 추가합니다.

[ HelloWorldScene.cpp  박스2D 중력가속도계 ]

#include "HelloWorldScene.h"


SceneHelloWorld::createScene()

{

     생략 : Box2dEx02의 코드와 같음 

}


bool HelloWorld::init()

{

     생략 : Box2dEx02의 코드와 같음 

}


bool HelloWorld::createBox2dWorld(bool debug)

{

     생략 : Box2dEx02의 코드와 같음 

}


void HelloWorld::setBox2dWorld()

{

    this->addNewSprite(Vec2(240280), Size(4040), b2_dynamicBody"test"0);

}


HelloWorld::~HelloWorld()

{

     생략 : Box2dEx02의 코드와 같음 

}


void HelloWorld::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)

{

     생략 : Box2dEx02의 코드와 같음 

}


void HelloWorld::onDraw(const Mat4 &transform, uint32_t flags)

{

     생략 : Box2dEx02의 코드와 같음 

}


void HelloWorld::onEnter()

{

    Scene::onEnter();


    // 중력가속도계 리스너 등록

    Device::setAccelerometerEnabled(true);

    auto listener = EventListenerAcceleration::create(CC_CALLBACK_2(HelloWorld::onAccelerationthis));


    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

}


void HelloWorld::onExit()

{

     생략 : Box2dEx02의 코드와 같음 

}


void HelloWorld::tick(float dt)

{

     생략 : Box2dEx02의 코드와 같음 

}


b2BodyHelloWorld::addNewSprite(Vec2 point, Size size, b2BodyType bodytype,

                                                          const char* spriteName, int type)

{

     생략 : Box2dEx02의 코드와 같음 

}


void HelloWorld::onAcceleration(Acceleration* acc, Event* event)

{

    float accelX = (float)acc->x;

    float accelY = (float)acc->y;


    b2Vec2 gravity(accelX * 10, accelY * 10);


    _world->SetGravity(gravity);

}




스마트폰에서 감지되는 중력가속도는 onAcceleration 메서드의 Acceleration* acc  파라미터로 값이 전해집니다. 해당 값을 받아서 중력을 정하고 월드에 적용하면 폰의 기울기에 따라서 월드에 작용하는 중력의 방향을 바꿀 수 있게 됩니다.

    float accelX = (float)acc->x;

    float accelY = (float)acc->y;


    b2Vec2 gravity(accelX * 10, accelY * 10);


    _world->SetGravity(gravity);



코드를 완성했으면 실행시켜 봅니다.

PC에서 실행해 보면 첫번째 기본 예제와 별다른 차이가 없습니다. 스마트폰에 포팅을 해서 폰에서 실행해 보면서 폰을 기울여봐야 정확한 결과를 알 수 있습니다.












Lv28 내폰젤무거워

모바일 게시판 하단버튼

댓글

새로고침
새로고침

모바일 게시판 하단버튼

지금 뜨는 인벤

더보기+

모바일 게시판 리스트

모바일 게시판 하단버튼

글쓰기

모바일 게시판 페이징