Quantcast
Channel: LicKy's blog - AS3
Viewing all 11 articles
Browse latest View live

结婚的意义


十秒教会你打领带

$
0
0

无意之中看见的,觉得这招挺适用的,所以转下来了。

表演练习之我不是李小龙

FlasCC详细教程

$
0
0

 最近工作项目中有一个功能模块用到了FlashCC,将C++的代码编译成swc文件,以便在Flash工程中使用。开发过程中遇到一些问题,现在记录下来,以便日后查阅。

一、开发环境搭建

说明:本文所使用的FlashCC版本为1.0.1, 操作系统为Windows7 Professional 32位

相对于FlashCC的前身Alchemy来说,FlashCC的开发环境搭建已经简化了许多,一些开发过程中依赖的组件已经默认集成到官方提供的定制Cygwin当中。首先需要注意最小系统需求,下面是官方给出的标准:

  • Flash Player 11 or higher 

  • Flex SDK 4.6 or higher

  • Java Virtual Machine (64-bit)

  • Window平台需要:Microsoft® Windows® 7 (64-bit edition)

其中前两点必须要满足。至于后两点,我的开发机器用的是Win7 32位系统,装的Java虚拟机也是32位的,实际操作中也没有发现太大问题(不过建议有条件的话最好还是使用官方标准)。

了解基本需求后到各个网站上下载Flex SDKJREFlashCC开发包(1.0.1版本),下载完成后继续下面的步骤:

1、解压FlexSDK(本文中解压路径为F:\Flex\flex_sdk_4.6)

2、安装JRE

3、添加或编辑系统环境变量
    java_home  C:\Program Files\Java\jdk1.7.0_02

    Path       %java_home%\bin

4、解压FlashCC开发包(已经内置了定制版的cygwin) (本文中解压路径为F:\Flash\FlasCC_1.0.1)

5、使用文本编辑器打开F:\Flash\FlasCC_1.0.1\samples\Makefile.common, 修改FLASCC及FLEX变量为下面的值:以便每次编译只需输入make就好

而不用带上很长的路径参数。

FLASCC:=/cygdrive/f/Flash/FlasCC_1.0.1/sdk
FLEX:=/cygdrive/c/flex

(说明:FLASCC=/cygdrive/你的flascc文件夹下面的sdk目录,FLEX=/cygdrive/你的FLEX SDK目录)

有些FLEX的目录一般默认都有空格,所以经常编译会报错,说路径不存在,所有最好把FLEX的SDK目录下的文件全部拷贝到根目录下,比如D:/sdk

至此,FlashCC的开发环境就搭建好了,下面来尝试编译FlashCC开发包中自带的示例程序。

 

二、编译样例程序

直接运行F:\Flash\FlasCC_1.0.1\run.bat,切换工作目录到01_HelloWorld下:

注意:如果使用的是32位Java虚拟机,则需要修改一下01_HelloWorld下的Makefile, 在编译命令后加上-jvmopt=-Xmx1G

否则会报下面的错误:

“LLVM ERROR: Error: Unable to launch the Java Virtual Machine.    
This usually means you have a 32bit JVM installed or have set your Java heap siz     
e too large.     
Try lowering the Java heap size by passing "-jvmopt=-Xmx1G" to gcc/g++.”

在cygwin窗口中输入make:

image

一切顺利的话,会在01_HelloWorld目录下多出hello.exe和hello.swf两个文件,使用FlashPlayer打开hello.swf,效果如下:

image

 

 

AS3代码中向C++中传递ByteArray参数的方法

$
0
0

 关于从AS3代码中向C++中传递ByteArray参数的方法,采用官方Demo中的数据传递方法成功解决了ByteArray传参问题。贴出参考代码:

/////////////////////////////////////////////////////////////////////////////////////////

AS3

/////////////////////////////////////////////////////////////////////////////////////////


 // First lets fill a ByteArray like we normally would in ActionScript 
 var bytes:ByteArray = new ByteArray(); 
 bytes.endian = "littleEndian"; 
 for (var j:int = 0; j < 10; j++) 
    bytes.writeInt(j);
 
 bytes.position = 0;
 
 // Now we want a pointer to that ByteArray 
 var bytesPtr:int = CModule.malloc(bytes.length);
 
 // Use CModule.writeBytes() to write the ByteArray we created into flascc's 
 // main memory.  The parameters of writeBytes() are first the pointer in flascc 
 // memory, the length of the ByteArray, and the ByteArray itself 
 CModule.writeBytes(bytesPtr, bytes.length, bytes); 
 printLine("Checksum: " + MyLib.examineBytes(bytesPtr, bytes.length));
CModule.free(bytesPtr);    

 

 

/////////////////////////////////////////////////////////////////////////////////////////

C

/////////////////////////////////////////////////////////////////////////////////////////
 __attribute__((annotate("as3sig:public function _wrap_examineBytes(buffer:int, bufferSize:int):int"))) 
 void _wrap_examineBytes() { 
   unsigned char *arg1 = (unsigned char *) 0 ; 
   int arg2 ; 
   int result ; 
   { 
     AS3_GetScalarFromVar(arg1, buffer); 
   } 
   { 
     AS3_GetScalarFromVar(arg2, bufferSize); 
   } 
   result = (int)examineBytes((unsigned char const *)arg1,arg2); 
   { 
     AS3_DeclareVar(asresult, int); 
     AS3_CopyScalarToVar(asresult, result); 
   } 
   { 
     AS3_ReturnAS3Var(asresult); 
   } 
 }

 

AS3工程中调用C++编译的swc库教程

$
0
0

 由于工作需要,接触到了FlasCC,网上找了很多教程,发现少的可怜,太多需要自己看英文教程摸索

但荣幸还是摸索出了一些头脑,下面分享下如何使用flasCC,并在AS3工程中调用C++编译的swc库

 

1、首先用 FlashBuilder4.6 建一个AS3工程(FlasCCTest)

image

2、然后建一个 doo1.cpp 和对应的 Makefile:

image

image

image

 

“cd /FlasCCTest/cpp/doo1”回车
"make FLASCC="/cygdrive/c/FlasCC/sdk" FLEX="/cygdrive/c/FlasCC/flex_sdk_4.6.0"”回车:

 image

 

给工程加上“doo1.swc”:

 

image

 

最后运行AS3工程:

image

FLASCC编译swc代码库的makefile范本

$
0
0

FLASCC编译swc代码库的makefile范本 :

 

OUT_DIR:=./output

LIB_DIR:=./lib

OUT_WRAPPER_FILE:=$(OUT_DIR)/MyFlashLib_wrapper.c

INTERFACE_FILE:=./include/MyFlashLib.i

SOURCE_DIR:=./src

SOURCES:= $(SOURCE_DIR)/MyFlashLib.cpp    \
      $(SOURCE_DIR)/main.cpp

ABC_FILES:=$(OUT_DIR)/MyFlashLib.abc

CFLAGS:=-Werror -Wno-write-strings -Wno-trigraphs -jvmopt=-Xmx1G

AS_MODULE_FILE:=$(OUT_DIR)/MyFlashLib.as

ASC2FLAGS:=-merge -md    \
       -import D:\FlasCC_1.0.0\sdk\usr\lib\builtin.abc    \
       -import D:\FlasCC_1.0.0\sdk\usr\lib\playerglobal.abc

GCC_OUTPUT_FILE:=lib/MyFlashLib.swc

SWF_OUT_FILE:=test.swf

SWF_PROJECT_FILE:=test/test.as

MODULE_NAME:= MyFlashLib

PACKAGE_NAME:=mylibs.MyFlashLib

SWF_COMPILER_FLAGS:=-static-link-runtime-shared-libraries    \
           -compiler.omit-trace-statements=false    \
           -debug=false

FLACC_DIR:=D:\FlasCC_1.0.0\sdk

FLEX_DIR:=D:\Program\ Files\Adobe\Adobe\ Flash\ Builder\ 4.6\sdks\4.6.0

all:
    @if [ -d $(OUT_DIR) ] ; then true;    \
    else mkdir $(OUT_DIR);    \
    fi
    @if [ -d $(LIB_DIR) ] ; then true; \
    else mkdir $(LIB_DIR);    \
    fi
    @echo "生成模块声明文件"
    $(FLACC_DIR)\usr\bin\swig -as3 -module $(MODULE_NAME) -outdir $(OUT_DIR) -includeall -ignoremissing -o $(OUT_WRAPPER_FILE) $(INTERFACE_FILE)
    @echo "编译AS文件到字节码文件"
    java -jar $(FLACC_DIR)\usr\lib\asc2.jar $(ASC2FLAGS) $(AS_MODULE_FILE)
    @echo "生成模块"
    $(FLACC_DIR)\usr\bin\g++ $(SOURCES) $(OUT_WRAPPER_FILE) $(ABC_FILES) $(CFLAGS) -I./include -emit-swc=$(PACKAGE_NAME) -o $(GCC_OUTPUT_FILE)
    @echo "生成项目文件"
    $(FLEX_DIR)\bin\mxmlc $(SWF_PROJECT_FILE) $(SWF_COMPILER_FLAGS) -library-path+=$(GCC_OUTPUT_FILE)  -o $(SWF_OUT_FILE)

 

C++和AS3的各种参数转换实例

$
0
0

由于工作需要写了个C++的A星寻路算法,用在flash游戏里的自动寻路,而缩小寻路时间,提高效率

需要用到的是强大的工具FlasCC,下面记录下使用效率非常高的参数转换方法。

 

需要用到的头文件是 "AS3/AS3.h" 和"AS3/AS3++.h"

 

1、返回AS3的Array类型:

void returnArray() __attribute__((used,
   annotate("as3sig:public function returnArray():Array"),
   annotate("as3package:myLib")));

void returnArray()
{
      inline_as3("var myArray:Array = new Array();\n");    
      inline_as3("var myAS3Number:int;\n");
  
      for(int i=0; i<5; i++)
      {
         AS3_CopyScalarToVar(myAS3Number, i); 
         AS3_Trace(myAS3Number);
         inline_as3("myArray.push(myAS3Number);\n");
      }

//除了Number和int数字类型外,其它的类型返回均要用下面这个函数
     AS3_ReturnAS3Var(myArray);

 

2、获取AS3传入的int,Number,String类型,并返回Number类型:

void getArgs() __attribute__((used,
        annotate("as3sig:public function getArgs(intValue:int, strValue:String):Number"),
        annotate("as3package:myLib")));

void getArgs()
{
      double num;    
      AS3_GetScalarFromVar(num, intValue);
      AS3::local::var cVar;
      AS3_GetVarxxFromVar(cVar, strValue);
      char* str = AS3::local::internal::utf8_toString(cVar);
      printf("cVar=%s\n", str); // output: cVar=hello
      inline_as3(
            "trace(\"trace: \"  +%0 +  \": \" + CModule.readString(%1, %2));\n"
            : :  "r"(num), "r"(str), "r"(strlen(str))
        );
     free(str);

     AS3_Return(num);

}   

 

3、在flash中查看打印信息方法:

    const char* words[] = {"O", "#", "X"};
    for(i=0; i<3; i++) {
        inline_as3(
            "trace(\"trace: \" + %0 +  \": \" + CModule.readString(%1, %2));\n"
            : : "r"(i), "r"(words[i]), "r"(strlen(words[i]))
        );
    } 

 

 


如何使FlasCC编译的SWC文件变小

$
0
0

当我们使用默认的makefile编译参数的时候,使用FlasCC编译出来的swf或者swc文件都有点大

但我们在maefile文件中增加一个编译参数可以使得文件体积变小不少,而且运行效率也好多很

 

比如我自己编译的一个AStar文件,原来的有600多K,加上那个参数后只有400多K了

而且在flash游戏中寻路时间从50ms以上到最多1ms,效率可见。

 

下面是我的一个makefile配置参数,系统是32位win7系统

T01: check
 "$(FLASCC)/usr/bin/g++" $(BASE_CFLAGS) -O4 AStar.cpp Main.cpp -emit-swc=AStar -o AStar.swc -lAS3++ -jvmopt=-Xmx1G
  
include D:/FlasCC_1.0.1/samples/Makefile.common

clean:
 rm -f *.swf *.swc *.bc *.exe

 

说明:

-O4 :这个参数太好了,使得文件体积大大减小

-jvmopt=-Xmx1G :32位机器编译需要加的参数

-lAS3++:如果使用了AS3/AS3++.h的类库,就需要加这个参数,不然编译会报错。

 

还与其它一些参数可以参考下

1、禁用调试信息

     Release编译时不要加上-g开关。

2、使用-Os编译程序。

    不要使用-funroll-loops等可以加速程序执行但是会大大增加目标代码体积的开关。

3、编译后的程序使用strip去除符号和偏移(限于可执行程序和共享库,其他易出问题) 

4、如果你不需要RTTI,编译时加入-fno-rtti。

5、如果你不需要处理C++异常,编译时加入-fno-exceptions。

6、使用UPX之类的可执行程序压缩程序(只推荐用于可执行程序,用于其他也可,但是较浪费内存)。

 

TweenLite的overwrite属性

$
0
0

 

overwrite默认属性是1 会覆盖之前的所有的缓动 不想覆盖请设置为0

TweenLite.to(this,0.4,{alpha:1,ease:Back.easeOut,onComplete:onShowedComplete,overwrite:0});

其他相关设置

模式0:NONE。不做任何处理。性能Excellent。

模式1:ALL_IMMEDIATE。设为该模式的TweenMax Object运动具有最高的优先级,会覆盖掉运动物体之前所有的缓动。新的TweenMax Object创建时覆盖旧的TweenMax Object。性能Excellent。

模式2:AUTO。是TweenMax的默认模式(原来我之前的痛苦都是因为它···)。在新的TweenMax Object第一次渲染时覆盖重复的属性(模式1是覆盖掉全部属性)。只要不是具有太多的属性需要覆盖,性能还是不错的。

模式3:CONCURRENT。这个单词的意思是“同时发生”。跟模式1很相似。唯一的不同是他只覆盖掉正在运行的TweenMax Object。而放过其他的没有启动的TweenMax Object。性能Very Good。

模式4:ALL_ONSTART。也是跟模式1非常像。两点不同是他是在TweenMax Object第一次渲染时才覆盖掉其他所有的TweenMax Object,而且这个会把在他之后创建的TweenMax Object也覆盖掉。性能Very Good。

模式5:PREEXISTING。这个单词一看上去很迷糊,其实是pre-existing,囧。唯一的不同是他是在TweenMax Object第一次渲染时才覆盖掉其他所有的TweenMax Object。性能Very Good。

如果想改变全局的TweenMax Object默认overwrite属性,可以调用哪个OverWriteManager类的全局方法init(),即:

OverwriteManager.init(OverwriteManager.XXXX);

TweenLite使用详解

$
0
0

 

TweenLite参数说明:
       1) $target : Object - 作为目标的对象, MovieClip或者其它对象
       2) $duration : Number- 动画的时间长度(单位:秒)
       3) $vars : Object – 对象,通过属性值,来存贮各种属性参数用于缓动。
        (如果你使用TweenLite.from() 方法,这里的参数表示缓动的初始值)
          Object 该对象所具有的属性:
          alpha: alpha  目标对象应该完成 (或开始,当使用 TweenLite.from()时)的透明度级别.如果
                   target.alpha 是1,当缓动被执行的时候,你指定参数为 0.5,它将把透明度从 1 缓动
                   到 0.5.
          x: 改变 MovieClip的 x 位置,把这个值设置成你希望的 MovieClip 的结束位置(如果你使用的是
              TweenLite.from()这个值表示开始位置). ( y scaleX scaleY rotation等属性不重复说明)
          特别的属性 (**可选的**):
          delay : Number - 延迟缓动 (以秒为单位).
          ease : Function - 缓动函数. 例如,fl.motion.easing.Elastic.easeOut 函数。默认的是
                    Regular.easeOut函数。
          easeParams : Array - 用来存贮缓动公式所需要的额外数据. 当使用 Elastic 公式并且希望控
                             制一些额外的参数,比如放大系数和缓动时间。大多数的缓动公式是不需要参数
                             的,因此,你不需要给其它的缓动公式传递参数。
          autoAlpha : Number - 用它来代替 alpha 属性,可以获得一些副加的效果,比如当 alpha
                           值缓动到 0时,自动将 visible 属性改为 false。当缓动开始前,autoAlpha 大
                           于0时,它将会把 visible 属性变成 true 。
          visible : Boolean - 在缓动结束时,想指定 DisplayObject 的 visible 属性,请使用这个参数
          volume : Number - 对soundTransform(MovieClip/SoundChannel/NetStream 等)对
                       象中的volume属性(音量大小)进行缓动
          tint : Number - 改变 DisplayObject 的颜色,设置一个16进制颜色值之后,当缓动结束时,
                  目标对象将被变成这个颜色,(如果使用的是TweenLite.from(),这个值将表示目标对
                  象开始缓动时的颜色)。举个例子,颜色值可以设定为0xFF0000。
          removeTint : Boolean - 要移除 DisplayObject 颜色,将这个参数设成 true 。
          frame : Number - 将 MovieClip 缓动到指帧频。
          onStart : Function - 在缓动开始时想要执行某个函数,就将函数的引用(通常是函数名)放
                        到这里。如果缓动是带延迟的,那么在缓动开始前该函数不会被执行。
          onStartParams : Array - 为缓动开始时要执行的函数传递参数。(可选的)
          onUpdate : Function - 缓动过程中,每次更新时调用这里指定的函数(缓动开始后,每一帧被
                           触发一次)
          onUpdateParams : Array - 给 onUpdate 参数指定的函数传递参数 (可选的)
          onComplete : Function - 缓动结束时执行的函数。
          onCompleteParams : Array - 给 onComplete 参数指定的函数传递参数 (可选的)
          persist : Boolean - 值为 true 时,TweenLite 实例将不会自动被系统的垃圾收集器给收走。
                       但是当新的缓动出现时,它还是会被重写(overwritten)默认值为 false.
          renderOnStart : Boolean - 如果你使用带有延迟缓动的 TweenFilterLite.from() ,并且阻
                                 止缓动的渲染(rendering )效果,直到缓动真正开始,将这个值设为 true.
                               默认情况下该值为 false ,这会让渲染效果立即被执行,甚至是在延迟的时间
                                 还没到之前。
         overwrite : int - 当前的缓动被创建以后,通过这个参数可以限制作用于同一个对象的其它缓动
                        可选的参数值有:
                     - 0 (没有): 没有缓动被重写。这种模式下,运行速度是最快的,但是需要注意避免创
                                      建一些控制相同属性的缓动,否则这些缓动效果间将出现冲突。
                     - 1 (全部): (这是默认值,除非 OverwriteManager.init() 被调用过)对于同一对象的
                                      所有缓动在创建时将会被完全的覆盖掉。
                            TweenLite.to(mc, 1, {x:100, y:200});
                            TweenLite.to(mc, 1, {x:300, delay:2}); //后创建的缓动将会覆盖掉先前创
                                 建的缓动(可以起到这样的作用:缓动进行到一半时被中断,执行新的缓动)
                    -2 (自动): (当 OverwriteManager.init() 被执行后,会根据具体的属性值进行选择) 只
                                       覆盖对同一属性的缓动。
                               TweenLite.to(mc, 1, {x:100, y:200});
                               TweenLite.to(mc, 1, {x:300}); //only  "x" 属性的缓动将被覆盖
                    - 3 (同时发生): 缓动开始时,覆盖全部的缓动。
                                 TweenLite.to(mc, 1, {x:100, y:200});
                                 TweenLite.to(mc, 1, {x:300, delay:2});
                                 //不会覆盖先前的缓动,因为每二个缓动开始时,第一个缓动已经结束了。

举例:
       将实例名为 "clip_mc" 的 MovieClip 透明度降到 50% (0.5) ,并将它 x 轴位置移动到 120 ,
将音量将到 0,缓动总共用时 1.5 秒,代码如下:

import gs.TweenLite;
TweenLite.to(clip_mc,
1.5, {alpha:0.5, x:120, volume:0});
 

如果希望使用更高级的缓动函数在 5 内,将 alpha 变到 0.5,将 x 移动 到 120 ,使用
"easeOutBack" 弹性函数,缓动整体延迟 2 秒发生,并且在缓动结束时,执行 "onFinishTween"
函数,并且为这个函数传递几个参数,(一个数值 5 以及对 clip_mc 的引用),代码如下:

import gs.TweenLite;
import fl.motion.easing.Back;
TweenLite.to(clip_mc,
5, {alpha:0.5, x:120, ease:Back.easeOut, delay:2, onComplete: onFinishTween, onCompleteParams:[5, clip_mc]});
function onFinishTween(argument1:Number, argument2:MovieClip):void {
  trace(
"The tween has finished! argument1 = " + argument1 + ", and argument2 = " + argument2);
}
 

如果你的舞台上的 MovieClip 已经停在了它的结束位置,你只想让它花上5秒种回到这个位置,
(只需要改变 y 属性,比当前位置高 100 像素的位置,让它从那里下落), 代码如下(这次使用
的是 TweenLite.from 译者注):

import gs.TweenLite;
import fl.motion.easing.Elastic;
TweenLite.from(clip_mc,
5, {y:"-100", ease:Elastic.easeOut});

 

- 给参数值加上引号,表示对指定的属性进行相应操作。比如,使用

TweenLite.to(mc, 2, {x:"-20"});

它将 mc.x 向左移动 20 像素,与此相同效果的代码是:

TweenLite.to(mc, 2, {x:mc.x - 20});

- 你可以用别的缓动函数替换 TweenLite 默认的缓动函数: Regular.easeOut.
- 必须使用 Flash Player 9 或之后版本的播放器 (ActionScript 3.0)
- 可以对任何 MovieClip 使用 "volume" 缓动,就比如:TweenLite.to(myClip_mc, 1.5, {volume:0});
- 可以将 MovieClip 设定成某种颜色,使用 "tint" 参数,比如:

TweenLite.to(myClip_mc, 1.5, {tint:0xFF0000});

- 想要对数组内容进行缓动,将数值放到一个叫 endArray 的数组中即可,例如:

var myArray:Array = [1,2,3,4];
TweenLite.to(myArray,
1.5, {endArray:[10,20,30,40]});

- 可以在任何时候终止缓动,使用 TweenLite.killTweensOf(myClip_mc); 函数。如果想强制终止
缓动,可以传递一个 true 做为第二个参数,比如 TweenLite.killTweensOf(myClip_mc, true);
- 取掉延迟回调函数,用 TweenLite.killDelayedCallsTo(myFunction_func);这项功能可以用来控制
回调函数的优先级。
- 使用 TweenLite.from() 方法,可以使用对象从别的位置回到当前的位置。例如,你可以将对象在舞
台上摆放整齐(缓动结束时的位置),然后利用缓动,让它们跑到那个位置上去,你可以将缓动的初始
位置值 x 或 y 或 alpha (或者其它你需要的属性)当做参数传递给这个方法函数。

Viewing all 11 articles
Browse latest View live