全部博文(512)
分类: C/C++
2009-11-29 21:44:19
那种游戏最容易推广、接受人群最广泛,也最容易实现、效率最高?当然是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。 |