这里给出一个小例子,方便大家看到是否设置睡眠的区别。右上角的5个按钮代表重力方向,他们都是用向量模拟的,中间的按钮“无”代表失重状态。关于睡眠设置,默认是禁止睡眠,点击右侧按钮可以切换状态。通过观察你可以发现,当所有小球停止运动的时候,如果是禁止睡眠,当你改变重力方向的时候它们仍然可以运动,如果是允许睡眠的话,你会发现他们确实睡的跟死猪一样,一动不动。
需要看源码的朋友,请在下方留言,留下你的邮箱地址,我会尽快回复你的。
最近研究Box2D引擎,做了一个Demo,这个引擎结构还是比较复杂的,不过入门之后学起来就没一开始那么费力了。

需要看源码的朋友,请在下方留言,留下你的邮箱地址,我会尽快回复你的。
弄了一个天气预报的小程序,由于安全沙箱的原因,请下载到本地打开使用。
weather.swf
最近一直在研究A*算法,看了很多人写的一些相关代码,但是总觉得代码的结构很混乱。不过这里我要感谢一下sunbright,因为他的代码是我目前在A*开源里面见过的结构最清晰的,我在研究的过程中根据需要又做了部分改动,目的是为了结合自己现有的一些架构来做项目。

源文件:AStar.rar

mp3 beta2.0功能:
1、播放、暂停、停止;
2、通过双进度条显示歌曲加载进度和播放进度;
3、重复A—>B功能,当歌曲加载完毕之后,会显示歌曲的声波振幅,指针会跟随声音播放进度而指向声波振幅不同位置,你也可以拖动指针从而形成一个矩形选区,声音会在这个选区之内重复播放。你可以单击振幅任意位置或者拖动进度条来取消选择。
新增:
4、波形效果;
5、播放列表;
6、歌词同步播放,可以通过改变播放进度来改变歌词显示,也可以把歌词拖拽到你想要的位置进行播放。
修正:去掉了beta1.0的频谱效果,主要因为和变速功能有冲突。
未解决的问题:歌曲变速之后不能与播放进度和歌词同步。
目前最让我头疼的就是这个歌曲变速的问题,如果在初始化的时候已经是变速状态,则播放进度显示是一致的,如果播放过程中再次变速,则同步会出现问题。对于歌词来说,只要变速之后就不能同步,这个问题揣摩了两天,尚未找到好的解决方法,而且我发现加了变速功能之后,内存消耗的比较多,我在考虑下一版本是不是要把这个变速功能去掉。
源代码:Player.rar
最近利用as3新做了一个mp3播放器,如果你得浏览器没有安装flashplayer10,是无法正常使用的。
mp3 beta1.0功能:
1、播放、暂停、停止;
2、通过双进度条显示歌曲加载进度和播放进度;
3、重复A—>B功能,当歌曲加载完毕之后,会显示歌曲的声波振幅,指针会跟随声音播放进度而指向声波振幅不同位置,你也可以拖动指针从而形成一个矩形选区,声音会在这个选区之内重复播放。你可以单击振幅任意位置或者拖动进度条来取消选择。

可以模拟平滑和压力效果,希望大家多多提出宝贵意见,这个东东目前可以做绘图板的一个工具来使用,过段时间我准备做一些加强型功能,让它能够做一些更酷更炫的效果出来。
最近研究了一下贝塞尔曲线,刚开始弄的时候摸不着头脑,网上相关文章的文章也是少得可怜,而且有的效果要么很简单、要么是半成品,于是自己闷头搞了几天,总算小有收获。
其实现在想一想,也不是非常的难。先从点1到点2绘制曲线、再从点2到点3绘制曲线以此类推,乍一看没什么问题,但是你会发现,每条线段之间的衔接点是尖锐的而不是平滑的,所以有一种做法可以解决这个问题,那就是将一条曲线看做两条曲线连接而成。仔细想一下,我们在绘制一条曲线的时候,应该由三个点组成:起点、拐点、终点。那么当画一组连续曲线的时候,我们很自然能够想到先从点1开始、穿过点2、绘制到点3结束、再穿过点4绘制到点5等等以此类推。举个例子,用过ps的人应该不会不知道钢笔工具吧,当我们直接用鼠标点击不同位置的时候,显示的是若干条直线而不是曲线,因为这个是曲线的一种特殊情况,它的拐点和起点、终点处于同一直线上,如果我们用鼠标点击之后,再进行拖拽的话,那么就会在起点或终点处产生左右两个控制点,这样画出来的线就是曲线了。那么顺着这个思路,曲线应该怎么描述呢?首先我们应该加入一个“拐点”,把曲线看成从起点到拐点、拐点到终点这么两条曲线组成。我们不妨设起点为a,a处的右控制点为b,终点为d,终点的左控制点为c,拐点为e。看下面的演示:
当直线的时候,点e位于a、b两点的1/2处,当曲线的时候,点e可以看做位于b、c两点的1/2处。
- package
- {
- import flash.geom.Point;
-
- public class B_point
- {
- public var c_point:Point;
- public var l_point:Point;
- public var r_point:Point;
-
- public function B_point(x, y)
- {
- init(x, y);
- }
-
- private function init(x, y):void
- {
- var point = new Point(x, y);
- c_point = point.clone();
- l_point = point.clone();
- r_point = point.clone();
- }
-
- public function toString(){
- return ("c_point:" + c_point.toString() + "l_point:" + l_point.toString() + "r_point:" + r_point.toString());
- }
- }
- }
- package {
- import flash.display.Sprite;
- import flash.display.MovieClip;
- import flash.events.MouseEvent;
- import flash.net.navigateToURL;
- import flash.net.URLRequest;
- import flash.geom.Point;
-
- public class Bessel extends Sprite {
- private var arr:Array = new Array();
- private var drawShape:Boolean = false;
- private var change:Boolean = false;
- private var shape:Sprite;
- private var colorL:Number = 0xffff00;
- private var colorR:Number = 0xff0000;
- public function Bessel() {
- init();
- }
-
- private function init():void {
- shape = new Sprite();
- shape.mouseEnabled = false;
- addChild(shape);
- bg.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
- bg.addEventListener(MouseEvent.MOUSE_UP,onUp);
- bg.doubleClickEnabled = true;
- bg.addEventListener(MouseEvent.DOUBLE_CLICK,onDoubleClick);
- btn.buttonMode = true;
- btn.addEventListener(MouseEvent.MOUSE_DOWN,onChange);
- }
-
- private function onChange(e:MouseEvent):void {
- change = !change;
- if (change){
- e.target.nextFrame();
- }else{
- e.target.prevFrame();
- }
- }
-
- private function onDown(e:MouseEvent):void {
- drawShape = true;
- stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
- arr.push(new B_point(mouseX,mouseY));
- }
-
- private function onUp(e:MouseEvent):void {
- stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
- drawShape = false;
- addBesselCurve(this, arr, 2, colorL, 100);
- }
-
- private function onMove(e:MouseEvent):void {
- if (drawShape) {
- var newPoint:Point = new Point(mouseX,mouseY);
- var oldPoint:B_point = arr[arr.length - 1];
- oldPoint.r_point = newPoint;
- oldPoint.l_point = Point.interpolate(oldPoint.c_point,oldPoint.r_point,2);
- drawBesselPoint(shape, arr, 0, 0x33FF00, 60);
- } else if (arr.length>0) {
- newPoint = new Point(mouseX, mouseY);
- oldPoint = arr[arr.length - 1];
- shape.graphics.clear();
- drawBesselCurve(shape, newPoint, newPoint, oldPoint.r_point, oldPoint.c_point, 0, 0x33FF00, 80);
- }
- e.updateAfterEvent();
- }
-
- private function onDoubleClick(e:MouseEvent):void {
- arr.push(arr[0]);
- shape.graphics.clear();
- if (change == true){
- addBesselCurve(this, arr, 2, colorL, 100);
- }
- arr = new Array();
- }
-
- private function drawBesselPoint(_mc:Sprite,bpArr:Array,lineWidth:Number,lineColor:Number,lineAlpha:Number):void {
- _mc.graphics.clear();
- addBesselCurve(_mc, bpArr, lineWidth, lineColor, lineAlpha);
- if (bpArr.length>1) {
- var b1:B_point = bpArr[bpArr.length-2];
- drawBesselCtrlPoint(_mc, b1, 1, lineColor, lineAlpha);
- }
- var b2:B_point = bpArr[bpArr.length-1];
- drawBesselCtrlPoint(_mc, b2, 1, lineColor, lineAlpha);
- }
-
- private function drawBesselCtrlPoint(_mc:Sprite, b_p:B_point, lineWidth:Number, lineColor:Number, lineAlpha:Number) {
-
- _mc.graphics.lineStyle(lineWidth, lineColor, lineAlpha/2);
- _mc.graphics.moveTo(b_p.c_point.x, b_p.c_point.y);
- _mc.graphics.lineTo(b_p.r_point.x, b_p.r_point.y);
- _mc.graphics.lineStyle(lineWidth*3, lineColor, lineAlpha);
- _mc.graphics.lineTo(b_p.r_point.x, b_p.r_point.y+.5);
-
- _mc.graphics.lineStyle(lineWidth, lineColor, lineAlpha/2);
- _mc.graphics.moveTo(b_p.c_point.x, b_p.c_point.y);
- _mc.graphics.lineTo(b_p.l_point.x, b_p.l_point.y);
- _mc.graphics.lineStyle(lineWidth*3, lineColor, lineAlpha);
- _mc.graphics.lineTo(b_p.l_point.x, b_p.l_point.y+.5);
- }
-
- private function addBesselCurve(_mc:Sprite,bpArr:Array,lineWidth:Number,lineColor:Number,lineAlpha:Number):void {
- if (bpArr.length>1) {
- var b1:B_point = bpArr[bpArr.length-2];
- var b2:B_point = bpArr[bpArr.length-1];
- drawBesselCurve(_mc, b1.c_point, b1.r_point, b2.l_point, b2.c_point, lineWidth, lineColor, lineAlpha);
- }
- }
-
- private function drawBesselCurve(_mc:Sprite, a:Point, b:Point, c:Point, d:Point, lineWidth:Number,lineColor:Number,lineAlpha:Number) {
- var b_len:Number = b.subtract(a).length;
- var c_len:Number = c.subtract(d).length;
- if (b_len == 0 && c_len == 0) {
- var e:Point = Point.interpolate(a, d, .5);
- } else {
- e = Point.interpolate(c, b, .5);
- }
- _mc.graphics.lineStyle(lineWidth, lineColor, lineAlpha);
- _mc.graphics.moveTo(a.x, a.y);
- _mc.graphics.curveTo(b.x, b.y, e.x, e.y);
- _mc.graphics.lineStyle(lineWidth, colorR, lineAlpha);
- _mc.graphics.curveTo(c.x, c.y, d.x, d.y);
- }
-
- }
- }
最终效果如下:
但是这个算法还有个不完善的地方,画过的线段就不能再调整了,但是我们在使用ps的时候都知道,即使是画过的曲线,控制点仍然可以任意调整,并且同时控制着左右两边曲线的弧度。如果哪位研究此类算法,还望与我一起深入探讨一下。
惨不忍睹的源文件:bessel_test.rar
最近在研究as3的相关功能,顺便弄了一个简易的照片浏览器,以后准备弄一个功能强大的,不像这样小打小闹了,嘿嘿!