トップページ > 過去ログ > 記事閲覧
ゲーム上でのFLASHムービーの再生
名前:蒼熊 日時: 2010/06/11 15:25

DXライブラリを用いた状態で試行錯誤し、FLASHムービーを再生することが出来ました。 ttp://www1.axfc.net/uploader/Sc/so/122714.zip(プロジェクト) ttp://codepad.org/u9ZXWURQ(コード) FLASHのストップを察知し、自動的にウィンドウを隠すようにしています。 が、問題点は幾つかあり、 ・DestroyWindowやPostMessage等でFLASHのウインドウを閉じようとすると、メインのウインドウまで閉じてしまう ・メインウインドウの動きに追従しない ・Win32APIやATLに関してほとんど分かっていないので、きちんとしたコードになっているかどうかが分からない といったものが挙げられます。 願わくばこれを ・上の機能を満たすものにしてほしい ・DXライブラリに最適化してほしい と思うのですが、何方か可能でしょうか。 二番目は管理人さんにしか不可、或いはDXライブラリに直接組み込まないと不可、という可能性もありますが……。 宜しくお願いします。

Page: 1 |

Re: ゲーム上でのFLASHムービーの再生 ( No.1 )
名前:管理人 日時:2010/06/13 03:35

うぉー新鮮ですね 私もWin32APIを熟知しているとは言えずATLに関しても全く知識が無いのであんまりお力になることは できそうにありませんが、とりあえず蒼熊さんが挙げられた問題点を解消することはできましたので その方法をお伝えします ・DestroyWindowやPostMessage等でFLASHのウインドウを閉じようとすると、メインのウインドウまで閉じてしまう  OnDestroy で 呼んでいる PostQuitMessage(0); をコメントアウトすると閉じなくなります  PostQuitMessage(0); はソフトを終了することに呼ぶAPIですのでここで呼ばなくても大丈夫です ・メインウインドウの動きに追従しない  Create(GetMainWindowHandle(), cRect, NULL, WS_POPUP | WS_VISIBLE);  上記部分の WS_POPUP を WS_CHILD にすると追従するようになります、でもそうするとFlashウインドウの原点が メインウインドウのクライアント領域左上端になりますので、cRectの内容も GetWindowCRect を呼んだ後から Create を呼ぶ間に以下の処理をして原点からウインドウの幅分だけの矩形情報にする必要があります cRect.right -= cRect.left; cRect.bottom -= cRect.top; cRect.left = 0; cRect.top = 0;  あと、メインウインドウの子ウインドウにした場合は ScreenFlip をすると Flash の映像と競合して画面が チカチカしてしまうので、swfを再生中は ScreenFlip をしないようにする必要があります ・Win32APIやATLに関してほとんど分かっていないので、きちんとしたコードになっているかどうかが分からない  すいません、私にもわかりません(汗) 上記変更を加えさせていただいた main.cpp は以下の通りです よろしければお試し下さい #include "DxLib.h" #include <atlbase.h> #include <atlwin.h> #import "c:\WINDOWS\system32\macromed\flash\Flash10e.ocx" rename_namespace("Flash") named_guids CComModule _Module; class c_FlashW : public CWindowImpl<c_FlashW,CAxWindow> { public: DECLARE_WND_SUPERCLASS("c_FlashW", CAxWindow::GetWndClassName()); CComPtr<Flash::IShockwaveFlash> m_cFla; c_FlashW() { }; virtual ~c_FlashW() { }; // ウインドウ生成 HWND Create() { AtlAxWinInit(); RECT cRect; GetWindowCRect(&cRect); cRect.right -= cRect.left; cRect.bottom -= cRect.top; cRect.left = 0; cRect.top = 0; CWindowImpl<c_FlashW, CAxWindow>:: Create(GetMainWindowHandle(), cRect, NULL, WS_CHILD | WS_VISIBLE); if (m_hWnd) { // Flash OCX 読み出し LPOLESTR clsid = NULL; StringFromCLSID(Flash::CLSID_ShockwaveFlash, &clsid); CreateControl(clsid); CoTaskMemFree(clsid); HRESULT hRes = QueryControl(&m_cFla); m_cFla->Menu=false; } return m_hWnd; } // メッセージハンドラの列挙 BEGIN_MSG_MAP(c_FlashW) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) END_MSG_MAP() LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL&){ // PostQuitMessage(0); return 0; } void Movie(LPCTSTR AddrBuf){ if(m_cFla){ char addr[256]; GetCurrentDirectory(256,addr); sprintf_s(addr,256,"%s%s%s",addr,"\\",AddrBuf); m_cFla->put_Movie(CComBSTR(addr)); } } void Play(){ if(m_cFla) m_cFla->Play(); } void Stop(){ if(m_cFla) m_cFla->Stop(); } int IsPlay() { if(m_cFla) return m_cFla->IsPlaying(); else return 0; } }; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { // COMモジュール初期化 _Module.Init(NULL, hInstance); ChangeWindowMode( TRUE ); SetAlwaysRunFlag( TRUE ); if(DxLib_Init()==-1||SetDrawScreen(DX_SCREEN_BACK)!=0) return -1; // 初期化 printfDx("Press Any Key to Load Flash Movie\n"); ScreenFlip(); WaitKey(); c_FlashW flash; HWND FlashWnd = flash.Create(); SetActiveWindow(GetMainWindowHandle()); // ファイル指定(同時に再生がはじまる) flash.Movie("testvc.swf"); flash.Play(); while(!ProcessMessage()&&!CheckHitKey(KEY_INPUT_ESCAPE)) { if (!flash.IsPlay()) break; } printfDx("Movie End."); ShowWindow(FlashWnd,SW_HIDE); DestroyWindow(FlashWnd); ScreenFlip(); WaitKey(); _Module.Term(); DxLib_End(); return 0; } 因みに再生するだけでしたら一見する限りでは機能的には現状で十分だと思います DXライブラリに組み込むとなると大作業過ぎますので、今のところ予定はありません ( というか、こんな風にFlashを再生できるということを今日知ったばかりなので予定は未定という感じです・・・ )
Re: ゲーム上でのFLASHムービーの再生 ( No.2 )
名前:蒼熊 日時:2010/06/13 10:13

ありがとうございます、早速試した所上手くいきました! お忙しいところ時間を割いていただき誠に感謝いたします。 #割とコードは短いですが動画再生の拡張としては作業量が多いですし、いつどこで何とぶつかるか分からないので怖いですね…… #importが環境依存というのも若干難しいかもしれません(Flash10がないとコンパイル出来ない)
Re: ゲーム上でのFLASHムービーの再生 ( No.3 )
名前:蒼熊 日時:2010/06/13 17:34

ttp://www1.axfc.net/uploader/Sc/so/123430.zip 一応更に若干弄って整頓したものを載せておきます CFLASHのオブジェクトを作り適当に関数を実行するだけで動作するようになっています。
Re: ゲーム上でのFLASHムービーの再生 ( No.4 )
名前:ファルチェ 日時:2010/08/03 17:49

webデザイナーなので非常に面白い事されていると 思いました。 >蒼熊さん 良ければ使わせていただいて宜しいでしょうか? --- Flash10が無いとコンパイルだけでなく、 実行もこのままではヤバイって問題がありそうです。 ocxを呼び出せない場合(Flashが入ってない)以外にVerが違う場合もエラーって出る場合があります。 (古いとかFlash内部が変化したとか… Flashをインストしたブラウザによってはocxが入らない場合もあるそうです) Flashが入ってない場合やFlashを呼び出せない(初期化できない場合?)は m_cFla->Menu=false; あたりで不正エラーを吐いて落ちるようですので エラー判定を作ってあげるのが優しそうですね。 また、swfが読み込めない場合もエラーを吐くのでその辺りも… この辺りを解決しないといざFlashでカッコいいムービー画面!って時にエラーが出るという悲しい事態になりそうです。
Re: ゲーム上でのFLASHムービーの再生 ( No.5 )
名前:蒼熊 日時:2010/08/08 00:11

>良ければ使わせていただいて宜しいでしょうか? 勿論構いません。自由に流用して下さい。 エラー云々は難しそうですね…… 仕様がどのようになってるのか分かりませんが、新しいFlashPlayerが出た時点でムービーが全て見れなくなる、とかだと非常に困りそうです。 最新FlashPlayerが必須なだけならそれを促すと共にエラー処理をきちんとすると何とかなると思いますが……!

Page: 1 |