トップページ > 記事閲覧
gif動画をスムーズに再生するために背景で、バッググランドで再生したい!
名前:マーク42 日時: 2020/06/01 15:18

いつもお世話になっております。 制作しているゲームの会話画面をgif動画で作りたいと考え、実際にフリーソフトで作った後で 以下の関数を使って再生しました。 PlayMovieToGraph(kaiwaHandle); DrawExtendGraph(0, 0, 100, 180, kaiwaHandle, FALSE); 正しく描画されたのですが、少し問題があります。 本来数フレーム経ってから言葉がうっすらとスライドしながらでるように作ったのですが、 なぜか既に言葉が表示されてしまいかつ、gif動画の処理だけが重くgif動画のように再生されませんでした。 そこで質問なのですが、BGMの処理を行う際に重くならないようにバッググランドで再生して処理を軽くする関数などのように gif動画を背景というかバッググランドとして再生することはできないでしょうか? 一応、実行する際にエヌビディアのGPUを使い高パフォーマンスで実行しようとしても同じような感じになってしまい 何が原因かわかりません。 どうかよろしくお願いいたします。
メンテ

Page: 1 | 2 |

Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.7 )
名前:マーク42 日時:2020/06/02 17:44

すいません、名前を間違えていました。 正しくは どうもありがとうございます。でぃあぶろさん。 >>後々の人が似たような文言で検索したときに有意義なものになるよう,解決しているのであればどのように解決したのか, どういったことが原因でうまくいかなかったのか,など何か知見を残していきませんか? 何と言うか,誰も幸せになっていないような気がしてなりません. いいえ、解答してくださるプログラマの方やこれからプログラムを作る人も私ほど出来の悪い人間ではないので、誰かの幸せになることは少ないと思います。 ですが、解答してくださった方への対応として解決したことと解決方法をお伝えすることは礼儀として当然でした。 無礼を働きすいませんでした。またこんな出来の悪い私に親切に対応してくださり感謝します。 //dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4856 //dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4836 において今更で恐縮ですが解決方の回答をさせていただきました。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.8 )
名前:マーク42 日時:2020/06/02 18:01

>>>TellMovieToGraphの関数をどのように使えば、どのように書けばちゃんと最初から動画が実行されるのでしょうか? TellMovieToGraph()は動画の再生位置を取得する関数です.動画の再生位置がミリ秒単位で取得できます。 YouTubeでも何でもいいですけど,動画のシークバーみたいなものです.今何分何秒の再生位置です.って教えてくれる関数です. なので例えば1分45秒になったら字幕を流す,とか効果音を再生する,とかそういう風に使うんだと思います. 正しく動画が再生されていない(と思われる)時に解決策を与えてくれるような関数ではないと思います. 正しく理解できていなかったようで申し訳ありません。 わたしは再生時間をTellMovieToGraphの関数から得た後に、その再生時間を0にして、 最初から動画を再生できないのかなと考えていました。ですがそういう使い方はできないというか そういう使い方のための関数ではないと理解できました。 あくまでどこまで再生されたかの位置をしるだけと理解しました。ありがとうございます。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.9 )
名前:あいおい? 日時:2020/06/02 22:52

1. GIF動画自体は正常なものですか 2. GIF動画のFPS、再生速度は正しいですか 3. GIF動画を再生してから、実際に描画するまでの処理に時間が掛かりすぎていませんか 4. 動画の再生位置を変更するには SeekMovieToGraph ( int Graph, int TimeMs ) を使用します
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.10 )
名前:マーク42 日時:2020/06/03 11:00

ありがとうございます!あいおい?さんの解説を基にいくつかのサイトを調べ、 //dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=3526で私と似たようなことをしている方がいたのでソースを拝見させていただきました。 そのソースを基に今作っているプログラムを修正しました。しかし、なぜかうまくいきません。 修正後はタイトル画面からはじめからを押すと赤いノイズの画面が出た後にFOCK YOU!DEAD YOU!とアニメ―ションを加えて出てくるのですが うまくいくときもあれば、再生位置が0ではなく、文字が既に出てしまっているところから始まるなどうまく動作していないことがわかりました。 メインソースのtest2.cppに以下のソースを加え。 // ファイルをロードします。 kaiwaHandle = LoadGraph("MOSHED-2020-6-2-19-11-5.gif");//あるいはOpenMovieToGraph("MOSHED-2020-6-2-19-11-5.gif") SeekMovieToGraph(kaiwaHandle, 0); PlayMovieToGraph(kaiwaHandle); talk.hを以下のように編集しました。 if (talk == 0) { sound4 = LoadSoundMem("Rotary_Phone-Ringtone01-1.mp3"); ChangeVolumeSoundMem(140, sound4);//この関数によって音声のボリュームを設定できる。 // ファイルをロードします。 DrawExtendGraph(0, 0, 640, 480, kaiwaHandle, FALSE); // イメージの描画 PlaySoundMem(sound4, DX_PLAYTYPE_BACK,TRUE); if (Pad[PAD_2] == 1) { talk = 1; } } ちなみに、参考にさせていただいたプログラムの方でGIF動画を再生したところ実行するたびにちゃんと最初から再生されました。 開発環境はWindows10、visual studio 2019です。 こちらがプログラムです。 //37.gigafile.nu/0610-d833d1ffe0f4d3ecbc0c25333215dcaca こちらが作ったGIF動画です。 twitter.com/OnslaughtA/status/1267998438332919808
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.11 )
名前:このライブラリ知らない人 日時:2020/06/03 19:27

> talk.hを以下のように編集しました .h にそのコード書いてるんすか? まぁ「ご本人がちゃんとその正当性を把握しているなら何も問題無い」とも言えますが, このような場で他者と情報をやりとりするならば 一般的な感じでやっといた方が良いように思います. ちょっと変わったことをあえてやっている(?)のを何の断りも無くさらっと書いちゃうと 読んだ側は余計な不安を感じると思うので.
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.12 )
名前:あいおい? 日時:2020/06/03 22:14

自作のプログラムを提出するのではなく、「最小のコードで不具合、問題が再現できる」ものを提出していただけると、より正確に、より早く回答ができるかとおもいます。 GIF動画を読んで再生するプログラムを No.2のレスのように組んで動くかどうか確認してください ※ 重ねていいますが、動画を読み込んで再生の関数を呼び出してから、実際に描画するまでの関数を呼び出すまでに、どのくらいの時間掛かるかを計測してください もしくは、適当なキーを押したら再生を開始するようなプログラムを組んで、動画の初期化処理で時間が掛かってるのか、それ以外の原因かを切り分けしてください。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.13 )
名前:マーク42 日時:2020/06/04 16:20

すいません。短いように作ろうとした際にあいおいさん?のアドバイスのおかげで最初から再生されるようにできました。 以下のようにキーを押してtalkの変数が2になった際にPlayMovieToGraph(kaiwaHandle);が呼びだれてるようにしました。 if (talk == 2) { PlayMovieToGraph(kaiwaHandle); ++enemytalk; DrawExtendGraph(0, 0, 640, 480, kaiwaHandle, FALSE); // 画面左上に再生時間を描画します DrawFormatString(0, 0, GetColor(255, 255, 255), "Time:%d", TellMovieToGraph(kaiwaHandle)); } ムービーを考慮すると処理が重くなる問題については ClearDrawScreen()とScreenFlip() == 0を消して、ProcessMessage() == 0のみにしたところ処理が通常に戻りました。 しかし、別の問題が発生しました。 enemytalkが100になったら動画の再生を停止できるようにint PauseMovieToGraph( int GraphHandle ) ;を使いましたが 100になっても停止せずにずっと再生しています。 短いソースにしたので見ていただけるとありがたいです。 gif動画を二つ使用しますので適当なgif動画を使って頂けるとありがたいです。 ソースです。 27.gigafile.nu/0611-b41d4fbf5c2380d0e04797d9e1c2d8c60
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.14 )
名前:あいおい? 日時:2020/06/04 23:04

最小のコードと言いながらどうして既存のプロジェクトをアップロードするのでしょうか……? それにGIF動画に問題がある可能性も否定できないのに、どうして添付しないのでしょうか……? 自分のゲームに組み込む前に、問題が再現できる最小のコードを作ってください > ムービーを考慮すると処理が重くなる問題については ClearDrawScreen()とScreenFlip() == 0を消して、ProcessMessage() == 0のみにしたところ処理が通常に戻りました。 なぜそれを行ったのか理解できかねますが、挙動が不安定になる可能性もあるのでサンプルに従ってください > enemytalkが100になったら動画の再生を停止できるようにint PauseMovieToGraph( int GraphHandle ) ;を使いましたが test2.cppを見る限りPause〜ではなくPlay〜を使ってるように見えますが 間違っていませんか?
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.15 )
名前:このライブラリ知らない人 日時:2020/06/05 11:31

> しかし、別の問題が発生しました。 > enemytalkが100になったら…どうのこうの… これは当初の話と関係ない(あなたが新たに作り出したあなたのロジック特有のバグである)のではないかと見えるので, 別件として区切った方がよくないですか? で,当初の問題が解決したのであれば, ・原因は何だったのか? (どのようなことを行って,それを突き止めたのか) ・【その原因を踏まえた対策】はどのような事柄となったのか? ・その対策は完全にうまく機能したのか? という話を纏めるべきでしょう. 現状,外野からは, 「いきあたりばったりにコードいじくってたら当初と違う動きになったから解決したかのように見えている  (且つ,てきとーにいじっくたせいで新たなバグが発生中)」 という流れにしか見えないので.
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.16 )
名前:マーク42 日時:2020/06/06 11:08

すいません。先にClearDrawScreen()とScreenFlip() == 0を消した理由だけ書かせていただきます。 ClearDrawScreen()とScreenFlip()は既にtest.cppとstgae1Player_Update.hにそれぞれ書いていたためwhileに追加していた際には二重になるため 処理が重くなってしまっていたのではないかと考えています。なのでwhileに追加してあったため、サンプルなどを見ましたが ClearDrawScreen()とScreenFlip()をwhieの()の中に書いていることがないため消しました。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.17 )
名前:あいおい? 日時:2020/06/07 02:08

C言語においてヘッダファイルで関数の実体を書くのは正しい実装じゃないと思いますが……
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.18 )
名前:このライブラリ知らない人 日時:2020/06/08 11:02

> C言語においてヘッダファイルで関数の実体を書くのは正しい実装じゃないと思いますが…… そんなことはないです. そのヘッダがincludeによってコピペされた結果がまともな形になるならば 「正しい(まともにコンパイルできて想定通りの動作をするコードである,という意味の範疇において)」と言えます. 関連話題は既述ですが華麗にスルーされているので,きっと「正しい」形になっているのでしょう. (私は実物見てませんけど.) #他人にコード見せる状況で,わざわざそんなことをする意味はわかりせんが.
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.19 )
名前:あいおい? 日時:2020/06/08 22:16

そうですよ ただ、それならただの.cファイルをインクルードしてしまえばいいわけで、 Non17では「どうして"ヘッダファイルに関数の実装"を書いてしまったのか?」をお聞きしていました ######## もちろん動くのであれば表面上問題はないですが、ここでそのソースコードを人に見せる、ということを考えればある程度ルールに従った書き方で書いたものをアップロードすべきです。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.20 )
名前:相田 日時:2020/06/09 09:53

「どうして"ヘッダファイルに関数の実装"を書いてはいけないか」を知らないのだろう。 つまりは分割コンパイルをやったことないんだろう。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.21 )
名前:このライブラリ知らない人 日時:2020/06/09 13:08

実際動いていないと「こういう動きをしてしまいます><」とか言わないだろうから コンパイルとリンクは通ってるわけで, 本件の本題に対しては余計な話だったかも感.
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.22 )
名前:相田 日時:2020/06/09 15:06

人様に見てもらおうってコードを無手勝流で無双されると回答者に無用な混乱を招くから看過できない。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.23 )
名前:このライブラリ知らない人 日時:2020/06/09 16:38

「サンプルとかを見た感じ自分と同じように書いてるのが見当たらないから→自分のコードから関数コール消してみた」 とかいう意思決定法というか行動原理というかの側の方が不穏すぎて, どのファイルに何を書くとかいう話が些末なことに思えてくる私…… 何だろう,もっと強い意志(というか「理由」とでもいうか)を持ってコードを書くべきなんじゃなかろうか,と.
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.24 )
名前:yumetodo 日時:2020/06/13 14:26

というか基本に立ち返って問題が発生する最小コードを作るべきでしょう。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.25 )
名前:マーク42 日時:2020/06/15 08:47

返信遅くなりすいません。 ある変数がある値の時に PlayMovieToGraph(Handle); を{}の中に入れたところスムーズに最初から再生できました! 今まではPlayMovieToGraph(Handle);を処理とは違う、{}の外で定義して読み込まれて数分立ったものを読み込んでいたため 最初から再生できずにいました。
メンテ
Re: gif動画をスムーズに再生するために背景で、バッググランドで再生したい! ( No.26 )
名前:マーク42(解決) 日時:2020/06/17 18:23

以上より解決いたしました。みなさんありがとうございます。
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存