[转]通过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。