当前位置: 首页 > 工具软件 > CrossBridge > 使用案例 >

Physics Engine Box2D(CrossBridge(FlasCC) Version) Demo

路裕
2023-12-01

1 修改命令行:

FLASCC:=/cygdrive/C/Crossbridge_1.0.1/sdk
FLEX:=/cygdrive/C/Program Files (x86)/Adobe/Adobe Flash Builder 4.6/sdks/4.6.0

2 MakeFile得到Box2D.swc库文件:

$?EXTRACFLAGS=
$?OPT_CFLAGS=-O4
$?MXMLC_DEBUG=false

T12: check
	@echo "------- Example: Box2D --------"

	mkdir -p build
	cd build && PATH="$(call unixpath,$(FLASCC)/usr/bin):$(PATH)" CC=gcc CXX=g++ CFLAGS="$(OPT_CFLAGS) $(BASE_CFLAGS) $(EXTRACFLAGS)" CXXFLAGS="$(OPT_CFLAGS) $(BASE_CFLAGS) $(EXTRACFLAGS)" cmake ../Box2D_v2.2.1/

	make recompile

recompile:
	cd build && PATH="$(call unixpath,$(FLASCC)/usr/bin):$(PATH)" make -j8

	cp -f as3api.h build/
	cd build && "$(FLASCC)/usr/bin/swig" -as3 -c++ -I../Box2D_v2.2.1/ -DSWIGPP -module Box2D -outdir . -includeall -ignoremissing as3api.h
	cd build && java -jar $(call nativepath,$(FLASCC)/usr/lib/$(AS3COMPILER)) -import $(call nativepath,$(FLASCC)/usr/lib/builtin.abc) -import $(call nativepath,$(FLASCC)/usr/lib/playerglobal.abc) Box2D.as
	cd build && "$(FLASCC)/usr/bin/g++" $(BASE_CFLAGS) $(OPT_CFLAGS) -I../Box2D_v2.2.1/ Box2D.abc as3api_wrap.cxx Box2D/libBox2D.a -emit-swc=sample.Box2D -o ../Box2D.swc $(EXTRACFLAGS)

	make swfs

swfs:
	"$(FLEX)/bin/mxmlc" -static-link-runtime-shared-libraries -library-path=Box2D.swc -debug=$(MXMLC_DEBUG) HelloWorld.as -o HelloWorld.swf
	"$(FLEX)/bin/mxmlc" -static-link-runtime-shared-libraries -library-path=Box2D.swc -debug=$(MXMLC_DEBUG) Boxes.as -o Boxes.swf

T12Debug:
	make T12 OPT_CFLAGS="-O0 -g" MXMLC_DEBUG=true

include ../Makefile.common

clean:
	rm -rf build *.swf *.swc 

在32bit系统下编译会出错,需要修改命令行,在g++后面添加命令行参数-jvmopt=-Xmx1G,eg:

"$(FLASCC)/usr/bin/g++" -jvmopt=-Xmx1G $(BASE_CFLAGS) -O4 ...

3 Box2D的一个AS封装类:

// Copyright (c) 2013 Adobe Systems Inc

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

package
{
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.geom.Matrix;

  public class Box2DSprite extends Sprite
  {
    private var bodyDef:b2BodyDef
    private var bodyDefPos:b2Vec2
    private var body:b2Body
    private var dynamicBox:b2PolygonShape
    private var fixtureDef:b2FixtureDef
    private var w:Number, h:Number;

    public function Box2DSprite(_x:Number, _y:Number, _w:Number, _h:Number, world:b2World)
    {
      w = _w;
      h = _h;

      graphics.lineStyle(0.25,0x000000);
      graphics.beginFill(0, 0.2);
      graphics.drawRect(0, 0, _w, _h);
      graphics.endFill();

      // Define the dynamic body. We set its position and call the body factory.
      bodyDef = b2BodyDef.create();
      bodyDef.type = Box2D.b2_dynamicBody;
      bodyDefPos = b2Vec2.create()
      bodyDefPos.Set(_x/10, _y/10);
      bodyDef.position = bodyDefPos.swigCPtr;
      body = new b2Body();
      body.swigCPtr = world.CreateBody(bodyDef.swigCPtr);

      // Define another box shape for our dynamic body.
      dynamicBox = b2PolygonShape.create();
      dynamicBox.SetAsBox(_w/20, _h/20);

      // Define the dynamic body fixture.
      fixtureDef = b2FixtureDef.create();
      fixtureDef.shape = dynamicBox.swigCPtr;

      // Set the box density to be non-zero, so it will be dynamic.
      fixtureDef.density = 1.0;

      // Override the default friction.
      fixtureDef.friction = 0.3;

      // Add the shape to the body.
      body.CreateFixture(fixtureDef.swigCPtr);
    }

    public function update():void
    {
      bodyDefPos.swigCPtr = body.GetPosition();
      var matrix:Matrix = new Matrix() 
      matrix.translate(- w/2, - (h/2));
      matrix.rotate(-body.GetAngle());
      matrix.translate((bodyDefPos.x*10) + w/2, (stage.stageHeight + (h/2)) - (bodyDefPos.y*10));
      transform.matrix = matrix;
    }
  }
}

4 主程序:

// Copyright (c) 2013 Adobe Systems Inc

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

package
{
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.DisplayObjectContainer;
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.display.StageScaleMode;
  import flash.events.Event;
  import flash.net.LocalConnection;
  import flash.net.URLRequest;
  import flash.text.TextField;
  import flash.utils.ByteArray;

  import sample.Box2D.CModule;
  import sample.Box2D.vfs.ISpecialFile;
  import Box2DSprite;

  /**
  * A basic implementation of a console for flascc apps.
  * The PlayerKernel class delegates to this for things like read/write
  * so that console output can be displayed in a TextField on the Stage.
  */
  public class Boxes extends Sprite implements ISpecialFile
  {
    private var enableConsole:Boolean = false
    private var _tf:TextField
    private var inputContainer:DisplayObjectContainer

    private var gravity:b2Vec2
    private var world:b2World
    private var groundBodyDef:b2BodyDef
    private var groundBodyDefPos:b2Vec2
    private var groundBody:b2Body
    private var groundBox:b2PolygonShape
    private var boxes:Vector.<Box2DSprite> = new Vector.<Box2DSprite>()

    include "../TestingCode.as"

    public function Boxes(container:DisplayObjectContainer = null)
    {
      CModule.rootSprite = container ? container.root : this
      if(container) {
        container.addChild(this)
        init(null)
      } else {
        addEventListener(Event.ADDED_TO_STAGE, init)
      }
    }

    /**
    * All of the real flascc init happens in this method
    * which is either run on startup or once the SWF has
    * been added to the stage.
    */
    private function init(e:Event):void
    {
      inputContainer = new Sprite()
      addChild(inputContainer)

      addEventListener(Event.ENTER_FRAME, enterFrame)

      stage.frameRate = 60
      stage.scaleMode = StageScaleMode.NO_SCALE

      if(enableConsole) {
        _tf = new TextField
        _tf.multiline = true
        _tf.width = stage.stageWidth
        _tf.height = stage.stageHeight 
        inputContainer.addChild(_tf)
      }

      CModule.startAsync(this)

      // Define the gravity vector.
      gravity = b2Vec2.create()
      gravity.Set(0.0, -10.0);

      // Construct a world object, which will hold and simulate the rigid bodies.
      world = b2World.create(gravity.swigCPtr)

      // Define the ground body.
      groundBodyDef = b2BodyDef.create();
      groundBodyDefPos = b2Vec2.create()
      groundBodyDefPos.Set(0.0, -5.0);
      groundBodyDef.position = groundBodyDefPos.swigCPtr;

      // Call the body factory which allocates memory for the ground body
      // from a pool and creates the ground box shape (also from a pool).
      // The body is also added to the world.
      groundBody = new b2Body();
      groundBody.swigCPtr = world.CreateBody(groundBodyDef.swigCPtr);

      // Define the ground box shape.
      groundBox = b2PolygonShape.create();

      // The extents are the half-widths of the box.
      groundBox.SetAsBox(2000.0, 5.0);

      // Add the ground fixture to the ground body.
      groundBody.CreateFixture2(groundBox.swigCPtr, 0.0);

      for(var i:int=0; i<500; i++) {
        var bs:Box2DSprite = new Box2DSprite(100 + random() * 200, 10 + random() * 3000, 10 + random()*50, 2 + random()*5, world);
        boxes.push(bs);
        addChild(bs);
      }

      initTesting();
    }

    /**
    * The PlayerKernel implementation will use this function to handle
    * C IO write requests to the file "/dev/tty" (e.g. output from
    * printf will pass through this function).
    */
    public function write(fd:int, buf:int, nbyte:int, errnoPtr:int):int
    {
      var str:String = CModule.readString(buf, nbyte)
      consoleWrite(str)
      return nbyte
    }

    /**
    * The PlayerKernel implementation will use this function to handle
    * C IO read requests to the file "/dev/tty" (e.g. reads from stdin
    * will expect this function to provide the data).
    */
    public function read(fd:int, buf:int, nbyte:int, errnoPtr:int):int
    {
      return 0
    }

    /**
    * The PlayerKernel implementation will use this function to handle
    * C fcntl requests to the file "/dev/tty"
    * See the ISpecialFile documentation for more information about the
    * arguments and return value.
    */
    public function fcntl(fd:int, com:int, data:int, errnoPtr:int):int
    {
      return 0
    }

    /**
    * The PlayerKernel implementation will use this function to handle
    * C ioctl requests to the file "/dev/tty"
    * See the ISpecialFile documentation for more information about the
    * arguments and return value.
    */
    public function ioctl(fd:int, com:int, data:int, errnoPtr:int):int
    {
      return 0
    }

    /**
    * Helper function that traces to the flashlog text file and also
    * displays output in the on-screen textfield console.
    */
    private function consoleWrite(s:String):void
    {
      trace(s)
      if(enableConsole) {
        _tf.appendText(s)
        _tf.scrollV = _tf.maxScrollV
      }
    }

    /**
    * Calling serviceUIRequests from the main worker allows us to service any requests
    * from background workers that want to use flash APIs that need main
    * worker privileges. 
    */
    public function enterFrame(e:Event):void
    {
      CModule.serviceUIRequests()
      var timeStep:Number = 1.0 / 60.0;
      var velocityIterations:int = 12;
      var positionIterations:int = 4;
      world.Step(timeStep, velocityIterations, positionIterations);

      for(var i:int=0; i<boxes.length; i++) {
        boxes[i].update()
      }
    }

    // ======================================================
    // The following code is from Grant Skinner's Rndm.as
    // ======================================================

    /**
    * Rndm by Grant Skinner. Jan 15, 2008
    * Visit www.gskinner.com/blog for documentation, updates and more free code.
    *
    * Incorporates implementation of the Park Miller (1988) "minimal standard" linear 
    * congruential pseudo-random number generator by Michael Baczynski, www.polygonal.de.
    * (seed * 16807) % 2147483647
    *
    *
    *
    * Copyright (c) 2008 Grant Skinner
    * 
    * Permission is hereby granted, free of charge, to any person
    * obtaining a copy of this software and associated documentation
    * files (the "Software"), to deal in the Software without
    * restriction, including without limitation the rights to use,
    * copy, modify, merge, publish, distribute, sublicense, and/or sell
    * copies of the Software, and to permit persons to whom the
    * Software is furnished to do so, subject to the following
    * conditions:
    * 
    * The above copyright notice and this permission notice shall be
    * included in all copies or substantial portions of the Software.
    * 
    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    * OTHER DEALINGS IN THE SOFTWARE.
    */

    protected var _currentSeed:uint=1234;

    /**
    * returns a number between 0-1 exclusive.
    */
    public function random():Number {
      return (_currentSeed = (_currentSeed * 16807) % 2147483647)/0x7FFFFFFF+0.000000000233;
    }
  }
}

5 质量测试代码:

// Copyright (c) 2013 Adobe Systems Inc

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

/**
 * This is an empty file for QA to replace when testing.
 **/
public function initTesting():void{}






 类似资料: