文件分割工具 FileSplit

把一个文件等分多块,保存为独立文件。
对于flash web加载,较大的swf可以分割为多个较小的数据文件,并行加载优化加载速度,避免加载失败。
做数据分割后自然的打乱文件存储结构,结合一些二进制数据组织方式,能起到一定的加密作用。

AIR版 文件分割工具 FileSplit

  1. package {
  2.    
  3.     /**
  4.     *假设分割为2个文件的swf,加载流程和组装方法。
  5.     * 关键过程伪代码
  6.     **/
  7.  
  8.     public class ConcateFile 
  9.     {
  10.         public var begin:String = “file1.bin”;
  11.         public var end:String = “file2.bin”;
  12.         public var byteArrayBegin:ByteArray;
  13.         public var byteArrayEnd:ByteArray;   
  14.        
  15.         public var loader:URLLoader;
  16.         public var endLoader:URLLoader;
  17.         public function ConcateFile()
  18.         {
  19.             concate();
  20.         }
  21.         public function concate():void
  22.         {
  23.             loader = new URLLoader();
  24.             var re:URLRequest = new URLRequest(begin);   
  25.             loader.dataFormat = URLLoaderDataFormat.BINARY;
  26.             loader.addEventListener(Event.COMPLETE,listenBegin);
  27.             loader.load(re);
  28.            
  29.             endLoader = new URLLoader();
  30.             endLoader.dataFormat = URLLoaderDataFormat.BINARY;
  31.             var endRe:URLRequest = new URLRequest(end);   
  32.             endLoader.addEventListener(Event.COMPLETE,listenEnd);
  33.             endLoader.load(endRe);     
  34.            
  35.         }
  36.  
  37.                
  38.         public function listenBegin(e:Event):void
  39.         {
  40.             beginOk = true;   
  41.             var bytes:ByteArray = e.target.data;                      
  42.             byteArrayBegin = bytes;
  43.         }
  44.         public function listenEnd(e:Event):void
  45.         {   
  46.             var bytes:ByteArray = e.target.data ;      
  47.             //bytes.position = 0;
  48.             byteArrayBegin.position = byteArrayBegin.bytesAvailable;
  49.             byteArrayBegin.writeBytes(bytes);
  50.             byteArrayBegin.position = 0;
  51.             //var obj:Object = byteArrayBegin.readObject();
  52.             //addChild(obj as MovieClip);
  53.            
  54.             var ld:Loader = new Loader();
  55.             ld.contentLoaderInfo.addEventListener(Event.COMPLETE,complete);;   
  56.             var context:LoaderContext = new LoaderContext();
  57.             //context.checkPolicyFile = true;      
  58.             context.applicationDomain = ApplicationDomain.currentDomain;
  59.             ld.loadBytes(byteArrayBegin);   
  60.         }      
  61.     }
  62. }

NetConnection connect AMFPHP

报错很离奇,线上环境正常。当在本地调试debug时报:
Error #2044: 未处理的 NetStatusEvent:。 level=error, code=NetConnection.Call.BadVersion

打开PHP_error.log,搜索VerboseException,看到:
[19-May-2010 09:57:17] PHP Fatal error:  Uncaught exception  ‘VerboseException’ with message ‘Standalone Flash player disabled.  Update gateway.php to allow these connections’ in E:\wamp20h\www\amfphp  1.9\core\amf\app\Gateway.php

打开amf/gateway.php,找到代码 原来还有这个坑,注释掉这两行解决问题。

if(PRODUCTION_SERVER)
{
//Disable profiling, remote tracing, and service browser
//$gateway->disableDebug();           
//Keep the Flash/Flex IDE player from connecting to the gateway. Used for security to stop remote connections.
//$gateway->disableStandalonePlayer();    
}

air 开发 android 应用加入 adsense 广告

flash builder 4.6 现在能直接全平台发布AIR包装过的app,这看起来很强大。
android app 开发主力盈利模式还是广告,很多广告平台都是针对java SDK,并未很好支持AIR。

解决方案:

js广告页面html   + AIR 有个内置浏览器   + 重定向URL连接

自定义一个装载还js广告内容的普通html页面,然后用AIR 的StageWebView浏览这个页面,通知监听浏览连接改变,弹出移动设备系统浏览器。

关键实现代码如下:

_stageWebView = new StageWebView();
  _stageWebView.stage = myStage;
   _stageWebView.viewPort = new Rectangle(0, 0, 320, 50);
   _stageWebView.addEventListener(LocationChangeEvent.LOCATION_CHANGING, locationChangingHandler);
   _stageWebView.addEventListener(LocationChangeEvent.LOCATION_CHANGE, locationChangeHandler);
   _stageWebView.loadURL(“http://www.playp2p.com/AD/gwyad.html”);

protected function locationChangingHandler(event:Event):void
  {
   dispatchEvent(event.clone());
  }
  
  protected function locationChangeHandler(event:Event):void{
   dispatchEvent(event.clone());
  }

效果如下:

flash 中文编码转换

flash中文乱码显示如下:

u5403u80afu5fb7u57fau8fd8u662fu9ea6u5f53u52b3    (吃肯德基还是麦当劳)

as3 Unicode  转换 UTF-8。

package utils
{
import flash.utils.ByteArray;
public class LocaleUtil
{
public function LocaleUtil()
{
}

public static function getEscapeString(str:String):String
{
str = str.replace(/u\w{4}/g,str_rp);
return str;
}

protected static function str_rp():String
{
var s:String = arguments[0];
s = s.replace(“u”,”0x”);
var n:Number = Number(s);
s = LocaleUtil.getUnicodeChar(n);
return s;
}

/**
* Unicode编码(16进制)     UTF-8 字节流(二进制)
* 2字节 16Bit 最大3字节 24Bit
0000 – 007F         0xxxxxxx
0080 – 07FF         110xxxxx 10xxxxxx
0800 – FFFF         1110xxxx 10xxxxxx 10xxxxxx
* 例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,
* 所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。
* 将6C49写成二进制是:0110 110001 001001,
* 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
*/

public static function getUnicodeChar(u:uint):String
{
var b:ByteArray=new ByteArray();
var u1:uint;
var u2:uint;
var u3:uint;

if (u {
b.writeByte(u);
}
else if (u> 6;
u2 = (u & 0x3F) + 0xC0;
b.writeByte(u2);
b.writeByte(u1);
}
else
{
u1 = u & 0x3F;
u1 += 0×80;// 0011 1111
u = u >> 6;
u2 = u & 0x3F;
u2 += 0×80;// 0001 1111
u = u >> 6;
u3 = u & 0x0F;
u3 += 0xE0;// 0000 1111

b.writeByte(u3);
b.writeByte(u2);
b.writeByte(u1);
}
b.position = 0;
return b.readUTFBytes(b.length);
}

}
}

HTML5拼图游戏

技术之图像处理:一个滑动的拼图游戏
HTML5有许多功能特性可以把多媒体整合到网页中。使用canvas元素可以在这个空白的画板上填充线条,载入图片文件,甚至动画效果。
在这篇文章中,我将做一个滑动拼图的游戏用来展示HTML5 canvas的图片处理能力。
在网页中使用canvas标签用来创建画板

  1. <canvas width=”480px” height=”480px”></canvas>

复制代码

canvas的宽和高使用像素为单位。如果这两个属于没有被指定,他们的默认的宽度为:300px,高度为:150px。
在图板画图需要使用canvas的上下文环境,通过脚本调用getContext()方法获取上下文环境。W3C定义它为二维,更确切的说是2d。所以初始化上下文环境如果如下方法:

  1. document.getElementById(“vanvas”).getContext(“2d”);

复制代码

下一步要做的是在画板上显示图片,API只提供drawImage()一种方法。但是有三种调用方式。最常用的是传入三个参数:image对象,以及图片相对于画板的x,y坐标。

  1. drawImage(image, x, y);

复制代码

还可以加入两个参数用于设置图片的宽和高

  1. drawImage(image, x, y, width, height);

复制代码

最复杂的drawImage函数有9个参数,按顺序分别为:图片对象,图片x坐标,图片y坐标,图片宽,图片高,目标x坐标,目标y坐标,目标宽和目标高。后四个参数主要是为了截取原图部分用来显示,比如局部放大、剪切等。
以上就是图像处理的方法,让我们做一个练习。

  1. <div id=”slider”>
  2.   <form>   
  3.     <label>Easy</label>
  4.     <input type=”range” id=”scale” value=”4″ min=”3″ max=”5″ step=”1″>
  5.     <label>Hard</label>
  6.   </form>
  7. <br>
  8. </div>
  9. <div id=”main”>
  10. <canvas id=”puzzle” width=”480px” height=”480px”></canvas>
  11. </div>

复制代码

上面的DIV包括了另一个HTML5标签:range input,这个标签可以让用户拖放滑块选择一个数值。回头我们再说在拼图中如何与range input交互。到目前为止ie和firefox并不支持这个标签。
现在就像我上面说过,想要在canvas上绘图,我们需要context。

  1. var context = document.getElementById(“puzzle”).getContext(“2d”);

复制代码

对了我们还需要一个图片,使用例子里自带的,或者找一个和canvas相同大小的图片都行。

  1. var img = new Image();
  2. img.src = ‘http://www.brucealderman.info/Images/dimetrodon.jpg’;
  3. img.addEventListener(‘load’, drawTiles, false);

复制代码

加入这个事件是确保图片完成加载后,再把图片放入canvas中。
下面我们通过range input设置拼图的数量,数据范围从3到5(几行几列)。

  1. var boardSize = document.getElementById(‘puzzle’).width;
  2. var tileCount = document.getElementById(‘scale’).value;

复制代码

有了上面两个数值就可以计算一个拼图的大小了

  1. var tileSize = boardSize / tileCount;

复制代码

OK我们开始创建画板

  1. var boardParts = new Object;
  2. setBoard();

复制代码

setBoard()的作用是初始化看板,要模拟显示这个画板,我们使用一个二维数组。
不过用JavaScript创建这样数组的过程不是很优雅,我们先定义一个平面数组,每个数组再定义一个数组。这个拼图游戏,每一个元素都是一个对象,它带有x和y坐标记录所在的网格位置。因此每个对象有两个坐标,
第一个坐标是数组坐标,表示它在画板的位置,另外的坐标是对象的x,y属性,它记录着拼图图片的位置。当这两个坐标相同了就说明位置正确。
为了达到目的,我们在初始化的时候把它们的位置互换。这样拼图就不在正确的位置了。

  1. function setBoard() {
  2.     boardParts = new Array(tileCount);
  3.     for (var i = 0; i < tileCount; ++i) {
  4.      boardParts[i] = new Array(tileCount);
  5.      for (var j = 0; j < tileCount; ++j) {
  6.       boardParts[i][j] = new Object;
  7.       boardParts[i][j].x = (tileCount – 1) – i;
  8.       boardParts[i][j].y = (tileCount – 1) – j;
  9.      }
  10. }
  11.     emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;
  12.     emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;
  13.     solved = false;
  14. }

复制代码

最后三个变量我们还没有定义
我们必须追踪空白拼图的位置还要记录用户点击的位置

  1. var clickLoc = new Object;
  2. clickLoc.x = 0;
  3. clickLoc.y = 0;
  4. var
  5. emptyLoc = new Object;
  6. emptyLoc.x = 0;
  7. emptyLoc.y = 0;

复制代码

最后这个变量是指拼图是否完成

  1. var solved = false;

复制代码

所有的拼图都找到正确的位置后,设置它为true。
现在我们需要一些和解决拼图相关的方法
首先为rang input定义触发事件,当它改变了,我们要重新计算拼图的数量和大小

  1. document.getElementById(‘scale’).onchange = function() {
  2.    
  3. tileCount = this.value;
  4.     tileSize = boardSize /
  5. tileCount;
  6.     setBoard();
  7.    
  8. drawTiles();
  9. };

复制代码

还要追踪鼠标经过的拼图以及哪个拼图被点击

  1. document.getElementById(‘puzzle’).onmousemove = function(e)
  2. {
  3.     clickLoc.x = Math.floor((e.pageX – this.offsetLeft) /
  4. tileSize);
  5.     clickLoc.y = Math.floor((e.pageY -
  6. this.offsetTop) / tileSize);
  7. };
  8. document.getElementById(‘puzzle’).onclick
  9. = function() {
  10.     if (distance(clickLoc.x, clickLoc.y,
  11. emptyLoc.x, emptyLoc.y) == 1) {
  12.         
  13. slideTile(emptyLoc, clickLoc);
  14.         
  15. drawTiles();
  16.     }
  17.     if (solved)
  18. {
  19.         alert(“You solved
  20. it!”);
  21.     }
  22. };

复制代码

有一些浏览器会在重画画板之前弹出对话框,为了防止它的发生,一定要用延迟。

  1. if (solved) {
  2.     setTimeout(function() {alert(“You solved
  3. it!”);}, 500);
  4. }

复制代码

当一个拼图被点击时,我们要知道它的四周是否可以移动。判断的方法是当前位置到空白位置的总距离为1时就可以移动。
简单点说就是x相同要判断y的距离是否为1,y相同要判断x的距离是否为1。

  1. function distance(x1, y1, x2, y2) {
  2.     return Math.abs(x1 -
  3. x2) + Math.abs(y1 – y2);
  4. }

复制代码

移动拼图的做法是,我们复制被点击拼图的坐标到空位置。然后把点击位置设置成空白坐标。

  1. function slideTile(toLoc, fromLoc) {
  2.     if (!solved)
  3. {
  4.         boardParts[toLoc.x][toLoc.y].x =
  5. boardParts[fromLoc.x][fromLoc.y].x;
  6.         
  7. boardParts[toLoc.x][toLoc.y].y =
  8. boardParts[fromLoc.x][fromLoc.y].y;
  9.         
  10. boardParts[fromLoc.x][fromLoc.y].x = tileCount -
  11. 1;
  12.         
  13. boardParts[fromLoc.x][fromLoc.y].y = tileCount -
  14. 1;
  15.         toLoc.x =
  16. fromLoc.x;
  17.         toLoc.y =
  18. fromLoc.y;
  19.         
  20. checkSolved();
  21.     }
  22. }

复制代码

一旦拼图移动了,我们还要检查一下拼图是否全部在正确的位置。

  1. function checkSolved() {
  2.     var flag =
  3. true;
  4.     for (var i = 0; i < tileCount; ++i)
  5. {
  6.         for (var j = 0; j <
  7. tileCount; ++j)
  8. {
  9.             if
  10. (boardParts[i][j].x != i || boardParts[i][j].y != j)
  11. {
  12.                
  13. flag =
  14. false;
  15.             
  16. }
  17.         }
  18.    
  19. }
  20.     solved = flag;
  21. }

复制代码

如果有一个拼图不正确函数就会返回false,否则返回true。
最后,重绘被点击的拼图到新的位置。

  1. function drawTiles() {
  2.     context.clearRect ( 0 , 0 , boardSize , boardSize );
  3.     for (var i = 0; i < tileCount; ++i) {
  4.         for (var j = 0; j < tileCount; ++j) {
  5.             var x = boardParts[i][j].x;
  6.      var y = boardParts[i][j].y;
  7.             if(i != emptyLoc.x || j != emptyLoc.y || solved == true) {
  8.                 context.drawImage(img, x * tileSize, y * tileSize, tileSize, tileSize,
  9.                      i * tileSize, j * tileSize, tileSize, tileSize);
  10.             }
  11.         }
  12.     }
  13. }

复制代码

当画拼图时,这个函数可以防止填充画板时匹配空的位置,因为在游戏中用户可以选择不同的难度。

HTML5 – canvas 2D绘图

HTML5 – canvas 2D绘图

 

HTML 5 规范引进了很多新特性,其中最令人期待的之一就是 canvas 元素。HTML 5 canvas 提供了通过 JavaScript 绘制图形的方法,此方法使用简单但功能强大。每一个 canvas 元素都有一个”上下文( context )” (想象成绘图板上的一页),在其中可以绘制任意图形。浏览器支持多个 canvas 上下文,并通过不同的 API 提供图形绘制功能。目前,canvas 已成为 HTML5 规范中的事实性标准,并且已经被 Firefox 3.0+, Safari 3.0+, Chrome 3.0+, Opera10.0+ 等浏览器所支持。最近,IE 也正式宣称将在其 9.0 版本之后,开始对 canvas 元素进行支持。 

本文介绍 2D canvas基础以及如何使用基本 canvas 函数,如线条、形状、图像和文字等。为了理解此文章,你最好了解JavaScript 基础知识。

HTML中的canvas标记

单独的一个 canvas 标记只是在页面中定义了一块矩形区域,并无特别之处,开发人员只有配合使用 JavaScript 脚本,才能够完成各种图形,线条,以及复杂的图形变换操作。

在开始绘图之前,我们需要首先创建一个指定大小的 canvas,并为其指定一个 id,方便在 JavaScript 脚本中获取该 DOM 实例对象。声明一个 canvas 节点的方式如下所示。

<canvas id="canvas" width="300" height="200">
 Fallback content, in case the browser does not support Canvas.
 </canvas>

需要指明的是,由于无法保证所有用户使用的浏览器都能够支持 canvas 元素,所以在目前开发基于 canvas 的 Web 应用中需要增加“Fallback content”,以提示用户他们无法正常体验此功能的原因或建议他们去下载最新的浏览器。

 

获得上下文context

基于 canvas 的绘图并不是直接在 canvas 标记所创建的绘图画面上进行各种绘图操作,而是依赖画面所提供的 渲染上下文(Rendering Context),所有的绘图命令和属性都定义在渲染上下文当中。在通过 canvas id 获取相应的 DOM 对象之后首先要做的事情就是获取渲染上下文对象。 渲染上下文与 canvas 一一对应,无论对同一 canvas 对象调用几次 getContext() 方法,都将返回同一个上下文对象。目前,所有支持 canvas 标签的浏览器都支持 2D 渲染上下文,可以使用如下的代码来获取该对象。

var context = document.getElementById("canvas").getContext("2d");

绘制矩形

创建好了画布后,让我们来准备画笔。要在画布中绘制图形需要使用 JavaScript 。首先通过 getElementById 函数找到 canvas元素,然后初始化上下文。之后可以使用上下文 API 绘制各种图形。下面的脚本在 canvas 中绘制一个矩形:

<!DOCTYPE HTML>
<html>
<body>

<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>

<script type="text/javascript">

var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="#FF0000";
cxt.fillRect(0,0,150,75);

</script>

</body>
</html>

上面的页面在浏览器里显示如下:

Html5 canvas rect.png

通过 fillRect 可以绘制带填充的矩形。使用 strokeRect 可以绘制只有边框没有填充的矩形。如果想清除部分 canvas 可以使用 clearRect。上述三个方法的参数相同:x, y, width, height。前两个参数设定 (x,y) 坐标,后两个参数设置矩形的高度和宽度。

 

绘制路径

通过 canvas 路径(path)可以绘制任意形状。可以先绘制轮廓,然后绘制边框和填充。创建自定义形状很简单,使用 beginPath()开始绘制,然后使用直线、曲线和其他图形绘制你的图形。绘制完毕后调用 fill 和 stroke 即可添加填充或者设置边框。调用 closePath() 结束自定义图形绘制。

完整的路径绘制过程大致可以分为如下两个阶段:

  1. 定义路径轮廓:在每个 canvas 实例对象中都拥有一个 path 对象,创建自定义图形的过程就是不断对 path 对象操作的过程。每当开始一次新的图形绘制任务,都需要先使用 beginPath() 方法来重置 path 对象至初始状态,进而通过一系列对 moveTo/lineTo 等画线方法的调用,绘制期望的路径,其中 moveTo(x, y) 方法设置绘图起始坐标,而 lineTo(x,y) 等画线方法可以从当前起点绘制直线,圆弧以及曲线到目标位置。最后一步,也是可选的步骤,是调用 closePath() 方法将自定义图形进行闭合,该方法将自动创建一条从当前坐标到起始坐标的直线。
  2. 绘制路径:定义完路径的轮廓,此时 canvas 画面中没有显示任何路径,开发人员还可以对路径进行修改。一旦确定完成,则需要继续调用 stroke()/fill() 函数来完成将路径渲染到画面的最后一步。路径的轮廓颜色和填充颜色由 strokeStyle 和 fillStyle 属性决定。
<!DOCTYPE HTML>
<html>
<body>

<canvas id="myCanvas" width="200" height="100">
Your browser does not support the canvas element.
</canvas>

<script type="text/javascript">

var c=document.getElementById("myCanvas");
var context=c.getContext("2d");

// Set the style properties.
context.fillStyle   = '#00f';
context.strokeStyle = '#f00';
context.lineWidth   = 4;

context.beginPath();
// Start from the top-left point.
context.moveTo(10, 10); // give the (x,y) coordinates
context.lineTo(100, 10);
context.lineTo(10, 100);
context.lineTo(10, 10);

// Done! Now fill the shape and draw the stroke.
// Note: your shape will not be visible until you call any of the two methods.

context.fill();
context.stroke();
context.closePath();

</script>

</body>
</html>

显示效果如下:

Html5 canvas path.png

我们还可以分别试着注释掉context.fill(); 或者 context.stroke(); , 就可以理解fill和stroke的含义了。

文字

context 对象可以设置以下 text 属性:

  • font:文字字体,同 CSS font-family 属性
  • textAlign:文字水平对齐方式。可取属性值: start, end, left, right, center。默认值:start.
  • textBaseline:文字竖直对齐方式。可取属性值:top, hanging, middle,alphabetic, ideographic, bottom。默认值:alphabetic.

有两个方法可以绘制文字: fillText 和 strokeText。第一个绘制带 fillStyle 填充的文字,后者绘制只有 strokeStyle 边框的文字。两者的参数相同:要绘制的文字和文字的位置(x,y) 坐标。还有一个可选选项——最大宽度。如果需要的话,浏览器会缩减文字以让它适应指定宽度。文字对齐属性影响文字与设置的(x,y) 坐标的相对位置。

在本文附带的例子中我们用到了文字的绘制:

ctx.fillStyle    = '#00F';
ctx.font         = 'bold 20px sans-serif';
ctx.textBaseline = 'top';
ctx.fillText  ('Hello Canvas!', 0, 0);

动画

Canvas 并非为了制作动画而出现,自然没有动画制作中帧的概念。因而,使用定时器不断的重绘 canvas 画面成为了实现动画效果的通用解决方式。Javascript 中的 setInterval(code,millisec) 方法可以按照指定的时间间隔 millisec 来反复调用 code 所指向的函数或代码串,这样,通过将绘图函数作为第一个参数传给 setInterval 方法,在每次被调用的过程中移动画面中图形的位置,来最终达到一种动画的体验。需要注意的一点是,虽然 setinterval 方法的第二个参数允许开发人员对绘图函数的调用频率进行设定,但这始终都是一种最为理想的情况,由于这种绘图频率很大程度上取决于支持 canvas 的底层 JavaScript 引擎的渲染速度以及相应绘图函数的复杂性,因而实际运行的结果往往都是要慢于指定绘图频率的。

下面的例子绘制了不同颜色的贝塞尔曲线:

<html>
  <head>
    <style>
      body {
        margin: 0;
      }
    </style>

  </head>

  <body>

    <canvas id="canvas" width="400" height="400"></canvas>

    <script type='text/javascript'>
      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext('2d');

      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;

      var waves = ["rgba(195, 002, 002, 0.6)",
					"rgba(174, 000, 000, 0.3)",
					"rgba(227, 093, 068, 0.3)",
					"rgba(234, 135, 109, 0.3)",
                   ]

      var i = 0;

      function draw() {
        canvas.width = canvas.width;

        ctx.fillStyle    = '#00F';
        ctx.font         = 'bold 20px sans-serif';
        ctx.textBaseline = 'top';
        ctx.fillText  ('Hello Canvas!', 0, 0);

        for(var j = waves.length - 1; j >= 0; j--) {
          var offset = i + j * Math.PI * 12;
          ctx.fillStyle = (waves[j]);

          var randomLeft = Math.abs(Math.pow( Math.sin(offset/100), 2 )) * 200;
          var randomRight = Math.abs(Math.pow( Math.sin((offset/100) + 10), 2 )) * 200;
          var randomLeftConstraint = Math.abs(Math.pow( Math.sin((offset/90)+2), 2 )) * 300;
          var randomRightConstraint = Math.abs(Math.pow( Math.sin((offset/90)+1), 2)) * 300;

          ctx.beginPath();
          ctx.moveTo(0, randomLeft + 10);

          // ctx.lineTo(canvas.width, randomRight + 10);
          ctx.bezierCurveTo(canvas.width / 3, randomLeftConstraint, canvas.width / 3 * 2, randomRightConstraint, canvas.width, randomRight + 10);
          ctx.lineTo(canvas.width , canvas.height);
          ctx.lineTo(0, canvas.height);
          ctx.lineTo(0, randomLeft + 10);

          ctx.closePath();
          ctx.fill();
        }

        i++;
      }
      setInterval("draw()", 20);
    </script>
  </body>
</html>

下图中显示了文字和动画的绘制:

Html5 canvas wave.png       HTML5 Canvas demo!

总结

本文对 HTML5 新引入的 canvas 元素在 Web 绘图中所扮演的角色和所发挥的作用做了最基本的介绍,其中包括使用 canvas 完成基本的 Web 绘图,动画和交互任务,虽然 Flash,Silverlight 也都可以完成相同的任务,甚至在性能上更胜一筹,但是作为一种不依赖任何插件的标准 Web 像素级绘图技术,我们有理由相信随着各大浏览器厂商的加入,canvas 将会更加成熟完善,也会有更多基于 canvas 的绘图类应用不断涌现。

Robotlegs 机械腿


What is Robotlegs?

Robotlegs is a pure AS3 micro-architecture (framework) with a light footprint and limited scope. Simply put, Robotlegs is there to help you wire your objects together. It provides the glue that your application needs to easily function in a decoupled way. Through the use of automated metadata based dependency injection Robotlegs removes boilerplate code in an application. By promoting loose coupling and avoiding the use of Singletons and statics in the framework Robotlegs can help you write code that is highly testable.
 

项目地址:http://www.robotlegs.org/
应用实例:https://github.com/robotlegs/robotlegs-demos-Bundle
多核扩展:http://github.com/Stray/robotlegs-utilities-Modular



Pixboks.com 免费照片冲印


在线免费照片打印邮寄。http://www.pixboks.com/

Starling

flash player 11 正式版本终于推出了,这对 flash和整个前端发展都是革命性的!

虽然很早就看到了测试版本,但要真的用起来还的需要个框架,staring 来啦。

入手框架做个demo 测试一下他的实现方式,基本模拟出了flash原有的显示对象结构,事件流程。

可能有一点不适应的就是,没有了MouseEvent。取而代之是touch。

做了一个测试鼠标交互的demo http://www.playp2p.com/starling/

QQ天堂岛

QQ天堂岛

 http://ttd.qq.com/