#include "HelloWorldScene.h"
Scene* HelloWorld::createScene()
{
… 생략 : Box2dEx04의 코드와 같음 …
}
bool HelloWorld::init()
{
… 생략 : Box2dEx04의 코드와 같음 …
}
bool HelloWorld::createBox2dWorld(bool debug)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::setBox2dWorld()
{
Sprite* bg1 = Sprite::create("background1.png");
bg1->setPosition(Vec2(0, 0));
bg1->setAnchorPoint(Vec2(0, 0));
this->addChild(bg1);
myBall = this->addNewSprite(Vec2(25, 50), Size(50, 50), b2_dynamicBody, "test", 0);
Sprite* myBallSprite = (Sprite *)myBall->GetUserData();
Rect myBoundary = Rect(0, 0, winSize.width * 2, winSize.height);
// 손쉬운 화면 스크롤링 기법인 Follow 액션을 사용해 넓은 화면을 이동시킨다.
// 바디를 던지면 해당 바디에 카메라가 붙어 있으므로 자동으로 화면이 스크롤된다.
this->runAction(Follow::create(myBallSprite, myBoundary));
// 오른쪽 구석에 쌓아 놓을 바디들의 벡터값을 구성하고 스프라이트를 추가한다.
float start = winSize.width * 2 - 130;
struct BLOCK {
Vec2 point;
Size size;
};
int const numBlocks = 6;
struct BLOCK blocks[numBlocks] =
{
{ Vec2(start, 50), Size(10, 100) },
{ Vec2(start + 50, 50), Size(10, 100) },
{ Vec2(start + 25, 100 + 5), Size(200, 10) },
{ Vec2(start, 120 + 50), Size(10, 100) },
{ Vec2(start + 50, 120 + 50), Size(10, 100) },
{ Vec2(start + 25, 220 + 5), Size(200, 10) }
};
for (int i = 0; i<numBlocks; i++)
{
this->addNewSprite(blocks[i].point, blocks[i].size, b2_dynamicBody, "test", 0);
}
}
HelloWorld::~HelloWorld()
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::onDraw(const Mat4 &transform, uint32_t flags)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
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()
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::tick(float dt)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
b2Body* HelloWorld::addNewSprite(Vec2 point, Size size, b2BodyType bodytype,
const char* spriteName, int type)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
b2Body* HelloWorld::getBodyAtTab(Vec2 p)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
bool HelloWorld::onTouchBegan(Touch* touch, Event* event)
{
Vec2 touchPoint = touch->getLocation();
Vec2 touchPoint2 = Node::convertToNodeSpace(touchPoint);
//log("nodeSpace..%f", touchPoint2.x);
b2Body* tBall = this->getBodyAtTab(touchPoint2);
bBallTouch = false;
if (tBall == myBall)
{
log("touch start..");
bBallTouch = true;
startPoint = b2Vec2(touchPoint2.x / PTM_RATIO, touchPoint2.y / PTM_RATIO);
}
return true;
}
void HelloWorld::onTouchEnded(Touch* touch, Event* event)
{
Vec2 touchPoint = touch->getLocation();
Vec2 touchPoint2 = Node::convertToNodeSpace(touchPoint);
if (myBall && bBallTouch)
{
log("touch end..");
endPoint = b2Vec2(touchPoint2.x / PTM_RATIO, touchPoint2.y / PTM_RATIO);
b2Vec2 force = endPoint - startPoint;
force.x *= 250.0f;
force.y *= 250.0f;
myBall->ApplyForceToCenter(force, true);
bBallTouch = false;
}
}