作者:無赖非雅
发布时间:September 21, 2011
分类:FLASH
No Comments
Adobe Systems今天宣布,Adobe Flash Player的第十一个版本、Adobe AIR的第三个版本均将在10月初发布最终正式版,为游戏、媒体、数据应用带来一大堆新特性。Adobe Flash 11/AIR 3的主要亮点有:
- 2D/3D图形加速:完整的2D/3D图形GPU硬件加速,速度可比Flash Player 10/AIR 2快一千倍。
- 原生64位支持:Windows、Mac OS X、Linux三大系统均迎来原生64位版本。
- AIR原生扩展:上千个高度优化的开源库,开发人员可以尽情使用独特的软件和硬件功能,包括访问设备数据、震动控制、磁力计、光纤传感器、双屏输出、近场通信(NFC)等等。
- Captive运行时:除了苹果iOS系统,开发人员还可以在Windows、Mac OS X、Android系统上自动将AIR 3与其应用程序打包在一起,简化安装过程。用户也无须再单独下载或者更新AIR,除了上述系统之外黑莓BlackBerry Tablet OS也会集成AIR。
- 内容保护:Adobe Flash Access 3可在所有支持平台上保护视频内容,包括新支持的移动平台。
- 高清视频质量跨平台:完整帧率的高清视频可以在苹果iOS设备的AIR应用内呈现,并使用H.264硬件加速。电视富应用亦可支持高清视频和7.1声道环绕音效。
- 租赁与订阅支持。
作者:無赖非雅
发布时间:August 19, 2011
分类:FLASH,ActionScript
1 Comment
在G+上看到一个小游戏flood it(传送门:https://plus.google.com/games/479261262298),觉得挺好玩的。便用flash实现了一个。玩这个小游戏的技巧就是圣经上的一句话:再深入一点你就能得到更多的快乐。吼吼
flash on 2011-8-19 - wonderfl build flash online
代码如下
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.text.TextFormat;[SWF(width="320", height="480")]
public class Main extends Sprite
{
private const MAX_STEP:int = 25;
private const COL:int = 10;
private const ROW:int = 10;
private var gridList:Array;
private var colorList:Array = [0xFF6600,0x669900,0xFF99CC,0x0099FF,0xFFFF00];
private var currentColor:uint;
private var gridContainer:Sprite;
private var stepLabel:TextField;
private var currentStep:int;
public function Main() {
createButtons();
createCountLabel();
createGrid();
}
private function createButtons() : void {
var b0:Grid = new Grid(colorList[0]);
var b1:Grid = new Grid(colorList[1]);
var b2:Grid = new Grid(colorList[2]);
var b3:Grid = new Grid(colorList[3]);
b0.buttonMode = b1.buttonMode = b2.buttonMode = b3.buttonMode = true;
b0.y = b1.y = b2.y = b3.y = 10;
b0.x = 10;
b1.x = 50;
b2.x = 90;
b3.x = 130;
b0.addEventListener(MouseEvent.CLICK, b0_clickHandler);
b1.addEventListener(MouseEvent.CLICK, b1_clickHandler);
b2.addEventListener(MouseEvent.CLICK, b2_clickHandler);
b3.addEventListener(MouseEvent.CLICK, b3_clickHandler);
addChild(b0);
addChild(b1);
addChild(b2);
addChild(b3);
}
private function b3_clickHandler(event : MouseEvent) : void {
clickGrid(3);
}
private function b2_clickHandler(event : MouseEvent) : void {
clickGrid(2);
}
private function b1_clickHandler(event : MouseEvent) : void {
clickGrid(1);
}
private function b0_clickHandler(event : MouseEvent) : void {
clickGrid(0);
}
private function createCountLabel() : void {
stepLabel = new TextField();
stepLabel.width = 100;
stepLabel.height = 35;
stepLabel.defaultTextFormat = new TextFormat("Arial", 13, 0x000000);
stepLabel.selectable = false;
stepLabel.y = 40;
stepLabel.x = 10;
updateLabel();
addChild(stepLabel);
}
private function createGrid() : void {
if (gridContainer) {
while (gridContainer.numChildren > 0) {
gridContainer.removeChildAt(0);
}
} else {
gridContainer = new Sprite();
gridContainer.x = 30;
gridContainer.y = 100;
addChild(gridContainer);
}
gridList = [];
for (var i:int = 0;i
var temp:Array = [];
for (var j:int = 0;j
var grid:Grid = new Grid(colorList[Math.random()*4 >> 0]);
if (i==0&&j==0) {
grid.flooded = true;
currentColor = grid.color;
}
grid.col = j;
grid.row = i;
temp.push(grid);
gridContainer.addChild(grid);
}
gridList.push(temp);
}
flood();
}
private function clickGrid(colorIndex:int):void {
currentStep++;
currentColor = colorList[colorIndex];
flood();
updateLabel();
}
private function updateLabel():void {
stepLabel.text = "" + currentStep + "/" + MAX_STEP;
}
private function flood():void {
for (var i:int=0; i
for (var j:int=0; j
var grid:Grid = gridList[i][j];
if (grid.flooded) {
grid.color = currentColor;
if (j
var rightGrid:Grid = gridList[i][j+1];
if (rightGrid.color == currentColor && !rightGrid.flooded) {
rightGrid.flooded = true;
}
}
if (j>0) {
var leftGrid:Grid = gridList[i][j-1];
if (leftGrid.color == currentColor && !leftGrid.flooded) {
leftGrid.flooded = true;
}
}
if (i
var downGrid:Grid = gridList[i+1][j];
if (downGrid.color == currentColor && !downGrid.flooded) {
downGrid.flooded = true;
}
}
if (i>0) {
var upGrid:Grid = gridList[i-1][j];
if (upGrid.color == currentColor && !upGrid.flooded) {
upGrid.flooded = true;
}
}
}
}
}
}
}
}
import flash.display.Sprite;
class Grid extends Sprite {
private const WIDTH:Number = 30;
private var _col:int;
private var _row:int;
private var _color:uint;
public var flooded:Boolean = false;public function Grid(value:uint) {
this._color = value;
draw(color);
}
public function set col(value:uint):void {
_col = value;
this.x = value * WIDTH;
}
public function get col():uint {
return this._col;
}
public function set row(value:uint):void {
_row = value;
this.y = value * WIDTH;
}
public function get row():uint {
return _col;
}
public function set color(value:uint):void {
this._color = value;
draw(this._color);
}
public function get color():uint {
return this._color;
}
private function draw(color:uint):void {
this._color = color;
this.graphics.clear();
this.graphics.beginFill(color);
this.graphics.drawRect(0, 0, WIDTH, WIDTH);
this.graphics.endFill();
}
}
作者:無赖非雅
发布时间:March 15, 2011
分类:GIT
No Comments
前几天在项目中使用GIT时遇到了一个很诡异的问题。即用status命令查看的时候,一些没有更改过的文件也显示为modified。checkout到某个分支,什么都不做直接status也会出现。按理说我能checkout到别的分支去说明现在这个分支已经是干净的了(实际上也是做过提交的),再跳回来的时候未做任何改动就会出现一堆已经修改过的文件。用diff查看文件修改都是大段大段的修改,实际上代码都一样。不得已只好暂时commit上去。
后来求助于万能的微博终于有高人出来指点。原来是行结束符惹的祸。
core.autocrlf
1.如果为true,当从读文本文件时,git将行尾的CRLF转换为LF,写文件时进行相反的转换。
2.也可以设置为input,这种情况,只在读取文本文件是进行转换,在写文件时,将LF作为行尾结束符。
3.一个文件是否本认为是文本文件(也就是受到autocrlf机制的约束),依赖文件的crlf属性,或者,如果没有指定crlf属性,那么主要依赖文件的内容。
core.autocrlf 转换
如果core.autocrlf为false,不进行转换。(git config core.autocrlf false)
如果core.autocrlf为true,在工作路径中的文件用CRLF作为结束符,当提交(checkin)到代码库时,再转换为LF作为行结束符。
如果core.autocrlf被设置为input,在checkin时,行结束符被转换为LF,但是checkout时,则不会转换。
在使用git的过程中,如果我们的项目是跨平台开发的,那么CRLF的处理也许会成为一个很头疼的事情,有可能会出以下的莫名其妙的问题:
我们的某个开发人员在linux上提交的一个文件
当从windows上pull下来后,没做任何的修改,查看其status,它的状态已经是modifed了
即使你使用git checkout -f来恢复改文件,它的状态仍然是modified,真是郁闷...
后来,才发现就是CRLF惹的祸
我们都知道,在Windows上是CRLF来作为一行的结束符,而Linux上则是LF作为行结束符
在git中提供了autocrlf的设置,可以用来自动转换CRLF,它可以设置成true,false,input
Windows上的msysgit默认设置了autocrlf为true
这样,在提交时自动地把行结束符CRLF转换成LF,而在签出代码时把LF转换成CRLF
这样保证了从windows平台上提交的代码,都是以LF作为行结束符
在linux平台上,git默认设置autocrlf为false,也即它不会自动处理CRLF
这样就有一个问题,如果我们把windows上的一个文件给上传到linux上,并提交
那么,提交到仓库中的代码就会以CRLF来换行了,
这样就会导致我们在windows上查看改文件的状态就会是modified
解决这个问题有以下2个办法:
在Linux上设置autocrlf为input,这样,Git在提交时把CRLF转换成LF,签出时不转换
对于从Windows上直接拷到Linux上的文件,首先把它转换成linux格式后,再进行提交
作者:無赖非雅
发布时间:March 14, 2011
分类:默认分类
No Comments

Google很可能将在今天(美国时间)的西南偏南(SXSW)大会上发布一款名为Google圈子(Circles)的社交服务。读写网称该服务有可能提供照片、视频和状态消息分享功能。用户在该服务上分享的内容只会跟现实生活中的社交圈子分享,而不是和所有联系人批量分享。
BarCamp、Hashtags等知名社交网络产品的创始人Chris Messina广泛参与了“圈子”的开发。照片编辑器Piknik(去年被Google收购) CEO Jonathan Sposato 也参与了“圈子”的开发。Sposato可能是唯一一个将两家创业公司卖给Google的创业者。2005年其创建的Phatbits被Google收购,后来成为Google Gadgets。
来源:@36氪
作者:無赖非雅
发布时间:January 12, 2011
分类:FLASH,ActionScript,增强现实
2 Comments
翻译了一篇FlarToolKit/Flash 增强现实入门的文章。原文地址
FlarToolKit/Flash 增强现实入门
下面我会花一些时间介绍一下FlarToolKit。如果你不知道什么是FlarToolKit,FlarToolKit是Flash上一个关于增强现实开源库.在这篇里我对它进行了详细的介绍。
在这篇文章里我决定介绍一下怎样用FlarToolKit进行开发。FlarToolKit有点难上手,因为差不多所有代码里的注释都是日文,让人有点难以读代码(如果你不懂日语)。所以你得多花点时间深挖和仔细阅读。在开始之前请下载这个例子。它是基于Saqoosha的simple cube例子,但是比它好理解些。
现在让我们开始。
Step 1:下载
一开始我去Saqoosha的博客我没有用谷歌翻译翻译整个页面,但是我看到三个熟悉的字眼“SVN”。哈,我非常确定我能把FlarToolKit库下载下来。
从下面的链接下载FlarToolKit:
http://www.libspark.org/svn/as3/FLARToolKit/trunk
如果你从未使用过PV3D请使用点击这个链接。它介绍了如何下载PV3D以及使用。
Step 2:Inspect
当我开始学习使用一些特别的库的时候我都会这么做。从看例子或者看代码库。当我
查看FlarToolKit代码库时我会试着做个总结。
我从跟着Saqoosha的SimpleCube例子开始。我个人不太喜欢它作为一个例子的写法。
(尽管从可重用性上说它做得非常完美)在这个例子里有三个类 ARAppBase,
PV3DARApp和SimpleCube。
每一个类都是AR程序的一部分,但是不容易理解,因为SimpleCube继承自PV3DARApp
,PV3DARApp继承自ARAppBase。为了简单易懂起见我组合这三个类到一个类里。(低
重用,易懂)
如果你没有下载上面的例子现在请下载这个
Flar程序由四个部分组成:
1.摄像头参数文件
2.标记文件
3. 标记探测器
4. Flar Base Node
5. Papervision
摄像头参数
摄像头参数文件加载进来后是二进制文件。一开始我不知道这个文件是做什么的。我
去Saqoosha的博客咨询他这个,他说这个文件来自于ARToolkit(FLARToolkit最最原
始的来源)的一个叫“calib_camera2”程序生成的。
Calib_camera2生成这个二进制文件,里面的数据用于纠正摄像头的光学畸变。你可
以从这里下载这个程序,不过我认为使用FLARToolkit自带的“camera_para.dat”应
该比较好(我相信这是大部分人的选择)。
标记文件
标记文件是一个Flar会去从你摄像头捕捉到的画面里去检测的图样。如果你打开标记
文件,我的是在“lib/mikko.pat”,你会发现有4个16x48的矩阵。他们分别代表你
的标记文件的四个不同方向。在Flar看来,你的标记是一个16x16的二维码。在这个
文件里每个矩阵是16x48是因为它实际上是16x16个三色(红,绿,蓝)。
Saqoosha创建了一个Air程序来创建这些标记文件。你可以从这里下载到。
然后按以下步骤:
1.按以下规格设计一个标记。你可以在中间的方块区域里放任何你想要的图形,不过
我认为有些形状会比较好识别。所以多试试。
2.打印这个标记然后打开那个air程序,把标记放在摄像头前面。当在标记上出现一
个红色线框时点击“Save Pattern”。
标记检测器
标记检测器在从摄像头捕捉到的画面画出的BitmapData里寻找标记文件所定义的图形
。一旦它找到了你的标记它会通知你并给你一个相似程度的百分比。然后你可以获取
一个转换矩阵去控制Flar Base Node
Flar Base Node
Flar Base Node 实际上是继承自PV3D的DisplayObject3d,你可以把3d的东西放里面
(在我的例子里是一个平面和立方体)。把从标记检测器获取到的转换矩阵提供给它
让我们的3d物体看起来正常。
PV3D
关于PV3D我不想太深入的介绍。如果你对PV3D感兴趣可以goole一下,有很多关于它
的资料。
一些误区
在开发FlarToolkit程序时到现在为止我遇到两个误区。
1.当引入PV3D库了编译FlarToolkit时,即使是使用提供的例子,你会看到如下报错
Error: Attempted access of inaccessible property _projection through a
reference with static type org.libspark.flartoolkit.pv3d:FLARCamera3D.
要解决这个问题打开org.papervision3d.cameras.Camera3D,在里面找到private
var _projection:Matrix3D;,修改为protected var _projection:Matrix3D;
这样做不会破坏PV3D而且允许FlarCamera3D使用Camera3d的映射矩阵。
2.这个问题我不太确定原因在哪。处于某些原因你必须设置PV3D的viewport你的视频
的两倍。如果不这样做的话渲染的3d场景不会与摄像头获取到的视频对齐。就算你这
么做了还是会不是完美对齐。在Saquoosha的例子里他给viewport设置了-4像素的偏
移。
剩下的就靠你们了。我的代码很同意理解。我希望这篇文章能够填补FlarToolkit开
发的空白。如果你有任何问题请在下面留言。虽然我也是刚开始了解这个东西不能知
道所有问题的答案,但是我会尽我最大努力去回答它们。