Cocos2D-Android-1之源码详解:5.Box2dTest
发布时间:2023-05-15 13:12:30
Box2dTest是Cocos2D-Android-1示例代码中的一个重要的测试类,其主要功能是测试Box2D物理引擎的相关功能和效果。本文将对该类的源码进行详解,帮助开发者更好地理解Box2D物理引擎的应用。
Box2dTest类的源码位于Cocos2D-Android-1项目中的src/org/cocos2d/tests/Box2dTest.java文件中。
Box2dTest类继承自CCLayer类,重写了onEnter()方法,在该方法中完成了Box2D物理引擎的初始化、添加物理世界、添加物理物体等操作。具体实现如下:
public void onEnter() {
super.onEnter();
CGSize s = CCDirector.sharedDirector().winSize();
CCNode node = CCNode.node();
addChild(node, 0);
world = new b2World(new Vec2(0, -10), true);
world.setContinuousPhysics(true);
CCSprite bg = CCSprite.sprite("grossini.png");
bg.setAnchorPoint(CGPoint.ccp(0, 0));
node.addChild(bg, -1);
// Add ground
addGround();
// Add small circles
addSmallCircles(5);
// Add many triangles
addManyTriangles(32);
// Add rotating pentagon
addRotatingPentagon();
// Add circle
addBigCircle();
CCMenuItemLabel item1 = CCMenuItemLabel.item(
CCLabel.makeLabel("Tap screen", "DroidSans", 32),
this, "onTap");
CCMenu menu = CCMenu.menu(item1);
node.addChild(menu);
menu.setPosition(CGPoint.make(s.width / 2, s.height / 2));
}
其中,addGround()、addSmallCircles()、addManyTriangles()、addRotatingPentagon()和addBigCircle()方法分别用于添加不同形状的物理物体。这些方法的实现都比较类似,以addSmallCircles()方法为例:
private void addSmallCircles(int n) {
float radius = 15;
CCTexture2D texture = CCTextureCache.sharedTextureCache().addImage("powered.png");
for (int i = 0; i < n; i++) {
CCSprite sprite = CCSprite.spriteWithTexture(texture, CGRect.make(0, 0, 512, 512));
addChild(sprite);
float x = CCRandom.float_0_1() * 200;
float y = CCRandom.float_0_1() * 200 + 200;
sprite.setPosition(CGPoint.ccp(x, y));
b2BodyDef bodyDef = new b2BodyDef();
bodyDef.position.set(sprite.getPosition().x / PTM_RATIO,
sprite.getPosition().y / PTM_RATIO);
bodyDef.userData = sprite;
b2Body body = world.createBody(bodyDef);
b2CircleShape shape = new b2CircleShape();
shape.m_radius = radius / PTM_RATIO;
b2FixtureDef fixtureDef = new b2FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.2f;
body.createFixture(fixtureDef);
}
}
该方法首先通过CCRandom生成随机的x、y坐标,然后创建一个CCSprite对象,并设置其位置。接着创建一个b2BodyDef对象,设置其位置并将sprite作为其userData,创建一个b2Body对象,并通过b2CircleShape和b2FixtureDef设置其物理属性。最后将body和sprite添加到世界中和图层中。
以上就是Box2dTest类的简单实现。通过该类,开发者可以通过创建不同形状的物理物体,快速了解Box2D物理引擎的基本操作和效果,为后续的游戏开发做好准备。
