それでもボクはFIVe3D&box2d


それでもボクは加瀬カワタ亮です。

悲しいことがあったり、うれしいことがあったりと、この梅雨空と同じくしてすっきり抜けたい今日この頃、それでもボクは走り続けなければならんと力んで投稿。box2dの「m_userData」には、いろんなもがぶっ込めるということで、FIVe3DのSprite3Dをぶっ込んでみた。

[SWF]http://knap.jp/blog/swf/box2d_five3d_test1.swf, 425, 500[/SWF]
ちょっとした3D回転をbox2dと組み合わせられるんだね。なるほぼ。

ソーシング。

import Box2D.Collision.b2AABB;
import Box2D.Collision.Shapes.b2CircleDef;
import Box2D.Collision.Shapes.b2PolygonDef;
import Box2D.Collision.Shapes.b2PolygonShape;
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2Body;
import Box2D.Dynamics.b2BodyDef;
import Box2D.Dynamics.b2DebugDraw;
import Box2D.Dynamics.b2World;
import five3D.display.Scene3D;
import five3D.display.Sprite3D;
import five3D.utils.Drawing;

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;

var scene:Scene3D;
var container:Sprite3D;
var sprite:Sprite3D;

var world:b2World;
const DRAW_SCALE:Number = 100;

init();
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent){
makeBox();
}
function init():void {
scene = new Scene3D();
scene.x = 0;
scene.y = 0;
addChild(scene);
container = new Sprite3D();
container.x = 222;
scene.addChild(container);

var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100, -100);
worldAABB.upperBound.Set(100, 100);

// 重力
var gravity:b2Vec2 = new b2Vec2(0, 10);
world = new b2World(worldAABB, gravity, true);

/** 床    **/
//床の位置
var floorBodyDef:b2BodyDef = new b2BodyDef();
floorBodyDef.position.Set(2.15, 4); //m単位
// 床の形
// 指定するのはその半分の値
var floorShapeDef:b2PolygonDef = new b2PolygonDef();
floorShapeDef.SetAsBox(2, 0.1);
// 床を動かない物体として作る
var floor:b2Body = world.CreateBody(floorBodyDef);
floor.CreateShape(floorShapeDef);
var floorImage:Sprite3D = new Sprite3D();
floorImage.graphics3D.beginFill(0x000000);
floorImage.graphics3D.drawRect(-200, -10, 400, 10);
floorImage.graphics3D.endFill();
floorImage.x = 0;
floorImage.y = 0;
floor.m_userData = new Sprite3D();
// Spriteの場所を物理エンジン内の場所と一致させる
floor.GetUserData().x = floor.GetWorldCenter().x * DRAW_SCALE;
floor.GetUserData().y = floor.GetWorldCenter().y * DRAW_SCALE;
floor.GetUserData().addChild(floorImage);
container.addChild(floor.GetUserData());

//落下箱の作成
makeBox();
}

function makeBox(){
// 箱の設置
//ランダムのX位置
var posX:Number = Math.random()*2+1;
//ランダムの回転
var rotate:Number = Math.random()*0.8;
// 箱の位置を左からランダム、上から0.5mとする
var bodyDef:b2BodyDef = new b2BodyDef();
bodyDef.position.Set(posX, 1);

var bodyShape:b2PolygonDef = new b2PolygonDef();
bodyShape.SetAsOrientedBox(0.5, 0.5, new b2Vec2(0, 0), rotate);
bodyShape.density = 1;
bodyShape.restitution = 0;

var body:b2Body = world.CreateBody(bodyDef);
body.CreateShape(bodyShape);
body.SetMassFromShapes();

// スプライトを表示する
var bodyImage:Sprite3D = new Sprite3D();
bodyImage.graphics3D.beginFill(0x000000);
bodyImage.graphics3D.drawRect(-50, -50, 100, 100);
bodyImage.graphics3D.endFill();
bodyImage.x = 0;
bodyImage.y = 0;
bodyImage.rotationZ = rotate * 180 / Math.PI;
body.m_userData = new Sprite3D();
body.GetUserData().x = body.GetWorldCenter().x * DRAW_SCALE-222;
body.GetUserData().y = body.GetWorldCenter().y * DRAW_SCALE;
body.GetUserData().addChild(bodyImage);
container.addChild(body.GetUserData());
/*
//デバッグ非表示
var debugDraw:b2DebugDraw = new b2DebugDraw();
debugDraw.m_sprite = this;
debugDraw.m_drawScale = 100; // 1mを100ピクセルにする
debugDraw.m_fillAlpha = 0.3; // 不透明度
debugDraw.m_lineThickness = 1; // 線の太さ
debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit;
world.SetDebugDraw(debugDraw);*/

}

function enterFrameHandler(event:Event):void {
// ワールド内の全てのb2Bodyに対する処理
for (var b:b2Body = world.GetBodyList(); b; b = b.GetNext()) {
if (b.GetUserData() is Sprite3D) {
b.GetUserData().x = b.GetWorldCenter().x * DRAW_SCALE-222;
b.GetUserData().y = b.GetWorldCenter().y * DRAW_SCALE;
b.GetUserData().rotationZ = b.GetAngle() * 180 / Math.PI;
}
}
container.rotationY += 1;
world.Step(1 / 24, 10);
}

Scroll to top