标签存档: AS3

Signals框架介绍(三)原生事件

注意:本文参考An introduction to AS3 Signals写成,但不是翻译,有增删改。


原生事件

为了达到替换AS3事件机制的目的,Signals当然包含了对AS3原生事件的支持。这依赖于NativeSignal类。

下面的范例演示了如何在Stage上添加单击事件。由于一看就懂,这里就不废话解释了。

[NativeSignalSample.as]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import org.osflash.signals.natives.NativeSignal;
 
[SWF(width=500,height=300,frameRate=30,backgroundColor=0xFFFFFF)]
/**
 * 测试原生事件
 * @author zrong(zengrong.net)
 */
public class NativeSignalSample extends Sprite 
{
    public function NativeSignalSample()
    {
        _click = new NativeSignal(this.stage, MouseEvent.CLICK, MouseEvent);
        _click.add(handler_click);
        //测试只发生一次的点击事件
        //_click.addOnce(handler_click);
    }
 
    private var _click:NativeSignal;
 
    private function handler_click($evt:MouseEvent):void
    {
        trace('currentTarget:',$evt.currentTarget);
        trace('target:',$evt.target);
    }
}
}

其它资料

Signals框架介绍(二)高级事件

注意:本文参考An introduction to AS3 Signals写成,但不是翻译,有增删改。


也许你现在又想起了AS3内置事件框架的好处,希望使用currentTarget?或者希望支持冒泡?OK,Signals也能满足你那多变的心……(貌似是我自己多变罢了ˇ^ˇ)

高级事件

使用DeluxeSignal可以实现更高级的事件传递。还是基于闹钟的例子进行修改,将原来AlarmClock中的Signal改为DeluxSignal: 继续阅读 »

Signals框架介绍(一)基本用法

注意:本文参考An introduction to AS3 Signals写成,但不是翻译,有增删改。


Signals是一个基于AS3的轻量级事件框架,它被设计用来代替AS3内置的Event框架。

为什么我们要放弃Event框架,改用Signals呢?原因主要有以下几点:

  1. 使用AS3内置的Event框架,必须继承EventDispatcher或者自行实现IEventDispatcher,而Signals使用组合,可以避免继承;
  2. 使用AS3内置框架在事件中实现值的传递,必须自定义事件类才可以。而Signals可以方便的实现多个强类型值的传递;
  3. Signals不使用字符串来区分不同的事件,而是使用实例;
  4. Signals的速度更快,据说是AS3内置事件机制的4倍。

来看个简单的例子吧,这个例子中的闹钟会叫我们起床。此范例部分源码来自An introduction to AS3 Signals
继续阅读 »

将图像的透明区域转换为Alpha通道原理

Sprite Sheep Editor中,使用了这样的一个小技术(思路来自这里):将透明图像的Alpha通道转换成黑白(灰度)图像,然后与正常图像拼合成一张大图,再存储成JPEG格式。

这方法其实是一个折中方案。因为JPEG格式是不支持透明的,很多时候为了获得透明效果,我们只能使用PNG格式。但PNG是无损压缩的,在图像尺寸上没有优势。如果将Alpha通道转换成黑白图并保存到JPEG图像中,就能大幅降低最终的图像文件大小。

在我的测试中,一个2000×3300的32位带Alpha通道的PNG图像文件大小为2MB,转换为4000×3300(因为拼合了黑白图片,宽度增加一倍)70%压缩比的JPEG后,文件大小为1.1MB。

当然,转换后的JPEG文件画质比PNG要稍差一些。这可以通过调整压缩比得到一定程度的改善。

要将图像的Alpha通道转换为黑白图像,在AS3中很容易: 继续阅读 »

使用Embed标签在AS3项目中嵌入字体

2011年9月10日更新:根据网友zszen的回复,找到这样几篇更详细的文章:


source on github

关于嵌入字体,其实Embed fonts这篇文章已经很详细的介绍了。但这篇文章有这样几个问题:

  1. 它是针对Flex开发者的,纯AS开发者看起来未免不爽;
  2. 没有讲解怎么使用在Flash IDE中嵌入的字体;
  3. 嵌入字体就那么点东西,其实不值得花功夫读这一大篇鸟语(介是偷懒……)

那我就把要点总结下…… 继续阅读 »

FlashPlayer/AIR在new Vector(-1)的时候崩溃

ADL错误

source on github

试试这段代码:

?View Code ACTIONSCRIPT
var __length:int = -1;
var __v:Vector.<string> = new Vector.</string><string>(__length);
</string>

如果你用Flash builder编译,不会显示任何错误。编译后的swf无法双击打开,或打开后立即退出。

如果你用编译的是AIR程序,程序运行后会立即崩溃,同时弹出下面的提示信息: 继续阅读 »

一个未完成的简单AS3 eval实现

本文源码(on github):https://github.com/zrong/blog/blob/master/unfinished_as3_eval.md

AS3没有eval确实不方便,目前我所知有两种方法:

  1. 使用ActionScript 3 Eval Library来实现。但这个库比较大,debug编译越140KB。如果项目非常注重文件大小,则需要考虑;
  2. 如果swf部署在浏览器环境中,可以将eval交给Javascript来处理,然后获取Javascript的返回值即可。

我在工作中需要使用eval的地方,往往比较简单,且比较规律。这种情况下,完全可以自己写一些简单的逻辑来实现。

这个例子中的需求就很简单,是实现一个较为灵活的站位算法。我在外部配置文件中定位了12个站位坐标(包含xy值),人物进入界面后,基于这些站位点来站位。但由于舞台的大小是变化的,如果定义一个确定的值,无法根据舞台的大小进行变化。

如果让外部的配置文件中支持类似于 h/2 或者 w-100 这种语法,就非常灵活了。

这个实现仅支持一次运算,而且不支持单个的 w 这种类型的值,要获取 w,必须用 w+0 这种语法。但对当前的需求来说,足够了。

下面就是代码: 继续阅读 »

AS3中正则表达式对反斜杠的替换

本文源码

一个有趣的小问题,下面的正则表达式能替换成功么?

?View Code ACTIONSCRIPT
var __str:String = '1234\6789';
trace(__str.replace(/\\/g, '5'));

答案是:不能。trace出来的结果为:

[trace] 12346789

其实正则本身并没有写错,错在被替换的字符串。反斜杠“\”在AS3中是转义符,会将其后的任何值转换为本身,因此看到的字符串其实本身就是12346789,也就是没有反斜杠,当然无法搜索到。

直接trace(__str),结果和上面的trace相同。

希望得到正确的结果,需要将字符串设置为:1234\\6789,我们看到的是两个反斜杠,而AS3认为它是一个反斜杠。 继续阅读 »

[转]Flash Player 执行模型之可变跑道

传统的FlashPlayer可变跑道模型

本文源码

原文地址:http://blogs.adobe.com/xwlin/2010/04/flash_player_101_-_adobe_max_2009_1.html
转载地址:http://blog.csdn.net/zlxluofeng/article/details/5516349
演讲人: Lee Thomason (lthomaso@adobe.com)
翻译: 林晓伟 (xwlin@adobe.com)

上一篇我们介绍了Flash Player的代码库是如何归并一体以及对Flash平台的后期开发产生的影响,在第二节里,我们将重点讨论Flash Player的体系结构及其对开发人员的影响。

理解执行模型

执行模型是指Flash Player在每一个帧周期中如何执行相应的指令操作。Flash Player后台事实上运行着n多线程,只是AS并没有给开发人员提供多线程编程模型。这意味着从概念上来讲我们要把Flash Player看做是单线程运行实体,有关这一单线程编程模型的优势/劣势的争论从未休止过,我不想对这一具有争议性的问题做过多评论,但请大家记住这一事实。

可变跑道(Elastic Racetrack)

可变跑道是Flash Player的帧执行模型,这个模型描述了在一帧的处理周期中,代码执行和帧渲染的工作是怎样彼此平衡的。Flash Player 9和AVM2对这一模型进行了一些改进,这一信息是基于对事件机制和渲染模型的研究总结出来的,完整的模型尚未被官方公布。

基本的跑道理论没有发生改变,在Flash Player执行一帧的周期里,前一部分时间用于执行代码,剩余时间用于渲染显示列表中的对象。每个执行阶段都可以根据实际需求增加执行时间来执行更多代码或做更多的渲染工作,而跑道的总长度也将相应增长。 继续阅读 »

FocusEvent与buttonMode的关系

本文源码

这两个家伙有关系么?

当然有,而且还挺紧密的。

它们之间的关系就是:

如果一个Sprite不开启buttonMode,那么就不会有FocusEvent事件发出

这关系说起来挺简单的,但是你若是不知道,而且还急着用,说不定会让你发疯……(我就疯了一次)

当然,TextField虽然没有buttonMode,也会有FocusEvent。

那么SimpleButton会如何?我没试,懒得试了……

把下面的代码中的 _sprite.buttonMode = true; 一行注释掉,可以看到(或者说看不到?)效果。

继续阅读 »