Cocos2d-x简单Box2d代码示例|点击碰撞>HelloWorldScene.cpp<代码演示>
来源:互联网 发布:阿里云香港如何使用cdn 编辑:程序博客网 时间:2024/04/27 14:42
#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
#define PTM_RATIO 32
#define GET_WINSIZE CCDirector::sharedDirector()->getWinSize()
enum {
kTagParentNode =1,
};
using namespace cocos2d;
using namespace CocosDenshion;
USING_NS_CC;
//struct fuc and init elements
PhysicsSprite::PhysicsSprite():m_pBody(NULL){
}
//setter machine
voidPhysicsSprite::setPhysicsBody(b2Body *body){
m_pBody = body;
}
boolPhysicsSprite::isDirty(){
return true;
}
//parentNode trasform
CCAffineTransform PhysicsSprite::nodeToParentTransform(){
b2Vec2 pos =m_pBody->GetPosition();//get Postion By b2body
float x = pos.x *PTM_RATIO;//x
float y = pos.x *PTM_RATIO;//y
//analiys
if (isIgnoreAnchorPointForPosition()) {
x+=m_obAnchorPointInPoints.x;
y+=m_obAnchorPointInPoints.y;
}
//make matix
float radians = m_pBody->GetAngle();
float c = cosf(radians);//正弦
float s = sinf(radians);//余弦
if (m_obAnchorPointInPoints.equals(CCPointZero)) {
x += c * - m_obAnchorPointInPoints.x + -s * -m_obAnchorPointInPoints.y;
y += s * - m_obAnchorPointInPoints.x + c * -m_obAnchorPointInPoints.y;
}
//Rot,Translate Matrix
m_sTransform = CCAffineTransformMake(c,s,-s,c,x,y);
returnm_sTransform;
}
//HelloWorld structFuc
HelloWorld::HelloWorld(){
setTouchEnabled(true);//abled touch
setAccelerometerEnabled(true);//able remote
CCSize s =GET_WINSIZE;
//初始化物理系统
this->initPhysics();
CCSpriteBatchNode *parent =CCSpriteBatchNode::create("bloks.png",100);
m_pSpriteTexture = parent->getTexture();
addChild(parent,kTagParentNode);
//position
addNewSpriteAtPosition(ccp(s.width/2,s.height/2));
CCLabelTTF *label =CCLabelTTF::create("Tap Screen","Marker Felt", 32);
addChild(label,0);
label->setColor(ccc3(0,0, 255));
label->setPosition(ccp(s.width/2, s.height/2-50));
scheduleUpdate();
}
//析构
HelloWorld::~HelloWorld(){
delete world;
world = NULL;
// delete m_debugDraw;
}
voidHelloWorld::initPhysics(){
CCSize s =GET_WINSIZE;
b2Vec2 gravity;
gravity.Set(0.0f, -10.0f);
world = newb2World(gravity);
//DO we want to let bodies sleep:
world->SetAllowSleeping(true);
world->SetContinuousPhysics(true);
//m_debugDrae = new GLESDEbugDraw(PTM_RATIO);
// world->SetDebugDraw(m_debugDraw);
uint32 flags = 0;
flags +=b2Draw::e_shapeBit;
// flags += b2Draw::e_jointBit;
// flags += b2Draw::e_pairBit;
// flags += b2Draw::e_centerOfMassBit;
// flags += b2Draw::e_aabbBit;
//define the ground body
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);//bottom-left center
//call the body factory which allocates memory for the gound body
//from a pool and created the ground box shape(from a pool)
//the body is also added to the world
b2Body *groundBody = world->CreateBody(&groundBodyDef);
//Define the ground box shape
b2EdgeShape groundBox;
//bottom
groundBox.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBox,0);
//top
groundBox.Set(b2Vec2(0,s.height/PTM_RATIO),b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));
groundBody->CreateFixture(&groundBox,0);
//left
groundBox.Set(b2Vec2(0, s.height/PTM_RATIO),b2Vec2(0,0));
groundBody->CreateFixture(&groundBox,0);
//right
groundBox.Set(b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO),b2Vec2(s.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBox,0);
}
voidHelloWorld::draw(){
//Important;
//This is only for debug purposes
//It is recommend to disable it
//本方法用于调试Box2d
CCLayer::draw();
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position);
kmGLPushMatrix();
world->DrawDebugData();
kmGLPopMatrix();
}
voidHelloWorld::addNewSpriteAtPosition(CCPoint point){
CCLog("Add sprite %0.2f x %0.2f",point.x,point.y);
CCNode *parent =getChildByTag(kTagParentNode);
//This is just randomly picking one of the images
int idx = (CCRANDOM_0_1()>.5 ? 0 : 1);
int idy = (CCRANDOM_0_1()>.5 ? 0 : 1);
PhysicsSprite *sprite =new PhysicsSprite();
sprite->initWithTexture(m_pSpriteTexture,CCRectMake(32 * idx, 32 *idy, 32,32));
sprite->autorelease();
parent->addChild(sprite);
//Define the dynamic body
//Set up 1m squared box in the physics world
b2BodyDef bodyDef;
bodyDef.type =b2_dynamicBody;
bodyDef.position.Set(point.x/PTM_RATIO,point.y/PTM_RATIO);
b2Body *body = world->CreateBody(&bodyDef);
//Define another box shape for our dynamic body
b2PolygonShape dynamicBox;
//This is the middle points for our 1m box
dynamicBox.SetAsBox(0.5f,.5f);
//Define the dynamic body fixture
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;//体积
fixtureDef.density =1.0f;//密度
fixtureDef.friction =0.3f;
body->CreateFixture(&fixtureDef);
sprite->setPhysicsBody(body);
}
voidHelloWorld::update(float dt){
//It is recommended that a fixed time step is used with Box2D for stabliity
//of the simulation,however,we are using a variable time step here
//You need to make an informed choice, the follow URL is useful
//http://gafferongames.com/game-physics/fix-your-timestep/
int velocityIterations = 8;
int positionIterations = 1;
//Instruct the world to perform a single step of simulation .It is
//generally best to keep the time step ad iterations fixed;
world->Step(dt, velocityIterations,positionIterations);
//Iterations over the bodies in the Physics world
for (b2Body *b =world->GetBodyList(); b; b = b->GetNext()) {
if (b->GetUserData() !=NULL) {
CCSprite *myActor = (CCSprite *)b->GetUserData();
myActor->setPosition(CCPointMake(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y *PTM_RATIO));
myActor->setRotation(-1*CC_RADIANS_TO_DEGREES(b->GetAngle()));
}
}
}
voidHelloWorld::ccTouchesEnded(CCSet *touches,CCEvent *event){
//Add a new body /atlas sprite at the touched location
CCSetIterator it;
CCTouch *touch;
for (it = touches->begin(); it!= touches->end(); it++) {
touch = (CCTouch *)(* it);
if (!touch) {
break;
}
CCPoint location = touch->getLocationInView();
location =CCDirector::sharedDirector()->convertToGL(location);
addNewSpriteAtPosition(location);
}
}
CCScene* HelloWorld::scene(){
CCScene *scene = CCScene::create();
CCLayer *layer = newHelloWorld();
scene->addChild(layer);
layer->release();
return scene;
}
- Cocos2d-x简单Box2d代码示例|点击碰撞>HelloWorldScene.cpp<代码演示>
- Cocos2d-x简单Box2d代码示例|点击碰撞>HelloWorldScene.h<代码演示>
- Cocos2d-x简单Box2d代码示例|点击碰撞>AppDelegate.h及AppDelegate.cpp<代码演示>
- cocos2d-x box2d 示例
- cocos2D中HelloWorldScene.h和HelloWorldScene.cpp
- Cocos2d-x——HelloWorldScene.cpp的详解
- Cocos2d-x——HelloWorldScene.cpp的详解
- [cocos2d-x]Box2D 碰撞过滤规则
- cocos2d-x 中box2d的简单使用,代码来自传智播客c++课程 。
- Cocos2d-x控件使用CCControlSlider<代码演示>
- Cocos2d-x控件使用CCControlSwitch<代码演示>
- cocos2d-x控件使用CCControlButton<代码演示>
- cocos2d-x Box2D 简单例子
- cocos2d-x简单动画:处理Texture2D和plist文件处理动画<代码演示>
- Cocos2d-x示例代码学习(1)
- cocos2d-x+box2d+tiled 制作无规则碰撞地图
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
- 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
- Cocos2d-x简单Box2d代码示例|点击碰撞>HelloWorldScene.h<代码演示>
- Ubuntu 12.04 配置apue2环境(《unix环境高级编程》源码编译环境安装)
- 实现页面弹出框
- 7.函数
- 整合Spring与Hibernate 异常 Unable to instantiate default tuplizer
- Cocos2d-x简单Box2d代码示例|点击碰撞>HelloWorldScene.cpp<代码演示>
- java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
- ios学习临时笔记-UIViewAutoresizing
- Eclipse快捷键 最有用的快捷键
- Unable to execute dex: Multiple dex files define Landroid/support/v4/accessibilityservice/
- linux-2.6.32内核LCD驱动移植-1
- 策略模式
- jQuery.extend 函数详解
- UIImageJPEGRepresentation和UIImagePNGRepresentation的比较