ムービーグラフィックの動画の再生について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
白雪

ムービーグラフィックの動画の再生について

#1

投稿記事 by 白雪 » 1年前

ノベル風ゲームを作っており、一部音付きの動画を入れたいと考えています。流れとしては『文章→数秒の動画→文章』と言う風に、カットイン?的な風を考えています。またOP的な物も入れる予定です。
動画ですが、クリックすればスキップできるように設計しています。
動画再生はリファレンスページにあった PlayMovieToGraph とそのサンプルコードを改造したもの使っているのですが、再生している動画が終了しても次に進まず止まったままです。ただクリックすれば次に進んでくれます。

・質問・
何も(クリック)せずに動画の再生が終われば自動的に次に進むようにしたいのですが、方法としては時間経過で次の処理に進むようにするしかないのでしょうか?
動画の再生状態を得る(GetMovieStateToGraph)のは停止中か再生かであって、終了とは関係なさそうで……

一応、現在実験しているコードを載せておきます。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);;;

    SetGraphMode(1280, 720, 32);

    int MovieGraphHandle;

    if (DxLib_Init() == -1) { return -1; }//DIRECT X初期化

      // ムービーファイルをロードします。
    MovieGraphHandle = LoadGraph("aaa.mp4");

     // ムービーを再生状態にします
    PlayMovieToGraph(MovieGraphHandle);

   while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

       if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { //クリック検知
       
           DeleteGraph(MovieGraphHandle);
         
        //実験のため処理終了すれば次に進んだと仮定。
           DxLib_End();
         
       }
       else {
       
           // ムービー映像を画面いっぱいに描画します
           DrawExtendGraph(0, 0, 1280, 720, MovieGraphHandle, FALSE);
           // ウエイトをかけます、あまり速く描画すると画面がちらつくからです
           WaitTimer(17);

       }

       ScreenFlip();

    }

   // 読み込んだムービーファイルのグラフィックハンドルの削除
   DeleteGraph(MovieGraphHandle);

    DxLib_End();        // DXライブラリ使用の終了処理

    return 0;        // ソフトの終了
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ムービーグラフィックの動画の再生について

#2

投稿記事 by みけCAT » 1年前

白雪 さんが書きました:
1年前
動画の再生状態を得る(GetMovieStateToGraph)のは停止中か再生かであって、終了とは関係なさそうで……
なぜそう考えるのですか?
GetMovieStateToGraph 関数の説明を見ると、
もし0が返ってきたら停止中、1なら再生中となります。
 因みに動画の再生が終了するか PauseMovieGraph 関数で再生に ポーズを掛けると停止中となります。
と書かれており、停止中かどうか(かつポーズをしていないか)で動画の再生が終了したかを判定できることがわかります。

さらに、PlayMovieToGraph 関数の説明に載っているサンプルコードを見ると、

コード:

    // ループ、GetMovieStateToGraph 関数はムービーの再生状態を得る関数です
    // 戻り値が1の間は再生状態ですのでループを続けます
となっており、GetMovieStateToGraph 関数でムービーが再生中かを判定していることがわかります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

白雪

Re: ムービーグラフィックの動画の再生について

#3

投稿記事 by 白雪 » 1年前

ご返信ありがとうございます。
すいません。私自身いくつか勘違いをしていました。
動画の再生状態を得る(GetMovieStateToGraph)のは停止中か再生かであって、終了とは関係なさそうで……
こう考えた訳は、動画の再生が終了すれば停止中扱いとなるということをしっかり読んでおらず、勝手に違う解釈をしていました。その解釈と言うのが、『動画が最後まで流れる』ということと『動画の再生が停止』は別物であるということ。そもそもこの解釈が違ったため勘違いを起こしていました。

コードを変更しGetMovieStateToGraphを使ったところ、無事に目的の動作になりました。(ここから本番用のコードに持って行きます。)
ありがとうございました。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);;;
    SetGraphMode(1280, 720, 32);
    int MovieGraphHandle;
    if (DxLib_Init() == -1) { return -1; }//DIRECT X初期化
      // ムービーファイルをロードします。
    MovieGraphHandle = LoadGraph("frame.mp4");
     // ムービーを再生状態にします
    PlayMovieToGraph(MovieGraphHandle);

   while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
       // ムービー映像を画面いっぱいに描画します
       DrawExtendGraph(0, 0, 1280, 720, MovieGraphHandle, FALSE);
       // ウエイトをかけます、あまり速く描画すると画面がちらつくからです
       WaitTimer(17);

       if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) { //クリック検知
        //   PauseMovieToGraph(MovieGraphHandle);
           DeleteGraph(MovieGraphHandle);
           //  DxLib_End();
       }
       else if (GetMovieStateToGraph(MovieGraphHandle) == 0)
       {
               DxLib_End;
               return 0;        // ソフトの終了
       }
       ScreenFlip();
    }
   // 読み込んだムービーファイルのグラフィックハンドルの削除
  // DeleteGraph(MovieGraphHandle);
    DxLib_End();        // DXライブラリ使用の終了処理
    return 0;        // ソフトの終了
}

返信

“C言語何でも質問掲示板” へ戻る