博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Box2dの自定义多边形
阅读量:7286 次
发布时间:2019-06-30

本文共 10054 字,大约阅读时间需要 33 分钟。

注:点击鼠标添加Body,R键清空Body

  原来博客园要注册才能看到swf的,附有截图

package {
import Box2D.Collision.b2AABB; import Box2D.Collision.Shapes.b2CircleDef; import Box2D.Collision.Shapes.b2PolygonDef; import Box2D.Common.Math.b2Math; import Box2D.Common.Math.b2Vec2; import Box2D.Common.Math.b2XForm; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.b2BodyDef; import Box2D.Dynamics.b2DebugDraw; import Box2D.Dynamics.b2World; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.geom.Point; import flash.ui.Keyboard; import ipk.bmpd.CutCtrl; /** * ... * @description HelloWorldの多边形 * @author ispooky * @date 2010.11.09 * * @see http://ispooky.cnblogs.com */ public class PolygonsApp extends Sprite {
public static const ITERATIONS :int = 30; public static const TIME_STEP :Number = 1 / 30; public static const RATIO :int = 30; private static var world :b2World; private static var spriteToDrawOn :Sprite; public function PolygonsApp() {
if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init); initB2D(); stage.addEventListener(MouseEvent.CLICK, onClickHandler); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler); } private function onKeyDownHandler(e:KeyboardEvent):void {
if (e.keyCode == 82/*R*/) {
///// // 销毁Body ///// for (var bb:b2Body = world.m_bodyList; bb; bb = bb.m_next) {
if (bb.m_userData is Sprite) {
removeChild(bb.m_userData); world.DestroyBody(bb); } } } } private function onClickHandler(e:MouseEvent):void {
if (world == null) return; createPolygon(); } private function initB2D():void {
addEventListener(Event.ENTER_FRAME, onLoopHandler, false, 0, true); createWorld(); //showDebug(); createGrounds(); createPolygon(); createPolygon(); createPolygon(); } /** * 添加Body * @param _type */ private function createPolygon(_type:int = -1):void {
var bodyDef:b2BodyDef = new b2BodyDef(); var boxDef:b2PolygonDef = new b2PolygonDef(); var circleDef:b2CircleDef = new b2CircleDef(); var body:b2Body; var type:int if (_type == -1) {
var tmp_arr:Array = [0, 3, 4, 6, 8]; type = tmp_arr[int(Math.random() * 5)]; }else {
type = _type; } var skin:Sprite = new Sprite(); var tmp_asset:Bitmap; var radius:int; var i:int; var tmp_radius:int = Math.random() * 40 + 30; var start_pos:Point = new Point(Math.random() * 100 - 50 + 275, Math.random() * 100 - 50 -100); switch(type) {
case 0: bodyDef.position.Set(start_pos.x / RATIO, start_pos.y / RATIO); radius = int(Math.random() * 25) + 10; circleDef.radius = radius / RATIO; circleDef.density = 1; circleDef.friction = 0.2; circleDef.restitution = 0.3; tmp_asset = getAssets(0, radius); tmp_asset.x = -tmp_asset.width * 0.5; tmp_asset.y = -tmp_asset.height * 0.5; skin.addChild(tmp_asset); bodyDef.userData = skin; addChild(bodyDef.userData); body = world.CreateBody(bodyDef); body.CreateShape(circleDef); body.SetMassFromShapes(); break; case 3: createPolygonTypeOf(start_pos.x, start_pos.y, 3, tmp_radius); break; case 4: createPolygonTypeOf(start_pos.x, start_pos.y, 4, tmp_radius); break; case 5: createPolygonTypeOf(start_pos.x, start_pos.y, 5, tmp_radius); break; case 6: createPolygonTypeOf(start_pos.x, start_pos.y, 6, tmp_radius); break; case 7: createPolygonTypeOf(start_pos.x, start_pos.y, 7, tmp_radius); break; case 8: createPolygonTypeOf(start_pos.x, start_pos.y, 8, tmp_radius); break; } } /** * 创建正多边形Body * @param xpos * @param ypos * @param vertexCount * @param radius */ private function createPolygonTypeOf(xpos:Number, ypos:Number, vertexCount:int, radius:Number):void {
var boxDef:b2PolygonDef = new b2PolygonDef(); boxDef.vertexCount = vertexCount; var angle:Number = Math.PI * 2 / vertexCount; var radius:Number = radius / RATIO; for (var i:int = 0; i < vertexCount; i++) {
var dx:Number = radius * Math.cos(angle * i); var dy:Number = radius * Math.sin(angle * i); boxDef.vertices[i] = b2Math.b2MulX(new b2XForm(),new b2Vec2(dx, dy)); } boxDef.density = 2; boxDef.friction = 0.3; boxDef.restitution = 0.3; var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.angle = Math.random() * 360; bodyDef.position.Set(xpos / RATIO, ypos / RATIO); var skin:Sprite = new Sprite(); var tmp_asset:Bitmap; switch(vertexCount) {
case 3: tmp_asset = getAssets(vertexCount, radius * RATIO); tmp_asset.x = -(tmp_asset.width - radius * RATIO); tmp_asset.y = -tmp_asset.height * 0.5; skin.addChild(tmp_asset); break; case 4: tmp_asset = getAssets(vertexCount, radius * RATIO); tmp_asset.x = -tmp_asset.width*0.5; tmp_asset.y = -tmp_asset.height * 0.5; skin.addChild(tmp_asset); break; case 6: tmp_asset = getAssets(vertexCount, radius * RATIO); tmp_asset.x = -tmp_asset.width*0.5; tmp_asset.y = -tmp_asset.height * 0.5; skin.addChild(tmp_asset); break; case 8: tmp_asset = getAssets(vertexCount, radius * RATIO); tmp_asset.x = -tmp_asset.width*0.5; tmp_asset.y = -tmp_asset.height * 0.5; skin.addChild(tmp_asset); break; } bodyDef.userData = skin; addChild(bodyDef.userData); var body:b2Body = world.CreateBody(bodyDef); body.CreateShape(boxDef); body.SetMassFromShapes(); } /** * 创建地板 */ private function createGrounds():void {
var bodyDef:b2BodyDef = new b2BodyDef(); var boxDef:b2PolygonDef = new b2PolygonDef(); var body:b2Body; bodyDef.position.Set(275 / RATIO, 360 / RATIO); boxDef.SetAsBox(900 / 2 / RATIO, 30 / 2 / RATIO); boxDef.density = 0; boxDef.friction = 0.3; boxDef.restitution = 0.2; body = world.CreateBody(bodyDef); body.CreateShape(boxDef); boxDef.SetAsOrientedBox(30 / 2 / RATIO, 90 / 2 / RATIO, new b2Vec2( -200 / RATIO, -60 / RATIO), 0); body = world.CreateBody(bodyDef); body.CreateShape(boxDef); boxDef.SetAsOrientedBox(30 / 2 / RATIO, 90 / 2 / RATIO, new b2Vec2( 200 / RATIO, -60 / RATIO), 0); body = world.CreateBody(bodyDef); body.CreateShape(boxDef); boxDef.SetAsOrientedBox(30 / 2 / RATIO, 45 / 2 / RATIO, new b2Vec2( -435 / RATIO, -37.5 / RATIO), 0); body = world.CreateBody(bodyDef); body.CreateShape(boxDef); boxDef.SetAsOrientedBox(30 / 2 / RATIO, 45 / 2 / RATIO, new b2Vec2( 435 / RATIO, -37.5 / RATIO), 0); body = world.CreateBody(bodyDef); body.CreateShape(boxDef); } /** * 显示Debug图 */ private function showDebug():void {
spriteToDrawOn = new Sprite(); addChild(spriteToDrawOn); var dbgDraw:b2DebugDraw = new b2DebugDraw(); dbgDraw.m_sprite = spriteToDrawOn; dbgDraw.m_drawScale = RATIO; dbgDraw.m_fillAlpha = 0.6; dbgDraw.m_lineThickness = 1.0; dbgDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit; world.SetDebugDraw(dbgDraw); } /** * 创建物理空间 */ private function createWorld():void {
var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set( -3000 / RATIO, -3000 / RATIO); worldAABB.upperBound.Set(3000 / RATIO, 3000 / RATIO); var gravity:b2Vec2 = new b2Vec2(0, 10); var doSleep:Boolean = true; world = new b2World(worldAABB, gravity, doSleep); } /** * 刷新物理空间 * @param e */ private function onLoopHandler(e:Event):void {
if (world == null) return; world.Step(TIME_STEP, ITERATIONS); for (var bb:b2Body = world.m_bodyList; bb; bb = bb.m_next) {
if (bb.m_userData is Sprite) {
bb.m_userData.x = bb.GetPosition().x * RATIO; bb.m_userData.y = bb.GetPosition().y * RATIO; bb.m_userData.rotation = bb.GetAngle() * (180 / Math.PI); } } } /** * 获取贴图 * @param type * @param radius * @return */ private function getAssets(type:int = 0, radius:int = 20):Bitmap {
var target_mc:Sprite = new Sprite(); target_mc.visible = false; addChild(target_mc); var tmp_bmpd:BitmapData = new Alsace_Pic(); var tmp_bmp:Bitmap = new Bitmap(tmp_bmpd); target_mc.addChild(tmp_bmp); var tmp_mc:Sprite = new Sprite(); tmp_mc.visible = false; tmp_mc.x = target_mc.x; tmp_mc.y = target_mc.y; addChild(tmp_mc); var new_bmp:Bitmap; var i:int; var pos:Point = new Point(Math.random() * 600 - 300 + 720, Math.random() * 200 - 100 + 450); tmp_mc.graphics.clear(); tmp_mc.graphics.beginFill(0x900000); switch(type) {
case 0: tmp_mc.graphics.drawCircle(pos.x, pos.y, radius); tmp_mc.graphics.endFill(); new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; case 3: tmp_mc.graphics.moveTo(pos.x + radius, pos.y); for (i = 1; i < 3; i++) {
tmp_mc.graphics.lineTo(pos.x + radius * Math.cos(Math.PI * 2 / 3 * i), pos.y + radius * Math.sin(Math.PI * 2 / 3 * i)); } new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; case 4: tmp_mc.graphics.moveTo(pos.x + radius, pos.y); for (i = 1; i < 4; i++) {
tmp_mc.graphics.lineTo(pos.x + radius * Math.cos(Math.PI * 2 / 4 * i), pos.y + radius * Math.sin(Math.PI * 2 / 4 * i)); } new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; case 5: tmp_mc.graphics.moveTo(pos.x + radius, pos.y); for (i = 1; i < 5; i++) {
tmp_mc.graphics.lineTo(pos.x + radius * Math.cos(Math.PI * 2 / 5 * i), pos.y + radius * Math.sin(Math.PI * 2 / 5 * i)); } new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; case 6: tmp_mc.graphics.moveTo(pos.x + radius, pos.y); for (i = 1; i < 6; i++) {
tmp_mc.graphics.lineTo(pos.x + radius * Math.cos(Math.PI * 2 / 6 * i), pos.y + radius * Math.sin(Math.PI * 2 / 6 * i)); } new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; case 7: tmp_mc.graphics.moveTo(pos.x + radius, pos.y); for (i = 1; i < 7; i++) {
tmp_mc.graphics.lineTo(pos.x + radius * Math.cos(Math.PI * 2 / 7 * i), pos.y + radius * Math.sin(Math.PI * 2 / 7 * i)); } new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; case 8: tmp_mc.graphics.moveTo(pos.x + radius, pos.y); for (i = 1; i < 8; i++) {
tmp_mc.graphics.lineTo(pos.x + radius * Math.cos(Math.PI * 2 / 8 * i), pos.y + radius * Math.sin(Math.PI * 2 / 8 * i)); } new_bmp = new Bitmap(CutCtrl.cutOutSuper(target_mc, tmp_mc).clone()); break; } tmp_bmpd.dispose(); removeChild(tmp_mc); tmp_mc = null; removeChild(target_mc); target_mc = null; return new_bmp; } } }

转载于:https://www.cnblogs.com/pengyingh/articles/2395647.html

你可能感兴趣的文章
ps详解
查看>>
SpringMVC用responsebody标签返回json的时候Error406
查看>>
Python开发SVN批量提交命令脚本
查看>>
关于IE的bug(CSS)
查看>>
Linux NFS服务器详解
查看>>
Tomcat invalid LOC header (bad signature)
查看>>
永久关闭selinux
查看>>
修改nginx服务的默认用户
查看>>
linux下查找字符串的命令
查看>>
Squid代理服务器的ACL访问控制和日志分析
查看>>
创业很辛苦,需要足够坚持面对
查看>>
uboot移植(一):移植前的准备工作
查看>>
PaaS平台型IT运维&运营模式能给企业带来什么?
查看>>
全球市值Top20的加密货币技术对比
查看>>
python 操作 K8S
查看>>
「docker实战篇」python的docker-抖音appium模拟滑动操作(22)
查看>>
C语言中什么是原型定义
查看>>
Mail服务器架设
查看>>
C++中关于指针作为参数传递的问题
查看>>
大清单报表应当怎么做?
查看>>