キャラを物理で動かす

キャラを物理で動かす

box2dの物理

andengineでは簡単に物理に沿った動きが可能。
重力、物体同士の衝突、加速等々。

PhysicsWorldを作成
シーンにPhysicsWorldの登録

表示する物体を作成
作成した物体に物理を働かせるbodyを作成

キャラクタのように、物理を受けて動く物体を作成する場合、キャラクタの画像とbodyをつなげる。

キャラと壁に物理を仕込む


キャラクタが重力に沿って動くようにする。
しかし、キャラにだけ物理を仕込むと重力に沿ってキャラが画面外に出てしまうので、壁も作る。

矩形を画面の上下左右に設置する。
設置する矩形に物理を仕込む。力の影響を受けずその場に固定されるStaticBodyとしての特性を設定する。

キャラのスプライトに物理を仕込む。力を受けて動くDynamicBodyの特性を設定する

ソース

GameScene.java

package com.example.blockgame;
 
import org.andengine.engine.camera.Camera;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.SpriteBackground;
 
import org.andengine.entity.sprite.Sprite;
import org.andengine.extension.physics.box2d.PhysicsConnector;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.extension.physics.box2d.PhysicsWorld;
import org.andengine.extension.physics.box2d.util.constants.PhysicsConstants;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
 
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.FixtureDef;
 
public class GameScene extends Scene {
 
	private ResourceManager manager;
	private VertexBufferObjectManager vbom;
	private GameActivity activity;
	private Camera camera;
 
	private PhysicsWorld physicsWorld;
 
	private Sprite face;
	private Sprite background;
 
	public GameScene(ResourceManager manager) {
 
		super();
		this.manager = manager;
		this.vbom = manager.vbom;
		this.camera = manager.camera;
 
		createScene();
	}
 
	private void createScene() {
 
		// 物理の初期化
		physicsWorld = new PhysicsWorld(new Vector2(0, 9.8f), false);
		registerUpdateHandler(physicsWorld);
 
		// 背景の作成
		background = new Sprite(0, 0, manager.mBackgroundRegion, vbom);
		this.setBackground(new SpriteBackground(background));
 
		// 壁の作成
		float cameraHeight = (int) camera.getHeight();
		float cameraWidth = (int) camera.getWidth();
 
		final Rectangle ground = new Rectangle(0, cameraHeight - 2,
				cameraWidth, 2, vbom);
		final Rectangle roof = new Rectangle(0, 0, cameraWidth, 2, vbom);
		final Rectangle left = new Rectangle(0, 0, 2, cameraHeight, vbom);
		final Rectangle right = new Rectangle(cameraWidth - 2, 0, 2,
				cameraHeight, vbom);
 
		final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0,
				0.5f, 0.5f);
		PhysicsFactory.createBoxBody(physicsWorld, ground, BodyType.StaticBody,
				wallFixtureDef);
		PhysicsFactory.createBoxBody(physicsWorld, roof, BodyType.StaticBody,
				wallFixtureDef);
		PhysicsFactory.createBoxBody(physicsWorld, left, BodyType.StaticBody,
				wallFixtureDef);
		PhysicsFactory.createBoxBody(physicsWorld, right, BodyType.StaticBody,
				wallFixtureDef);
 
		attachChild(ground);
		attachChild(roof);
		attachChild(left);
		attachChild(right);
 
		// キャラの作成
		face = new Sprite(300, 400, manager.mFaceRegion, vbom);
 
		// キャラの物理の設定
		FixtureDef faceFixtureDef = PhysicsFactory.createFixtureDef(1.0f, 1.0f,
				0.5f);
		Body faceBody = PhysicsFactory.createCircleBody(physicsWorld, face,
				BodyType.DynamicBody, faceFixtureDef);
		physicsWorld.registerPhysicsConnector(new PhysicsConnector(face,
				faceBody));
		this.attachChild(face);
	}
 
}
 

実行結果

重力に沿って顔が下に落ちて、床に反射している。
最終更新:2013年07月15日 03:12