Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7278823
  • 博文数量: 512
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6857
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(512)

文章存档

2024年(2)

2022年(2)

2021年(6)

2020年(59)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: C/C++

2009-11-29 21:44:19

通过Flash和c++的交互来实现自己的桌面游戏

那种游戏最容易推广、接受人群最广泛,也最容易实现、效率最高?当然是flash.
那种高级语言最灵活,最具扩展性和兼容性,对系统的控制力最强?当然是c++。
如果flash 和c++ 结合起来开发游戏会是什么样子呢?当然具备以上的全部优点。
下面简单讲解一下最近实现的一个用C++做控制,用flash 做表现的桌面精灵。如果时间允许,我将在blog上全程介绍自己的开发进展。

1,如何在windows程序中播放flash?
首先创建一个vc项目,可以是win32程序,也可以是MFC。
然后加载shockwave flash object控件,在win32中可以使用如下方式进行加载:#import "c:\windows\system32\macromed\flash\flash9b.ocx"。如果采用这种方式来实现播放flash的效果将比 较复杂。而在MFC中则要简单的多,只要在你希望播放flash的窗口中添加flash 的ActiveX Control就可以了。然后给该控件关联一个对象,即会自动生成一个用于控制flash加载播放的类,类默认名为:CShockwaveflash1。 为了便于讲解,下面列出该类的部分代码。
class CShockwaveflash1 : public CWnd
{
     //开始是一些构造及初始化函数
     ……
     long get_TotalFrames()
     {
         long result;
         InvokeHelper(0x7c, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
         return result;
     }
void LoadMovie(long layer, LPCTSTR url)
     {
         static BYTE parms[] = VTS_I4 VTS_BSTR ;
         InvokeHelper(0x8e, DISPATCH_METHOD, VT_EMPTY, NULL, parms, layer, url);
     }
void Play()
     {
         InvokeHelper(0x70, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
     }
     void Stop()
     {
         InvokeHelper(0x71, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
     }
     void Back()
     {
         InvokeHelper(0x72, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
     }
……
}
可以看到,CShockwaveflash1主要是通过调用COM组件的方法来实现对flash的控制。播放flash的关键代码如下:
     CShockwaveflash1 m_FlashPlayer;
     m_FlashPlayer.LoadMovie(0, strFlashFileName);  //加载flash
     m_FlashPlayer.Play();                          //开始播放
2,如何与flash进行交互?
shockwave flash object控件有四个事件句柄(event handler)。分别是:
FSCommand, OnProgress, FlashCall, OnReadyState.其中,FSCommand就是flash就是给支持它的应用程序发送消息的手段。具体的事件函数如下:
//接受flash播放过程中的消息
void CFlashGameDlg::FSCommandShockwaveflash1(LPCTSTR command, LPCTSTR args)
{
     // TODO: Add your control notification handler code here
     if (strcmp(command, "WINDOWAPI") != 0)
     {
         //……
     }
     if( 0 == strcmp(command,"drag") )
     {        
         MessageBox("开始拖动窗口!");   
    }
}
从上面的代码中可以看到,flash完全是通过发送文本消息的方式给外部发送指令的。所以我们可以在写flash前预先定义好一系列命令名称,然后在 flash的关键帧或一些按钮点击响应中发送这些指令。外部根据接受到的指令做对应的响应。由此就达到了flash与应用程序的交互。除了利用 FSCommand外,shockwave flash object还提供了两个进行交互的函数,一个是CString GetVariable(LPCTSTR name),用来获得flash动画中变量name的值,该值以CString的形式返回给调用者;一个是void SetVariable(LPCTSTR name, LPCTSTR value),可以用来将flash动画中的name变量设置一个值value。但这种交互方式有比较高的耦合性,需要flash开发者及应用程序的开发 者有比较紧密的配合。但这种方式也可以一些交互性很强的flash.当然更多的是两种方式同时采用。因为这两种方法各有不同的使用背景。一般来说如果需要 对整个flash和应用程序的外部行为进行控制则采用FSCommand,而如果只是需要对flash的内部动作进行响应则使用GetVariable和 SetVariable。
阅读(3064) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~