Box2d flash 2.0.2 Circle

アバター画像 kawata

0

カワタです。

高校球児なみに連投。CUBEをCircleにしてみた。今回書き換えたのは「var bodyShape:b2PolygonDef = new b2PolygonDef();」→「var bodyShape:b2CircleDef = new b2CircleDef();」と、「bodyShape.SetAsOrientedBox(0.5, 0.5, new b2Vec2(0, 0), rotate);」→「bodyShape.radius = 0.5;」のみ。CUBEからCircleにするのは簡単。あとは使いどころか。

[SWF]http://knap.jp/blog/swf/box2d_test3.swf, 425, 500[/SWF]

ソースはこちらでおます。

import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Dynamics.Joints.*;
import Box2D.Dynamics.Contacts.*;
import Box2D.Common.*;
import Box2D.Common.Math.*;
import General.*;

var world:b2World;
const DRAW_SCALE:Number = 100;
var m_input:Input;
var m_mouseJoint:b2MouseJoint;  //マウスジョイント
var mouseXWorldPhys:Number;
var mouseYWorldPhys:Number;
var m_mouse_dowm:Boolean = false;  //マウスボタン押されてるか

init(); //初期表示へ

//レンダリング
addEventListener(Event.ENTER_FRAME, enterFrameHandler);

//ボックスの作成
addBt.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(e:MouseEvent){
makeBox();
}

//初期設定
function init():void {
buttonMode = true;

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

// マウス操作
m_input = new Input(this);

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

/** 床    **/
//床の位置
var floorBodyDef:b2BodyDef = new b2BodyDef();
floorBodyDef.position.Set(2.15, 5); //m単位
// 床の形
// 指定するのはその半分の値
var floorShapeDef:b2PolygonDef = new b2PolygonDef();
floorShapeDef.SetAsBox(2, 0.1);
// 床を動かない物体として作る
var floor:b2Body = world.CreateBody(floorBodyDef);
floor.CreateShape(floorShapeDef);
// 床のスプライトを作る
var floorImage:Sprite = new FloorImage();
// スプライトのサイズを合わせる
floorImage.width = 4 * DRAW_SCALE;
floorImage.height = 0.2 * DRAW_SCALE;
// 床の中心が(0, 0)に来るように,左上にずらす
floorImage.x = -floorImage.width / 2;
floorImage.y = -floorImage.height / 2;
// b2BodyのユーザデータとしてSpriteを作る
floor.m_userData = new Sprite();
// Spriteの場所を物理エンジン内の場所と一致させる
floor.GetUserData().x = floor.GetWorldCenter().x * DRAW_SCALE;
floor.GetUserData().y = floor.GetWorldCenter().y * DRAW_SCALE;
floor.GetUserData().addChild(floorImage);
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:b2CircleDef = new b2CircleDef();
bodyShape.radius = 0.5;
bodyShape.density = 1; // 密度 [kg/m^2]
bodyShape.restitution = 0.5; // 反発係数、通常は0~1
bodyShape.friction = 0.5; // 摩擦係数、通常は0~1

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

// スプライトを表示する
var bodyImage:Sprite = new BodyImage()
bodyImage.width = 1 * DRAW_SCALE;
bodyImage.height = 1 * DRAW_SCALE;
bodyImage.rotation = rotate * 180 / Math.PI;
body.m_userData = new Sprite();
body.GetUserData().x = body.GetWorldCenter().x * DRAW_SCALE;
body.GetUserData().y = body.GetWorldCenter().y * DRAW_SCALE;
body.GetUserData().addChild(bodyImage);
addChild(body.GetUserData());

//addCircleボタンを最前面に
var lastIndex:int = this.numChildren – 1;
this.setChildIndex(addBt, lastIndex);

/*デバッグ非表示
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 Sprite) {
b.GetUserData().x = b.GetWorldCenter().x * DRAW_SCALE;
b.GetUserData().y = b.GetWorldCenter().y * DRAW_SCALE;
b.GetUserData().rotation = b.GetAngle() * 180 / Math.PI;
}
}
updateMouseWorld();
mouseDrag();
world.Step(1 / 24, 10);
}

function updateMouseWorld():void {
// ワールド内でのマウス座標を取得
mouseXWorldPhys = (stage.mouseX) / DRAW_SCALE;
mouseYWorldPhys = (stage.mouseY) / DRAW_SCALE;
}

function mouseDrag():void{
// mouse press
if (Input.mouseDown && !m_mouseJoint) {
// 操作対象を取得
var body:b2Body = GetBodyAtMouse();
if (body) {    // 操作対象がある場合
var md:b2MouseJointDef = new b2MouseJointDef();
md.body1 = world.GetGroundBody();
md.body2 = body;
md.target.Set(mouseXWorldPhys, mouseYWorldPhys);
md.maxForce  = 300.0 * body.GetMass();
md.timeStep  = 1/24;
m_mouseJoint = world.CreateJoint(md) as b2MouseJoint;
body.WakeUp();
}
}

// mouse release
if (!Input.mouseDown){
if (m_mouseJoint) {
world.DestroyJoint(m_mouseJoint);
m_mouseJoint = null;
}
}

// mouse move
if (m_mouseJoint) {
var p2:b2Vec2 = new b2Vec2(mouseXWorldPhys, mouseYWorldPhys);
m_mouseJoint.SetTarget(p2);
}
}

//マウスの下の物体取得
var mousePVec:b2Vec2 = new b2Vec2();
function GetBodyAtMouse(includeStatic:Boolean=false):b2Body{
// Make a small box.
mousePVec.Set(mouseXWorldPhys, mouseYWorldPhys);
var aabb:b2AABB = new b2AABB();
aabb.lowerBound.Set(mouseXWorldPhys – 0.001, mouseYWorldPhys – 0.001);
aabb.upperBound.Set(mouseXWorldPhys + 0.001, mouseYWorldPhys + 0.001);

// Query the world for overlapping shapes.
var k_maxCount:int = 10;
var shapes:Array = new Array();
var count:int = world.Query(aabb, shapes, k_maxCount);
var body:b2Body = null;
for (var i:int = 0; i < count; ++i)
{

if (shapes[i].GetBody().IsStatic() == false || includeStatic)
{

var tShape:b2Shape = shapes[i] as b2Shape;
var inside:Boolean = tShape.TestPoint(tShape.GetBody().GetXForm(), mousePVec);
if (inside)
{
body = tShape.GetBody();
break;
}
}
}
return body;
}

アバター画像

ぽちっとおうえん!

シェア

  • Facebook
  • LINE
  • X
Box2d flash 2.0.2 俯瞰表現? Box2d flash 2.0.2 マウスジョイント