動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

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

動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

#1

投稿記事 by KLM06 » 14年前

どうも、はじめまして。KLM06です。

タイトルどおりのプログラムを作成しましたが、とまってしまい終了しません。
どこを修正・追加したら、いいでしょうか?

#include "DxLib.h"

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

if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}

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

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

// 描画先の画面を裏画面に
SetDrawScreen( DX_SCREEN_BACK ) ;

// ループ、GetMovieStateToGraph 関数はムービーの再生状態を得る関数です
// 戻り値が1の間は再生状態ですのでループを続けます
while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle ) == 1 && CheckHitKeyAll()==0 )
{
// ムービー映像を画面いっぱいに描画します
DrawExtendGraph( 0 , 0 , 640 , 480 , MovieGraphHandle , FALSE ) ;

// 画面左上に再生時間を描画します
// DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Time:%d", TellMovieToGraph( MovieGraphHandle ) ) ;
//------------------------------
if (ProcessMessage()==-1) break;
//-------------------------------
// 裏画面の内容を表画面に反映します
ScreenFlip() ;
}
WaitKey();

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

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

みけCAT

Re:動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

#2

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

WaitKey();があるから止まるのではないのですか?
もう一度キーを押してみたらどうなりますか?

みけCAT

Re:動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

#3

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

while文の条件の中でProcessMessage()しているので、
ループの中のProcessMessage()は要らなくないですか?

KLM06

Re:動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

#4

投稿記事 by KLM06 » 14年前

返信どうもです。

ProcessMessage()とWaitKey()をはずしても、止まってしまい、パソコンの電源を押して、再起動になって
しまいます。

開発環境の問題なのでしょうか?

私の開発環境
WinXp+SP2
VC++2008Express
DXライブラリ3_04b

ゆーずぃ

Re:動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

#5

投稿記事 by ゆーずぃ » 14年前

開発環境は関係ないです。

まず、DxLib_End();の行にブレークポイントを設定してデバッグして下さい。
もしもそこまでいかずに止まってしまうようであれば、メインループが問題です。While(省略)の行にブレークポイントを設定してデバッグして下さい。
ここでいつまで経ってもループに戻ってこなければ途中に入っている処理が問題です。何故終わらないのかを三日三晩悩み続けましょう。

もしもWhileループを無事に回っていることが確認出来れば下を参考にして下さい。

さて、この質問はキーを押したら終了させたいだけなんですよね。

でしたら、GetHitKeyStateAll関数を使って下さい。
メインループに入る前にキー入力バッファを用意して、それをGetHitKeyStateAll関数に渡して下さい。その上でループ判定部のCheckHitKeyAll()==0をGetHitKeyStateAll関数に変えればいいです。
ここでGetHitKeyStateAll関数をお勧めするのは個人的な趣向ですのでどっちがいいかはお任せします。だって何でも適当なキーを押した瞬間に終了って何か気持ち悪くないですか?Escで終了とか、Spaceで終了とかの方が後々を考えるといい気がします。
ということでこんな感じっていう例を
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{ 
    /*前処理 省略*/
    char key[256];

    while( ProcessMessage() == 0 && GetMovieStateToGraph( MovieGraphHandle ) == 1 && GetHitKeyStateAll(key) == 0 && key[KEY_INPUT_ESCAPE] == 0 )//Escキーで終了
    { 
        /*処理省略*/
これならばEscキーを押された瞬間に終了します。Escキーが気に入らなければ[KEY_INPUT_ESCAPE]の部分をお好きなキーに変更して下さい。

ちなみに、止まってしまった場合は、コード編集画面をアクティブにした状態でshift+F5を押して下さい。もしくはCtrl+Alt+DeleteでタスクマネージャーからVC++を落とせばいいと思います。でも後者はせっかく長々と編集したソースが保存されない可能性があるのでお勧めしません。

それでとりあえずパソコンを無理やり落とすことが無くなると思います。電源ボタン長押しを何度もやるとHDDのクラッシュや、OSのブルースクリーン召喚で死にたくなります。

KLM06

Re:動画ファイルの再生したら、途中で、キーを押したら、終了させたいです。

#6

投稿記事 by KLM06 » 14年前

> さて、この質問はキーを押したら終了させたいだけなんですよね。

そうです。

ゆーずぃさん・おかげさまで、解決できました。ありがとうございました。

閉鎖

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