FlasCC例子研究之Animation

上几个例子向我们展示了,如何在main()函数里用C++和AS3进行交互。 但是,如果我们想在C++中实现一些动画效果(循环播放的),怎么办呢? AS3是单线程的,所以,我们不可能说放一个while(true)在main函数里。因为这会把Flash Player的线程阻塞,所有的图像,声音和输入就都不能被处理了。

所以,我们需要组织我们的代码,然后每帧进行调用。 这就需要用到enter frame或者timer事件。 这个示例就替换了默认的console实现, 而增加了一个enter frame处理器,来调用函数。

 

例子中的console.as这个AS文件,是本例子的实现,FLASCC内部有一个默认实现,用于处理一些输出,比如printf等。 根据不同的需要,可以像本例一样,替换这个console.as文件。从而实现自己的功能。

 

打开Console.as,你可以在Console的构造函数中发现一个叫CMoulde.startAsync的函数。这是一个帮助函数,它会调用main函数。 在继续讲一些内容之前,需要注意以下两个特点

1、在main函数运行之前,所有的C++静态变量(基础类型)会先运行并初始化

2、而在main函数运行时,C++中的静态构造函数会运行。一些静态全局实例

 

上面的两点很重要,因为在使用FLASCC将代码编译为SWC库,或者想要驱动一个动画时,main函数在返回时,不能执行上面两种代码的析构函数。 为了防止析构执行,我们在main函数结尾处抛出一个AS3异常,通知AS3。

在GameOfLife.cpp最后一行,可以发现 AS3_GoAsync(); 这个调用,它就是干这个事情的。

 

在GameOfLife.cpp中,你会发现一个叫updateUniverse的函数,它被标记为了 extern “C”. 这个是防止C++编译器对它的名字进行改动(C++因为支持函数重载,所以会把函数名加上一些标记,标记为C函数后,则不会做此改动)。 这样,AS3代码想调用这个函数的时候,才能够在符号表中,通过名字正确地找到它。 (不过,下一个例子你可以使用另外的方式来控制C++代码向AS3导出的名字,也就是说,你可以自己指定一个名字)。

 

让我们回到Console.as,我们还可以发现一个叫frameBufferBlit的函数。 这个函数就是enter frame事件的处理函数,在这个函数里,使用了一个叫getPublicSymbol的函数。 用脚也能想到了,这个函数肯定是拿来查找C/C++函数的了。 果不其然,可以发现,它查找的正是前面说到的updateUniverse函数。

 

最后,简单总结一下,要在FLASCC中实现你自己的主循环,你需要做下面的事。

1、替换Console.as,改为一个带enter frame或者timer的版本。

2、在Console构造函数中使用startAsync函数,在main函数结尾使用AS3_GoAsync()

3、使用CModule帮助函数调用你的更新函数。

另外,这个例子也向我们展示了AS3代码和C++代码混编的方法。 参考04_Animation中的Makefile可以知道,需要结合编译,得先将AS3代码编译为abc,然后再使用 -symbol-abc 参数一起编译。

 

这个例子收获较多啊。上个图吧。以作纪念。

作者:码瘾少年·麒麟子 
出处:http://www.cnblogs.com/geniusalex/ 
蛮牛专栏:麒麟子 
简介:09年入行,喜欢游戏和编程,对3D游戏和引擎尤其感兴趣。 
版权声明:本文版权归作者和博客园共有,欢迎转载。转载必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/geniusalex/archive/2013/05/17/3082983.html

时间: 2024-09-02 22:01:33

FlasCC例子研究之Animation的相关文章

FlasCC例子研究之hellointerop

例子中的注释已经很详细了,我觉得逐行翻译一下,就完全可以体现出此例子的意义 #include <stdio.h>  #include <string.h>  #include "AS3/AS3.h"  //<-----大家注意这货,它提供了C++中调用AS3的方法 int main(int argc, char **argv)  {     /*        flascc使用GCC的inline asm语法来使你可以在C++编写和调用AS3代码.    

FlasCC例子研究之Drawing

这个例子主要是向大家展示 voronoi 图的绘制方法. Voronoi图,又叫泰森多边形或Dirichlet图,其具体介绍可以参见这里http://baike.baidu.com/view/501103.htm,这不是本例子的重点. 这个例子并没有向大家展示太多的东西,AS3相关的调用和C API的使用,也和先前没有太多区别. 唯 一不同的是,这个例子的voronoi图的生成,使用了C++ class. 也就是说,这个例子,让大家看到FlasCC对C++的支持.   下面的代码,是例子原生代码

FlasCC例子研究之c++interop

这个例子主要是向用户展示,如何通过FlasCC提供的API,来操作AS3中的运行时库. 包括stage,sprite等.   #include <vector>  #include <AS3/AS3.h>  #include <Flash++.h> Flash 11.4时提供了一个基于工作线程的并发模型.这使得多个工作线程几乎可以同时访问Flash的API,只有一个限制就是,多个工作线程的对象不可以相互传递.工作线程之间的通信必须通过一个特殊的机制MessageChan

FlasCC例子研究之HelloWorld

打开samples/01_HelloWorld,你会发现,只有一个hello.c和Makefile文件. 打开hello.c,你会更加吃惊,因为只有 #include <stdio.h> int main(int argc, char **argv) { printf("Hello World"); //这是我加上的,原文没有. return 0; }   这完全就是一个普普通通的C语言HELLO WORLD程序. 在程序中,夹杂着一段注释 // flascc comes

Mule 官方例子研究

一.编译导入Mule自带的例子 1.准备 安装Mule.这里就不介绍mule的安装了,请参考<Mule安装部署手册>. 2. 编译Mule自带例子中的Hello例子 使用命令行到目录:D:\app\mule3.1.1\examples\hello下,输入:mvn 即可.这里需要安装Maven: 3. 导入Eclipse工程 输入命令:mvn eclipse:eclipse 成功后,即可导入eclipse. 4.导入这个工程到eclipse (1)选择:File > Import (2)选

iOS开发:UIView的Animation效果

  所谓动画效果,就是会动的画,到iOS App中来说的话,就是各种UIView的移动. 想想看,如果我们自己来实现所有UIView的动画效果,需要考虑些什么东西呢? * 该UIView现在在哪儿? * 该UIView最后会动到哪儿? * 该UIView以什么样的方式移动到那儿? * 该动画持续多长时间? * 每次移动的最小时间间隔? * 每次最小时间间隔的移动的应该移动到哪儿? * -. 想想这是一个多么杀脑细胞的过程,尤其是每一次的动画过程都要重复这一折磨的过程. 还好,现实比想象的美好,

Android中轴旋转特效实现,制作别样的图片浏览器

Android API Demos中有很多非常Nice的例子,这些例子的代码都写的很出色,如果大家把API Demos中的 每个例子研究透了,那么恭喜你已经成为一个真正的Android高手了.这也算是给一些比较迷茫的Android开 发者一个指出了一个提升自我能力的方向吧.API Demos中的例子众多,今天我们就来模仿其中一个3D变换的 特效,来实现一种别样的图片浏览器. 既然是做中轴旋转的特效,那么肯定就要用到3D变换的功能. 在Android中如果想要实现3D效果一般有两种选择,一是使用O

webview-通过后台传的坐标可以实现webvi网页那种效果吗?

问题描述 通过后台传的坐标可以实现webvi网页那种效果吗? 通过后台传送每个模块的具体坐标,可以实现像webview加载网页端的形式吗?如果可以怎么实现?(具体说明一下或帮忙写个例子研究一下).欢迎大神们来解答.... 解决方案 ????没明白意思,使用android布局实现吗?如果是的话就用动态布局的方法做,在程序中拼接界面 解决方案二: 你是指碎片化布局吗,用fragment组成一个主要布局,就能实现你说的效果. 解决方案三: 可以的.你把每个控件先写好,可以wrapcontent.然后动

小议主子表INT自增主键插入记录的方法

插入    主子表最常见的大概就是用在进销存.MRP.ERP里面,比如一张销售订单,订单Order(ID,OrderDate),订单明细OrderDetail(OrderID, ProductID, Num,Price)这个大概就是最简单的主子表了,两个表通过ID与OrderID建立关联,这里主键ID是自增的INT类型,OrderID是表OrderDetail的外键.当然,键的选择方法很多,现在我们选择的是在sql里面最简单的方法.    对于这样的表结构,我们最常见的问题就是保存的时候怎样处理