几个月前公司准备将我们的UI系统从CEGUI换到Scaleform上,因此我也积累了些Scaleform结合C++编程的经验,在这里简单记录一下。

Scaleform实现了用硬件加速渲染flash的功能,利用flash的强大功能可以使游戏的界面看起来更酷炫一些。对于程序员来说,我最关心的就是Scaleform如何跟C/C++通讯。

从编程角度来讲Scalefrom和C/C++通讯还是比较简单的,其实就是C/C++和ActionScript的通讯。Scaleform已经提供了一些简便的接口让我们来使用。在AS中可以用fscommand或者ExternalInterface发出一个事件,这个事件包含了一个字符串和参数。字符串表示事件的名字,其实就是被调用C函数的名字,参数可以是多个。当Scaleform收到这样的事件后会通过callback的方式通知C/C++,在这个callback里包含了AS发出的字符串和参数。我们可以在这个callback里根据字符串调用相应的C函数。因此注册一个C函数给AS用,其实就是将函数名和函数地址存储在一个map里,等到收到Scaleform的通知(callback)时再查询map找到对应的C函数地址,然后调用之。这里跟C和lua的通讯不一样,lua是自身管理注册的C函数。

因此我为我们的UI管理模块设计的二个接口如下:

void RegsiterASFunc(const char* szFuncName, AS_FUNCTION pFunc);

void CallASFunc(const char* szFuncName,Variant* pRetValue);

这里的AS_FUNCTION是一个函数类型,用于给AS调用的C函数原型,声明如下:

typedef void (*AS_FUNCTION)(as_State*)

其中的as_State是我模仿着Lua的lua_State来处理C++和AS之间函数调用时参数传递问题的。其定义如下:

structas_State{

Variant* pArgs;

Int        nArgs;

Variant Return;

}

其中的pArgs代表C函数的所需的参数列表,即AS传出来的参数,nArgs表示参数个数。和Lua一样你无法保证参数的正确性。Return表示C函数的返回值,用于返回给AS用。可以调用GFxMovieView对象的SetExternalInterfaceRetVal来通知AS这个返回值。Variant是封装不同原始类型为同一个对象,其实就是一个union,不懂的同学可以google。CallASFunc用于调用一个AS函数,pRetValue用于接收这个AS函数的返回值,内部是调用GFxMovieView的InvokeArgs来调用AS函数。

这里还有一个要注意的问题,以往我们在C里调用Lua函数往往是全局的lua函数,但是在flash里一个函数是属于某个影片的,即一个swf文件的。因此调用一个AS函数需要指明是那个swf文件中的,Scaleform用GFxMovieView来表示一个正在播放的影片,对AS的调用也是通过GFxMovieView的方法来实现的。

转载于:https://www.cnblogs.com/jisujun/archive/2010/08/11/Scalform_CPP.html

Scaleform结合C++编程相关推荐

  1. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  2. 游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  3. Unity中的GUI编程

    原文地址 在这篇文章中我将给读者介绍Unity中的图形用户界面(GUI)编程.Unity有一个非常强大的GUI脚本API.它允许你使用脚本快速创建简单的菜单和GUI. 简介 Unity提供了使用脚本创 ...

  4. C++核心编程(一)

    C++ 核心编程 本系类列博客都是根据黑马的C++视频做的笔记. 本阶段主要针对C++面向对象编程技术做详细记录,探讨C++中的核心和精髓. 1.内存分区模型 C++程序在执行时,将内存大方向划分为4 ...

  5. 【Spring】面向切面编程AOP

    AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...

  6. python编程问题--第二次

    本质上grp 是一个dataframe 后面接一个[] 得到 series 两个[] 得到dataframe Groupby 如果后面放as_index=False 后面就能连续添加了 不加的话  同 ...

  7. OpenCL编程详细解析与实例

    OpenCL编程详细解析与实例 C语言与OpenCL的编程示例比较 参考链接: https://www.zhihu.com/people/wujianming_110117/posts 先以图像旋转的 ...

  8. C语言与OpenCL的编程示例比较

    C语言与OpenCL的编程示例比较 OpenCL支持数据并行,任务并行编程,同时支持两种模式的混合.对于同步 OpenCL支持同一工作组内工作项的同步和命令队列中处于同一个上下文中的 命令的同步. 在 ...

  9. LLVM一些编程语法语义特性

    LLVM一些编程语法语义特性 High Level Structure Module Structure LLVM 程序由Module's组成,每个 's 是输入程序的一个翻译单元.每个模块由函数.全 ...

最新文章

  1. Unity5.6+ 导出Android 应用程序apk的环境配置及导出过程
  2. 单片机是否为嵌入式技术,单片机和嵌入式学哪个?
  3. Spring cloud整合zookeeper
  4. 解决MVN install一直处于下载jar包等待问题
  5. jquery实现单击div切换背景,再次单击回到原来样式
  6. 应用HttpWebRequest接收post或get数据
  7. Android深入理解Fragment
  8. [Luogu 3835]【模板】可持久化平衡树
  9. 计算机管理 没有适当的权限,提示没有合适的权限访问怎么办
  10. java十进制转换成二进制数
  11. 工具解析:杀毒引擎惨遭打脸,黑帽大会爆惊天免杀工具
  12. mac地址被路由器拉黑_我买了一个新路由器,告诉我我被黑了
  13. oracle超级管理员忘记_Oracle 管理员账号密码忘记的快速解决方法
  14. Android开发随手记1
  15. 手撸一个Switch开关组件
  16. SAP_FICO常用事务代码
  17. 计算机毕业设计Python+uniapp“宠到家”宠物领养小程序(小程序+源码+LW)
  18. 牛客网刷题-java
  19. IOS之数据持久化二(归档与反归档)
  20. 37所国家示范性软件学院

热门文章

  1. Wireshark抓包rtmp
  2. 卷积核权值初始化_CNN怎么自定义卷积核初始值?
  3. 史蒂夫·乔布斯语录(Steve Jobs Quotes)
  4. 京东数科金融科技生态揭开面纱 百亿翱翔计划正式官宣
  5. 资深架构师教你一篇文看懂Hadoop
  6. c语言中的beep函数,c++ Beep函数
  7. Linux内核错误(引导系统)Deepin用户手册在/etc/sysctl.conf文件中加入kernel.panic = 20,在/etc/sysctl.conf中kernel.sysrq=1内存
  8. python3学习六字符串和文本
  9. 计算机属性资源管理器已停止工作,电脑开机黑屏并弹出Windows 资源管理器已停止工作该怎么办?...
  10. EXCEL:Excel2007中的数据分析工具在哪里?