#include "HelloWorldScene.h"
Scene* HelloWorld::createScene()
{
… 생략 : Box2dEx02의 코드와 같음 …
}
bool HelloWorld::init()
{
… 생략 : Box2dEx02의 코드와 같음 …
}
bool HelloWorld::createBox2dWorld(bool debug)
{
… 생략 : Box2dEx02의 코드와 같음 …
}
void HelloWorld::setBox2dWorld()
{
playerIsFlying = false;
// 새로운 물리 객체의 바디와 해당 스프라이트를 추가한다.
addNewSpriteAtPosition(Vec2(240, 160));
}
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();
// 싱글터치모드로 터치리스너 등록
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
}
void HelloWorld::onExit()
{
… 생략 : Box2dEx02의 코드와 같음 …
}
void HelloWorld::tick(float dt)
{
int velocityIterations = 8;
int positionIterations = 3;
// Step : 물리 세계를 시뮬레이션한다.
_world->Step(dt, velocityIterations, positionIterations);
// 만들어진 객체 만큼 루프를 돌리면서 바디에 붙인 스프라이트를 여기서 제어한다.
for (b2Body* b = _world->GetBodyList(); b; b = b->GetNext())
{
if (b->GetUserData() != nullptr) {
Sprite* spriteData = (Sprite *)b->GetUserData();
spriteData->setPosition(Vec2(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO));
spriteData->setRotation(-1 * CC_RADIANS_TO_DEGREES(b->GetAngle()));
}
}
if (playerIsFlying)
{
myBall->ApplyLinearImpulse(b2Vec2(0, playerVelocity),
myBall->GetWorldCenter(),
true);
playerVelocity += 0.01f;
if (playerVelocity > 1.5f)
playerVelocity = 1.5f;
}
}
void HelloWorld::addNewSpriteAtPosition(Vec2 location)
{
// 바디데프 만들고 속성들을 지정한다.
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(location.x / PTM_RATIO, location.y / PTM_RATIO);
// 보통은 유져데이터에 스프라이트를 붙이는데
// 여기서는 아무 데이타를 넣지 않고 디버그 드로잉만 수행한다.
bodyDef.userData = nullptr;
// 월드에 바디데프의 정보로 바디를 만든다.
myBall = _world->CreateBody(&bodyDef);
// 바디에 적용할 물리 속성용 바디의 모양을 만든다. 여기서는 원을 만든다.
b2CircleShape circle;
// 바디의 크기 지정 - 원의 경우엔 반지름
circle.m_radius = 0.45f;
b2FixtureDef fixtureDef;
// 모양
fixtureDef.shape = &circle;
// 밀도
fixtureDef.density = 1.0f;
// 마찰력
fixtureDef.friction = 0.2f;
// 반발력
fixtureDef.restitution = 0.6f;
myBall->CreateFixture(&fixtureDef);
}
bool HelloWorld::onTouchBegan(Touch* touch, Event* event)
{
playerVelocity = 0.5f;
playerIsFlying = true;
return true;
}
void HelloWorld::onTouchEnded(Touch* touch, Event* event)
{
playerIsFlying = false;
playerVelocity = 0.0f;
}