【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 TKCB 于 2018-2-6 14:47 编辑
转载:9RIA游戏开发者社区(天地会)
作者:ladeng6666(拉登大叔)
作者博客:http://www.ladeng6666.com/blog/
【Box2D系列教程-导航帖】—拉登大叔出品(总贴)
在运行时创建多边形刚体教程中,我们学会了创建多边形刚体,又在[Box2D]多边形刚体贴图中学习了如何为多边形刚体贴图,不过多边形刚体创建和贴图的过程还是稍有复杂,所以我把它集成到了LDEasyBox2D.createPolygon()方法中。
下面我们来看一下LDEasyBox2D.createPolygon()的用法
[Actionscript3] 纯文本查看 复制代码 /**
* 根据一组顶点数据,创建多边形刚体,可以是顺时针绘制,也可以逆时针绘制,但不能出现交叉
* @param world Box2D世界
* @param vertices 顶点数组,顶点之间不能有交叉
* @param isStatic 是否为静止的刚体
* @param fillData 刚体的填充纹理,一个BItmapData对象,请确保整个BitmapData的尺寸大于舞台的尺寸
* @param stage 添加userData的舞台
* @return 返回一个多边形刚体
*/
public static function createPolygon(
world:b2World,
vertices:Vector.<b2Vec2>,
isStatic:Boolean = false,
fillData:BitmapData = null,
stage:DisplayObjectContainer = null
):b2Body
我用LDEasyBox2D创建了[Box2D]多边形刚体贴图中的实例,效果是一样的,但是代码精简了很多。
完整代码和注释:
[Actionscript3] 纯文本查看 复制代码 package
{
import Box2D.Common.Math.b2Vec2;
import Box2D.Dynamics.b2World;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
/**
* [url=http://www.ladeng6666.com]http://www.ladeng6666.com[/url]
* @author ladeng6666
*/
public class MainWithSeparatoEasy extends Sprite
{
private const segmentLength:Number = 20;
private var world:b2World;
//绘制图形的画布
private var spriteCanvas:Sprite;
//绘制图像的纹理
private var woodBmd:BitmapData = new Wood();
private var prePoint:Point = new Point();
private var curPoint:Point = new Point();
private var verticesList:Vector.<b2Vec2> = new Vector.<b2Vec2>();
private var isDrawing:Boolean = false;
public function MainWithSeparatoEasy()
{
//创建box2D世界
world = LDEasyBox2D.createWorld();
//创建box2D调试图
addChild(LDEasyBox2D.createDebug(world));
//创建地面
LDEasyBox2D.createWrapWall(world,stage);
spriteCanvas = new Sprite();
addChild(spriteCanvas);
//侦听事件
addEventListener(Event.ENTER_FRAME, loop);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onStageMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUp);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove);
}
private function onStageMouseMove(e:MouseEvent):void
{
//如果鼠标没有按下,isDrawing为false,跳出
if(!isDrawing) return;
spriteCanvas.graphics.lineTo(mouseX, mouseY);
//记录鼠标坐标为当前curPoint,并计算curPoint与上一个点prePoint的距离
curPoint = new Point(mouseX, mouseY);
var distance:Number = Point.distance(prePoint, curPoint);
//当前后两个点的距离大于线段距离时,添加顶点
if (distance >= segmentLength) {
//记录顶点到verticesList数组中
verticesList.push(new b2Vec2(mouseX / 30, mouseY / 30));
prePoint = curPoint.clone();
}
}
private function onStageMouseUp(e:MouseEvent):void
{
//鼠标弹起后,停止绘制
isDrawing = false;
//画布里的内容
spriteCanvas.graphics.clear();
//在鼠标位置随机创建一个多边形刚体
//之前的createPolygon和createUseData被集成到了LDEasyBox2D.createPolygon
LDEasyBox2D.createPolygon(world, verticesList, false,woodBmd,stage);
//清空存储顶点的Vector数组
verticesList = new Vector.<b2Vec2>();
}
/**
* 鼠标按下事件侦听
* @param e
*/
private function onStageMouseDown(e:MouseEvent):void
{
//鼠标按下后,开始绘制
isDrawing = true;
//设置线条样式
spriteCanvas.graphics.lineStyle(2);
spriteCanvas.graphics.moveTo(mouseX, mouseY);
//定义鼠标点为起点
curPoint = new Point(mouseX, mouseY);
prePoint = curPoint.clone();
verticesList.push(new b2Vec2(mouseX / 30, mouseY / 30));
}
/**
* 刷新屏幕
* @param e
*/
private function loop(e:Event):void
{
LDEasyBox2D.updateWorld(world);
}
}
}
|