- 积分
- 136401
- 注册时间
- 2014-12-27
- 最后登录
- 2026-1-24
- 在线时间
- 605 小时
- 威望
- 562
- 贡献
- 29
- 金币
- 52903
- 钢镚
- 1422
- 交易凭证
- 1
- 分享
- 0
- 精华
- 33
- 帖子
- 2094
- 主题
- 1742
TA的每日心情 | 擦汗 2018-4-10 15:18 |
|---|
签到天数: 447 天 [LV.9]以坛为家II
超级版主
    
- 威望
- 562
- 贡献
- 29
- 金币
- 52903
- 钢镚
- 1422
 
|
这应该是我的个人心得,所以用我最方言的语言来描述一下与大家分享,也做我自己的备忘。
FlasCC的文档真不多,中文的就不用说了。除了天地会上翻译的几篇,别的我也没怎么看到。
首选从我最近工作中的一个bug说起。程序如下:
1,一个c/c++源文件,这个要用FlasCC编译成一个SWC。
- #include
- #include "AS3/AS3.h"
- void fn() __attribute__((used,
- annotate("as3sig:public function fn():void"),
- annotate("as3package:randy.test")));
- void fn(){
- int sum = 0;
- AS3_Trace(sum);
- }
- int main(){
- AS3_GoAsync();
- }
复制代码 (这个编译可以通过,成功生成一个SWC。但我觉得这个FlasCC应该编译过不了才是合理的)
1,一个AS3源文件,要使用上面生成的SWC,应该有一个AS3项目,只要有一个主类文件就够了,就是这个啦。
- package{
- import randy.test.fn;
- import flash.display.Sprite;
- public class TestFlasCC_SWC extends Sprite{
- public function TestFlasCC_SWC(){
- var r:* = fn();
- trace("===============");
- }
- }
- }
复制代码 OK,现在运行这个AS3项目。
报错啦:::::
ReferenceError: Error #1065: 变量 sum 未定义。
at global/randy.test::fn()
at TestFlasCC_SWC()[C:\workspace\Adobe\FlashBuilder\TestFlasCC_SWC\src\TestFlasCC_SWC.as:12]
变量 sum 未定义。很显然,这个块程序里就应该是AS3_Trace(sum)这一句报错了。因为,只有这一行才是对sum有调用。
经过了猜想,测试,。。。
终于明白错在哪里了。
把AS3_Trace(sum)这一句改了。
改成,
- AS3::local::var var_sum = AS3::local::internal::new_int(sum);
- AS3::local::internal::trace(var_sum);
复制代码 然后,这回前面就应该要引入AS3++.h了。
多一行#include "AS3/AS3++.h"
现在c/c++源文件应该是这样的了。
- #include
- #include "AS3/AS3.h"
- #include "AS3/AS3++.h"
- void fn() __attribute__((used,
- annotate("as3sig:public function fn():void"),
- annotate("as3package:randy.test")));
- void fn(){
- int sum = 0;
- AS3::local::var var_sum = AS3::local::internal::new_int(sum);
- AS3::local::internal::trace(var_sum);
- }
- int main(){
- AS3_GoAsync();
- }
复制代码 这样运行就正常了。你自己测试吧。
从这个错误,我看到了。
原来AS3_Trace()里的参数,实际上他是从AS3程序上下文里找的,因为我在AS3并没有定义sum这样的一个变量,所以未定义。而后一个C源文件编译的SWC就可以正常运行。没说找不到sum因为,是从C程序的上下文中查找变量。
对此,我简单的感受到了FlasCC平台里的一些架构,主要有3点,
1,变量区是独立的(不知道专业的名称是什么,在这里请允许我自己定这个名字 ^_^)
从我这次的程序就很明显,C里定义的变量和AS3里的变量是在不同的区里。当然,其实就应该这样。只是调用FlasCC方法的时候,注意他需要的是哪个区里的变量。AS3_Trace方法,是C里的方法,但却是针对AS3里的变量。在FlasCC里别的C方法,如果有以AS3为前缀。我百分之九十九的肯定,也会是这样的。
类似的另一个方法AS3::local::internal::trace(var_sum)就不是从AS3区里找变量了,使用的是C里的变量。只是注意需要封装成什么样了哦。
2,介于AS3和C之间的一类东东
既然变量区是有区别的,AS3和C是分开的。从AS3_Trace这个方法看,参数要找的是AS3里的变量,虽然可以用inline_as3来在C里定义AS3里的变量,让AS3_Trace可以正常运行。但是,有些时间你和我一样,很不愿意勉强这样做。毕竟我们写的是程序的C部分,尽量都在C里搞定吧。所以AS3++.h里的很多东西(很多宏,当然也有方法)就用上了。比如我用到的
- AS3::local::var var_sum = AS3::local::internal::new_int(sum);
- AS3::local::internal::trace(var_sum);
复制代码 在AS3++.h里,你还可以看到一堆。new_uint,new_Number,new_Boolean,new_String,,,以new_为前缀的方法。注意观察。这里有int,uint,Number,Boolean,String,没有char,C里有char字符类型的变量的嘛。看来。这是对AS3里变量类型的某一种映射呀,而且处在C程序中。最终可以供AS3::local::internal::trace()使用,直接扔一个C里的变量给AS3::local::internal::trace()编译都过不了。如下,
- int sum = 0;
- AS3::local::internal::trace(sum);
复制代码 编译的时候报错:
swc.cpp: In function ‘void fn()’:
swc.cpp:17: error: conversion from ‘int’ to non-scalar type ‘AS3::local::var’ requested
Makefile:2: recipe for target `swc' failed
make: *** [swc] Error 1
所以我说这些new_int,new_uint方法生成的变量是介于AS3,C之间。
除了new_方法,下面还有一堆bool_valueOf,int_valueOf,uns_valueOf,,,,作用和new_就比较相反了。还有别的,自己去看吧。
3,C里的AS3
这个要去Flash++.h里看啦。
AS3里的那些类,
你看Flash++.h的类,
AS3::ui::flash::display::Stage
AS3::ui::flash::display::Sprite
AS3::ui::flash::display::Graphics
AS3::ui::flash::events::Event
在C里完全的写AS3呀。
啊。。。。。
本文来自:http://blog.sina.com.cn/s/blog_5d323f950101abc0.html
|
|