- FCO 모먼트 10카는 뭔데 넥슨 시발아 [33]
- 메이플 마감 [721]
- 검은사막 루다인더스님 계속 퍼트렸다고요? [104]
- 명조 명조 꿀팁들 모아 봤습니다 [6]
- 차벤 이 정도면 주차 고수인가요? [14]
- 나혼렙 50렙이 되도록 헌터 1돌이 없으면 [4]
Document Version : V1.3 - 2017.07.06 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 사용자 모임"에 동시에 게재되고 있습니다.
개발환경 :
c:> cocos new Box2dEx05 -p com.study.box05 -l cpp ↵
Box2dEx04의 모든 코드를 방금 만든 Box2dEx05에 적용시킵니다.
Box2dEx04의 Classes 폴더의 다음 파일들을 Box2dEx05의 Classes 폴더에 덮어 쓰면 됩니다.
■ HelloWorldScene.h
■ HelloWorldScene.cpp
■ GLES-Render.h
■ GLES-Render.cpp
그러고 나서 다음의 디렉터리에서
{Cocos2d-x가 설치된 디렉터리} / tests / cpp-tests / Resources / Images
아래의 파일을 찾아 리소스 폴더에 추가합니다.
[ HelloWorldScene.h – 박스2D 리볼루트 조인트 ]
… 생략 : Box2dEx04의 코드와 같음 …
[ HelloWorldScene.cpp – 박스2D 리볼루트 조인트 ]
#include "HelloWorldScene.h"
Scene* HelloWorld::createScene()
{
return HelloWorld::create();
}
bool HelloWorld::init()
{
if ( !Scene::init() )
{
return false;
}
/////////////////////////////
// 윈도우 크기를 구한다.
winSize = Director::getInstance()->getWinSize();
// 이미지의 텍스쳐를 구한다.
texture = Director::getInstance()->getTextureCache()->addImage("blocks.png");
// 월드 생성
if (this->createBox2dWorld(true))
{
srand((int)time(nullptr));
this->setBox2dWorld();
this->schedule(schedule_selector(HelloWorld::tick));
}
return true;
}
bool HelloWorld::createBox2dWorld(bool debug)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::setBox2dWorld()
{
// 마우스 조인트 바디를 생성해서 월드에 추가한다.
bDrag = false;
gbody = this->addNewSprite(Vec2(0, 0), Size(0, 0), b2_staticBody, nullptr, 0);
// *****************************************************************************
// 바디를 생성해서 월드에 추가한다.
b2Body* body1 = this->addNewSprite(Vec2(240, 160), Size(32, 32),
b2_staticBody, "test", 0);
b2Body* body2 = this->addNewSprite(Vec2(140, 160), Size(32, 32),
b2_dynamicBody, "test", 0);
b2RevoluteJointDef revJointDef;
b2RevoluteJoint* revJoint;
revJointDef.Initialize(body1, body2, body1->GetPosition());
//revJointDef.enableLimit = true;
//revJointDef.lowerAngle = -90;
//revJointDef.upperAngle = 0;
revJoint = (b2RevoluteJoint *)_world->CreateJoint(&revJointDef);
}
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()
{
… 생략 : Box2dEx04의 코드와 같음 …
}
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)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::onTouchMoved(Touch* touch, Event* event)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
void HelloWorld::onTouchEnded(Touch* touch, Event* event)
{
… 생략 : Box2dEx04의 코드와 같음 …
}
b2RevoluteJointDef revJointDef;
b2RevoluteJoint *revJoint;
revJointDef.Initialize(body1, body2, body1->GetPosition());
revJoint = (b2RevoluteJoint *)_world->CreateJoint(&revJointDef);
// 디버그 드로잉 설정
if (debug) {
// 적색 : 현재 물리 운동을 하는 것
// 회색 : 현재 물리 운동량이 없는 것
m_debugDraw = new GLESDebugDraw(PTM_RATIO);
_world->SetDebugDraw(m_debugDraw);
uint32 flags = 0;
flags += b2Draw::e_shapeBit;
flags += b2Draw::e_jointBit;
//flags += b2Draw::e_aabbBit;
//flags += b2Draw::e_pairBit;
//flags += b2Draw::e_centerOfMassBit;
m_debugDraw->SetFlags(flags);
}
b2RevoluteJointDef revJointDef;
b2RevoluteJoint *revJoint;
revJointDef.Initialize(body1, body2, body1->GetPosition());
revJointDef.enableMotor= true;
revJointDef.motorSpeed = 5; // radians per second. 1 radian = 180/pi degrees
revJointDef.maxMotorTorque = 20; // 회전력
revJoint = (b2RevoluteJoint *)_world->CreateJoint(&revJointDef);
내폰젤무거워