Box2d: 2-Add to world
来源:互联网 发布:安卓 卸载 知乎 编辑:程序博客网 时间:2024/05/16 10:27
Adding Boxes to the Box2D World
Listing 12–4.Adding a New Dynamic Body with a Sprite
-(void) addNewSpriteAt:(CGPoint)pos
{
CCSpriteBatchNode* batch = (CCSpriteBatchNode*) [self getChildByTag:kTagBatchNode];
int idx = CCRANDOM_0_1() * TILESET_COLUMNS;
int idy = CCRANDOM_0_1() * TILESET_ROWS;
CGRect tileRect = CGRectMake(TILESIZE * idx, TILESIZE * idy, TILESIZE, TILESIZE);
CCSprite* sprite = [CCSpritespriteWithBatchNode:batch rect:tileRect];sprite.position = pos;
[batch addChild:sprite];
// Create a body definition and set it to be a dynamic body
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position = [self toMeters:pos];
bodyDef.userData = sprite;
b2Body* body = world->CreateBody(&bodyDef);
// Define a box shape and assign it to the body fixture
b2PolygonShape dynamicBox;
float tileInMeters = TILESIZE / PTM_RATIO;
dynamicBox.SetAsBox(tileInMeters * 0.5f, tileInMeters * 0.5f);
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 0.3f;
fixtureDef.friction = 0.5f;
fixtureDef.restitution =0.6f;
body->CreateFixture(&fixtureDef);
}
Connecting Sprites with Bodies
Listing 12–5. Updating Each Body’s Sprite Position and Rotation
-(void) update:(ccTime)delta{
// Advance the physics world by one step, using fixed time steps
float timeStep = 0.03f;
int32 velocityIterations = 8;
int32 positionIterations = 1;
world->Step(timeStep, velocityIterations, positionIterations);
for (b2Body* body = world->GetBodyList(); body != nil; body = body->GetNext()) {
CCSprite* sprite = (CCSprite*)body->GetUserData();
if (sprite!= NULL) {
sprite.position = [self toPixels:body->GetPosition()];float angle = body->GetAngle();
sprite.rotation = CC_RADIANS_TO_DEGREES(angle) *-1;
}
}
}
Collision Detection
Box2D has a b2ContactListener class, which you are supposed to subclass if you wantto receive collision callbacks.
Listing 12–6. The ContactListener Class’s Interface#import "Box2D.h"
class ContactListener : public b2ContactListener{
private:
void BeginContact(b2Contact* contact);
void EndContact(b2Contact* contact);
};
Listing 12–7. Checking for the Beginning and Ending of Collisions#import "ContactListener.h"
#import "cocos2d.h"
void ContactListener::BeginContact(b2Contact* contact){
b2Body* bodyA = contact->GetFixtureA()->GetBody();
b2Body* bodyB = contact->GetFixtureB()->GetBody();
CCSprite* spriteA = (CCSprite*)bodyA->GetUserData();
CCSprite* spriteB = (CCSprite*)bodyB->GetUserData();
if (spriteA != NULL && spriteB != NULL){
spriteA.color = ccMAGENTA;
spriteB.color = ccMAGENTA;
}
}
void ContactListener::EndContact(b2Contact* contact) { ... }
Set the contact listener for the world:
contactListener = new ContactListener();
world->SetContactListener(contactListener);
- Box2d: 2-Add to world
- box2d 中文api world类
- Box2D C++ 教程-查询 World
- Box2D C++ 教程-查询 World
- 《Box2D for Flash Games》翻译 (一)hello box2d world
- Box2D C++教程-设置世界(World)7
- box2d之路---设置世界(world)
- Box2D C++教程-设置世界(World)7
- Codeforces Round #143 (Div. 2) C. To Add or Not to Add 胡搞
- Codeforces Round #143 (Div. 2) C. To Add or Not to Add
- Codeforces Round #143 (Div. 2) C. To Add or Not to Add —— 二分
- To Add or Not to Add CodeForces
- 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D
- 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D .
- 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D
- Box2D的编译与运行 - Hello world
- Box2D v2.1.0用户手册(10)——世界(World Class)
- How To Create A Breakout Game with Box2D and Cocos2D Tutorial: Part 2/2
- Objective-C之Foundation中常见的结构体
- 详细介绍Java垃圾回收机制
- C++primer难点之类
- OD插件怎么弄 以及 OllySSEH原理
- (转)JSP的内置对象及其作用
- Box2d: 2-Add to world
- Thinking in BigData(十)大数据之数据挖掘技术(1)
- 冒泡排序
- 市委组织部项目--for循环优化
- Android view实例化
- 信号处理和模式识别方面的 matlab toolbox
- AJAX 状态值(readyState)与状态码(status)详解
- Codeforces 398 A. Cards
- 教练是老师