守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 2149|回复: 0

[技术知识] 在C++中操作ActionScript对象

[复制链接]
  • TA的每日心情
    郁闷
    2016-8-19 16:08
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    4

    主题

    31

    帖子

    2628

    积分

    少尉

    Rank: 6Rank: 6

    威望
    0
    贡献
    8
    金币
    320
    钢镚
    25
    发表于 2015-1-11 14:49:13 | 显示全部楼层 |阅读模式
          FlasCC允许你从一个C++库里生成一个SWC。如果你想在你已有的Actionscript项目中加入一些已经用C++写好的逻辑,那么这个功能会非常有用。这篇帖子将向你演示如何操作将ActionScript对象作为参数传入到C++库里的函数中的。
        当然这篇帖子是建立在你已经知道如何在FlasCC中编译一个SWC的基础上的,如果你还不了解怎么编译,可以先参考下samples/05_SWC这个例子(里面已经附带了FlasCC SDK)。
           AS3++.h库给出了一些函数可以使得在C++中对ActionScript对象的操作变得简单些。

    获取属性
    使用getProperty()函数可以非常容易地获取对象的属性值。
    在下面的代码中,C++函数getDelta()演示了这一点。

    设置属性
    设置属性值也是通过函数setProperty()很容易地完成。
    在下面的代码中,C++函数setDelta()演示了这一点。

    调用函数
    调用函数要稍微复杂些,你首先需要对方法名使用getProperty(),得到代表该方法的函数定义,然后再将这个定义的函数传入到call()或call_v()函数中。
    在下面的代码中,C++函数getString()演示了这一点。

    示例代码
    下面是一个C ++库的示例,演示了以上的每一个操作:

    1. #include <stdio.h>
    2. #include "AS3/AS3.h"
    3. #include "AS3/AS3++.h"


    4. ////
    5. //
    6. // Get a property of an ActionScript object in C++
    7. //
    8. ////

    9. void getDelta() __attribute__((used,
    10. annotate("as3import:flash.events.MouseEvent"),
    11. annotate("as3sig:public function getDelta(m:MouseEvent):int"),
    12. annotate("as3package:MyLibrary")));

    13. void getDelta()
    14. {
    15. // marshall the AS3 parameter into a C++ variable
    16. AS3::local::var mouseEvent;
    17. AS3_GetVarxxFromVar(mouseEvent, m);

    18. // now that we have it in C++ let's get a property on that object
    19. AS3::local::var propertyName = AS3::local::internal::new_String("delta");
    20. AS3::local::var outputValue = AS3::local::internal::getproperty(mouseEvent, propertyName);

    21. // convert the var to a scalar
    22. int output = AS3::local::internal::int_valueOf(outputValue);

    23. // return that scalar value
    24. AS3_Return(output);
    25. }


    26. ////
    27. //
    28. // Set a property on an ActionScript object in C++
    29. //
    30. ////

    31. void setDelta() __attribute__((used,
    32. annotate("as3import:flash.events.MouseEvent"),
    33. annotate("as3sig:public function setDelta(m:MouseEvent):void"),
    34. annotate("as3package:MyLibrary")));

    35. void setDelta()
    36. {
    37. // marshall the AS3 parameter into a C++ variable
    38. AS3::local::var mouseEvent;
    39. AS3_GetVarxxFromVar(mouseEvent, m);

    40. // now that we have it in C++ let's set a property on that object
    41. AS3::local::var propertyName = AS3::local::internal::new_String("delta");
    42. AS3::local::var newValue = AS3::local::internal::new_int(5);
    43. AS3::local::internal::setproperty(mouseEvent, propertyName, newValue);
    44. }


    45. ////
    46. //
    47. // Call a method of an ActionScript object in C++
    48. //
    49. ////

    50. void getString() __attribute__((used,
    51. annotate("as3import:flash.events.MouseEvent"),
    52. annotate("as3sig:public function getString(m:MouseEvent):String"),
    53. annotate("as3package:MyLibrary")));

    54. void getString()
    55. {
    56. // marshall the AS3 parameter into a C++ variable
    57. AS3::local::var mouseEvent;
    58. AS3_GetVarxxFromVar(mouseEvent, m);

    59. // demonstrate how to call a function of that object from C++
    60. AS3::local::var functionName = AS3::local::internal::new_String("toString");
    61. // first get the property of the object called "toString" which is a Function var
    62. AS3::local::var function = AS3::local::internal::getproperty(mouseEvent, functionName);

    63. // then call that Function object (in this case it takes no parameters)
    64. AS3::local::var output = AS3::local::internal::call(function, AS3::local::internal::_null, 0, NULL);

    65. // Since AS3_Return (as shown in getDelta()) can only accept a scalar value we need
    66. // to marshall this C++ object into an ActionScript String and return it using AS3_ReturnVar
    67. AS3_DeclareVar(asOutputString, String);
    68. AS3_CopyVarxxToVar(asOutputString, output);
    69. AS3_ReturnAS3Var(asOutputString);
    70. }

    71. int main()
    72. {
    73. // The SWC still needs a main() function.
    74. // See the code comments in samples/05_SWC for more details.
    75. AS3_GoAsync();
    76. }
    复制代码

    这里是一个ActionScript程序的示例,演示了如何调用从C++库编译过来的SWC中的方法:


    1. package {
    2. import flash.display.Sprite;
    3. import flash.text.TextField;
    4. import flash.events.Event;
    5. import flash.events.MouseEvent;
    6. import MyLibrary.CModule;

    7. public class demo extends Sprite {
    8. public function demo() {
    9. addEventListener(Event.ADDED_TO_STAGE, initCode);
    10. }

    11. private function initCode(e:Event):void {
    12. var tf:TextField = new TextField();
    13. addChild(tf);

    14. // start the FlasCC library
    15. MyLibrary.CModule.startAsync(this);

    16. // a sample ActionScript object
    17. var me:MouseEvent = new MouseEvent("click");

    18. //
    19. // Get a property
    20. //
    21. tf.appendText("delta=" + MyLibrary.getDelta(me) + "\n");

    22. //
    23. // Set a property
    24. //
    25. MyLibrary.setDelta(me);
    26. tf.appendText("delta=" + me.delta + "\n");

    27. //
    28. // Call a method
    29. //
    30. tf.appendText("toString=" + MyLibrary.getString(me) + "\n");

    31. }
    32. }
    33. }
    复制代码

    原文链接:http://blogs.adobe.com/flascc/2012/12/08/operating-on-actionscript-objects-in-c/

    评分

    参与人数 1金币 +8 收起 理由
    破晓 + 8 很给力!

    查看全部评分

    我是一个兵
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-20 18:25 , Processed in 0.048690 second(s), 32 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表