Usando Box2D no Flash / ActionScript 3.0 – tutorial básico

Garimpei muito na Web buscando um tutorial simples para o uso da biblioteca de física Box2D e que funcionasse no Flash. Encontrei códigos com formato antigo, que rodam em versões anteriores da biblioteca (ou em Flash Player anteriores), e principalmente pouco interessantes

Foi então que resolvi experimentar usar por conta própria o manual do Box2D, que tem um tutorial que, apesar de estar em C/C++, é muito didático. Adaptei o código para o Actionscript 3.0 e funcionou.

Para ver o programa funcionando usei a as3isolib, para geração de gráficos isométricos – a intenção é tornar visível o funcionamento. Porém, você pode usar o próprio trace() do Flash para exibir a posição da caixa que cai sobre um piso e dá uma leve quicada. Mais detalhes sobre o código veja no tutorial do manual.

package{
import flash.display.*;
import flash.events.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import as3isolib.display.primitive.IsoBox;
import as3isolib.display.scene.IsoScene;

public class Main extends Sprite{

public var world:b2World;
public var groundBodyDef, bodyDef:b2BodyDef;
public var body, groundBody:b2Body;
public var groundBox:b2PolygonShape = new b2PolygonShape();
public var dynamicBox:b2PolygonShape = new b2PolygonShape();
public var fixtureDef:b2FixtureDef = new b2FixtureDef();
public var timeStep:Number = Number(1 / 60);
public var velocityIterations:Number = 6;
public var positionIterations:Number = 2;

/*objetos as3isolib - se não quiser baixar a biblioteca você pode usar o trace() para exibir a posição da caixa*/
public var scene:IsoScene = new IsoScene();
public var groundIso:IsoBox = new IsoBox();
public var bodyIso:IsoBox = new IsoBox();

public function Main() {
stage.scaleMode = StageScaleMode.NO_SCALE;

// função que fará tudo se mover
stage.addEventListener(Event.ENTER_FRAME, update);

/* CÓDIGO BOX2D */
// criação do ambiente
world = new b2World(new b2Vec2(0, -10), true);

// criação do chão, onde a caixa irá cair
groundBodyDef = new b2BodyDef();
groundBodyDef.position.Set(250, -50);

// adicionando o corpo ao ambiente
groundBody = world.CreateBody(groundBodyDef);

groundBox.SetAsBox(50, 10);

groundBody.CreateFixture2(groundBox);

// a caixa que cairá
bodyDef = new b2BodyDef();
bodyDef.type = b2Body.b2_dynamicBody;
bodyDef.position.Set(250, 50);

body = world.CreateBody(bodyDef);

dynamicBox.SetAsBox(1, 1);

fixtureDef.shape = dynamicBox;
fixtureDef.density = 1;
fixtureDef.friction = 0.3;
fixtureDef.restitution = 0.1;

body.CreateFixture(fixtureDef);
// -X-

/* CÓDIGO AS3ISOLIB - NÃO ESSENCIAL */
// gráficos do chão
groundIso.setSize(50, 50, 10);

bodyIso.width = 10;
bodyIso.length = 10;
bodyIso.height = 10;

scene.hostContainer = this;
scene.addChild(bodyIso);
scene.addChild(groundIso);
// -X-
}

public function update(evt:Event):void {
// executando a ação física
world.Step(timeStep, velocityIterations, positionIterations);
world.ClearForces();

groundIso.x = groundBody.GetPosition().x;
groundIso.z = groundBody.GetPosition().y;

/* CÓDIGO AS3ISOLIB - NÃO ESSENCIAL */
bodyIso.x = body.GetPosition().x;
bodyIso.z = body.GetPosition().y;

scene.render();
// -x-
}
}
}
Be Sociable, Share!

4 pensamentos em “Usando Box2D no Flash / ActionScript 3.0 – tutorial básico”

    1. Vale lembrar que nesse post foi usado a as3isolib, mas você não precisa de uma biblioteca externa para visualizar o resultado. O próprio Box2D tem um modo debug que desenha na tela os objetos.

  1. Ta, interessante, mas faltou você explicar como fez pra usar o Box2D no Flash e tbm esqueceu de falar sobre como configurar pra usar o as3isolib no projeto. Apenas colou o código e….pfff…tendi nada.

    To tentando aqui descobrir como vc fez pra usar o Box2D no Flash, mas seria mais útil se não fosse necessário eu caçar outros sites/blogs como fazer isso.

    Leitores são tudo, se você fidelizar 1, estará fidelizando vários. Melhora esse post aí amigo, deixa ele mais completo e útil à qualquer um que acessar e quiser aprender algo.

    Abraço.

  2. com esse código vc consegue testar o jogo inteiro sem a necessidade de ficar pedindo para a outra bilioteca fazer os desenhos a cada forma que vc desenhar, ele é nativo da biblioteca do box2d vc consegue achar melhores tutoriais dele em inglês pesquisando por drawDebugData ou debugDraw + box2d…
    enfim, eu só preparei uns métodosinho baba pra ele rodar..

    public class Main extends Sprite{

    public var stepTimer:Timer;
    private var escala:Number = 32;
    public var mundo:b2World;
    public var artistForHire:b2DebugDraw;

    public function Main ()
    {

    //classezinha que criei pra criar as parada mto loka
    //var cria:Cria = new Cria();
    //mundo = cria.NovoMundo(0,10,escala);
    //cria.Plataforma(8.5, 7.5, 4.5, 0.5, mundo);
    //cria.Plataforma(4.5, 3.5, 2.5, 0.5, mundo);

    Teste(true);

    }
    //cria todos os desenhos do ‘mundo’ criado para testar as parada
    private function DebugDraw():void
    {
    var spriteToDrawOn:Sprite = new Sprite();
    addChild(spriteToDrawOn);

    artistForHire.SetSprite(spriteToDrawOn);
    //artistForHire.SetDrawScale(escala);
    artistForHire.SetFlags(b2DebugDraw.e_shapeBit);
    artistForHire.SetFillAlpha(1);
    artistForHire.SetLineThickness(2);
    artistForHire.SetAlpha(0.6);
    mundo.SetDebugDraw(artistForHire);
    }

    public function Teste(teste:Boolean):void
    {
    stepTimer = new Timer(0.025 * 1000);
    if (teste)
    {
    artistForHire = new b2DebugDraw();
    DebugDraw();
    stepTimer.addEventListener(TimerEvent.TIMER, testaJogo);

    }else
    {
    stepTimer.addEventListener(TimerEvent.TIMER, rodaJogo);

    }
    stepTimer.start();

    }

    //world.step(0.025 = tempo estimado para fazer o cálculo, 10 e 10 = precisão da equação)
    //se tiver tendo muito lag no jogo, será necessário abaixar os valores 10 e 10

    //só calcula
    private function rodaJogo(a_event:TimerEvent):void
    {
    mundo.Step(0.025, 10, 10);
    //mundo.ClearForces(); // eu n sei pra que serve direito isso
    }
    //desenha formas geométricas e calcula
    private function testaJogo(a_event:TimerEvent):void
    {
    mundo.Step(0.025, 10, 10);
    mundo.DrawDebugData();
    //mundo.ClearForces();
    }

    }

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Time limit is exhausted. Please reload the CAPTCHA.