我有一个游戏,在那里使用陀螺仪,我控制了几个街区。现在的问题是我在我的andengine代码中添加了box2d,但是这些实体似乎没有在另一个上做出反应,导致它们重叠,而不是真正做物理的东西。
在我的onCreateScene中我有这个:
@Override
protected Scene onCreateScene() {
this.mMainScene = new Scene();
backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion, getVertexBufferObjectManager());
physicsWorld = new PhysicsWorld(new Vector2(0, 0), false);
final Player oPlayer = new Player(centerX, centerY, this.goodTiledTextureRegion, this.getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);
body = PhysicsFactory.createBoxBody(physicsWorld, oPlayer, BodyType.DynamicBody, player_fix);
oPlayer.setBody(body);
playerID++;
players.add(oPlayer);
for (Player player : players) {
player.setPlayers(players);
mMainScene.attachChild(player);
physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
mMainScene.registerTouchArea(player);
}
this.mMainScene.registerUpdateHandler(physicsWorld);
this.mMainScene.registerUpdateHandler(new TimerHandler(0.1f, true, new ITimerCallback() {
@Override
public void onTimePassed(final TimerHandler pTimerHandler) {
Player player = new Player(random, 5, goodTiledTextureRegion, getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
body = PhysicsFactory.createBoxBody(physicsWorld, player, BodyType.DynamicBody, player_fix);
player.setBody(body);
players.add(player);
mMainScene.detachChildren();
mMainScene.attachChild(backgroundSprite);
for (Player player : players) {
player.setPlayers(players);
mMainScene.attachChild(player);
player.body.setLinearVelocity(AccelerometerHelper.TILTX * 5, AccelerometerHelper.TILTY * 5);
physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
mMainScene.registerTouchArea(player);
}
}
return this.mMainScene;
}
现在,我创建场景,创建物理世界。 然后我创建了我的第一个“玩家”,(这是一个精灵,我移动)。我为它创建了一个主体,并在我的Player.class(实体)中设置了该主体。从它的实体访问每个玩家的身体。然后在每一次更新(代码有点长,但我拿出与物理没有任何关系的东西)我创建一个新的播放器。然后对于我的arraylist(玩家)中的每个玩家,我在加速度计之后设置线速度,使其移动。问题在于,如果玩家击中另一个玩家,他们会重叠,并且不会对此产生反应。
播放器夹具在任何地方都是相同的player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);
并且BodyType始终是DynamicBody。有人能告诉我我错过了什么吗?
答案 0 :(得分:0)
您可以从http://code.google.com/p/andenginephysicsbox2dextension/下载。
我使用Eclipse,并将其添加为项目。然后我把它包含在我的项目中。 我还推荐项目AndEngineExamples,它向您展示各种不错的工具。
以下是我添加Walls的方法:
final Rectangle wall = new Rectangle(pX, pY, pWidth, pHeight, pVman); // pvman is the ObjectVertexBufferManager
wall.setIgnoreUpdate(true);
Body body = PhysicsFactory.createBoxBody(
pParent.mPhysicsWorld,
wall,
BodyType.StaticBody,
Environment.WALL_FIXTURE_DEF
);
pScene.getFirstChild().attachChild(wall);
pParent.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(wall, body, true, true));
// pParent is of type GameActivity.
WALL_FIXTURE_DEF是:
/* The categories. */
public static final short CATEGORYBIT_WALL = 1;
public static final short CATEGORYBIT_MONNING = 2;
public static final short CATEGORYBIT_WHEEL = 4;
/* And what should collide with what. */
public static final short MASKBITS_WALL = CATEGORYBIT_WALL + CATEGORYBIT_MONNING + CATEGORYBIT_WHEEL;
public static final short MASKBITS_MONNING = CATEGORYBIT_WALL;
public static final short MASKBITS_WHEEL = CATEGORYBIT_WALL;
public static final FixtureDef WALL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0f, 0.9f, false, CATEGORYBIT_WALL, MASKBITS_WALL, (short)0);
public static final FixtureDef MONNING_FIXTURE_DEF = PhysicsFactory.createFixtureDef(10, 0f, 0f, false, CATEGORYBIT_MONNING, MASKBITS_MONNING, (short)0);
public static final FixtureDef WHEEL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(20, 0f, 10f, false, CATEGORYBIT_WHEEL, MASKBITS_WHEEL, (short)0);
public static final float GRAVITY_MONNINGS = 2*SensorManager.GRAVITY_EARTH;
这也使用MASK_BITS处理冲突。 Monnings和Wheels不应相互碰撞,但它们应与Walls碰撞。
物理世界在createScene函数中创建:
this.mPhysicsWorld = new FixedStepPhysicsWorld(Environment.FPS, new Vector2(0, Environment.GRAVITY_MONNINGS), false);
AndEngineExamples项目(http://code.google.com/p/andengineexamples/)是必须安装的。
这可能是您需要的代码。请注意,我没有运行代码,因此它可能包含错误但我希望你能得到这个想法:(抱歉缩进)
@Override
protected Scene onCreateScene() {
this.mMainScene = new Scene();
backgroundSprite = new Sprite(0, 0, this.mBackgroundTextureRegion, getVertexBufferObjectManager());
physicsWorld = new PhysicsWorld(new Vector2(0, 0), false);
final Player oPlayer = new Player(centerX, centerY, this.goodTiledTextureRegion, this.getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
player_fix = PhysicsFactory.createFixtureDef(10.0f, 0.2f, 1.0f);
oPlayer.setBody(body);
playerID++;
players.add(oPlayer);
for (Player player : players) {
Body body = PhysicsFactory.createBoxBody(physicsWorld, oPlayer, BodyType.DynamicBody, player_fix);
player.setPlayers(players);
mMainScene.attachChild(player);
physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
mMainScene.registerTouchArea(player);
}
this.mMainScene.registerUpdateHandler(physicsWorld);
this.mMainScene.registerUpdateHandler(new TimerHandler(0.1f, true, new ITimerCallback() {
@Override
public void onTimePassed(final TimerHandler pTimerHandler) {
Player player = new Player(random, 5, goodTiledTextureRegion, getVertexBufferObjectManager(), MainActivity.this, playerID, 0);
Body body = PhysicsFactory.createBoxBody(physicsWorld, player, BodyType.DynamicBody, player_fix);
player.setBody(body);
players.add(player);
player.setPlayers(players);
mMainScene.attachChild(player);
/* This might have to be in the loop */
player.body.setLinearVelocity(AccelerometerHelper.TILTX * 5, AccelerometerHelper.TILTY * 5);
physicsWorld.registerPhysicsConnector(new PhysicsConnector(player, body, true, false));
mMainScene.registerTouchArea(player);
}
}
return this.mMainScene;
}