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{}