DXライブラリでRPGなどで使われるような戦闘グラフィックを表示したいのですが、表示方法がいまいちわかりません。
カウンタを使って表示するのかな、と思っているのですがそのプログラムが思いつかないんです。
画像情報は、横8、縦1、1枚あたり(240×240)ピクセルの画像で表示時間は1秒ほどと考えています。
画像は
LoadDivGraph( "date/anime/ファイア.png" , 8 , 8 , 1 , 240 , 240 , fire );
このように宣言しています。
どなたかこの条件に当てはまるプログラムを教えてください。
そのまま教えると力がつかないと思った方はヒントだけでも教えてくださると助かります。
宜しくお願いします。
戦闘グラフィックの表示方法
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 戦闘グラフィックの表示方法
DXライブラリならwhileループで回っていると思いますが、このループの中でカウントします。
int flame_count = 0; ← whileループ前
flame_count++; ← whileループ中
1回のループで1/60秒ですから1秒で8コマなら60/8で7.5ですが切り上げて8としてカウンタを8で割った数値をfireの添字として使います。
fire [ flame_count/8 ] ← 表示に使う
ただし、flame_countが8x8で64を超えたら表示を停止します。
あるいは
fire [ (flame_count/8)%8 ] ← 表示に使う
とすれば永久にアニメを繰り返します。
int flame_count = 0; ← whileループ前
flame_count++; ← whileループ中
1回のループで1/60秒ですから1秒で8コマなら60/8で7.5ですが切り上げて8としてカウンタを8で割った数値をfireの添字として使います。
fire [ flame_count/8 ] ← 表示に使う
ただし、flame_countが8x8で64を超えたら表示を停止します。
あるいは
fire [ (flame_count/8)%8 ] ← 表示に使う
とすれば永久にアニメを繰り返します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 戦闘グラフィックの表示方法
ScreenFlipしていないループなので表示されなくて当たり前です。
こちらのメインループの事です。描画したらかならずScreenFlipのあるwhileループに戻るようにして下さい。それで1フレームです。[誤解を生みそうだったので訂正]
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 1.9章 ゲームプログラムの骨格の完成」
http://dixq.net/g/01_09.html
他にも大事な事が書かれていますので「新・C言語 ~ゲームプログラミングの館~ 」を細かく理解されると良いと思います。
[補足]
難しいかも知れませんが、1フレームは次のような流れになります。
(1)DrawGraph() → 描画登録する。
・
・その他の描画
・
(2)ScreenFlip() → 裏バッファに描画終了を待って表と裏画面バッファを入れ替えて描画登録されたものを裏バッファに描画開始する。
(1)と(2)は組みですので必ず表示させるためにはScreenFlip()を行わなければいけません。
ただし、つぎの点「不適切な実装3. あちこちにDXライブラリ3大処理がある」には注意して下さい。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 戦闘グラフィックの表示方法
ああ、ごめんなさい。
色々と書くの忘れてました。
このdraw_animeはメインループ内で呼び出される関数でヘッダーで宣言してあります。
プレイヤーが”ファイア”の項目でエンターキーを押すと呼ばれるようになっています。
色々と書くの忘れてました。
このdraw_animeはメインループ内で呼び出される関数でヘッダーで宣言してあります。
プレイヤーが”ファイア”の項目でエンターキーを押すと呼ばれるようになっています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 戦闘グラフィックの表示方法
上で説明してますがdraw_anime内で64回ループしているのが問題です。田中太郎 さんが書きました:ああ、ごめんなさい。
色々と書くの忘れてました。
このdraw_animeはメインループ内で呼び出される関数でヘッダーで宣言してあります。
プレイヤーが”ファイア”の項目でエンターキーを押すと呼ばれるようになっています。
DrawGraph()したら必ずメインループに戻って下さい。
今の仕組みだと64回分のDrawGraph()に対して1回のScreenFlip()ですから、1フレームに64回描画することになります。
全部のコマが重なって描画されるので最終的に見えるのは一番上に来る最後に描画されたコマだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 戦闘グラフィックの表示方法
>こちらのメインループの事です。描画したらかならずScreenFlipのあるwhileループに戻るようにして下さい。
自分の書いたプログラムだとwhile( flame_count<64 )の中で画像を描写してて、ScreenFlipのあるwhileループに戻れてないということなんですね
自分の書いたプログラムだとwhile( flame_count<64 )の中で画像を描写してて、ScreenFlipのあるwhileループに戻れてないということなんですね
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 戦闘グラフィックの表示方法
そうです。田中太郎 さんが書きました:>こちらのメインループの事です。描画したらかならずScreenFlipのあるwhileループに戻るようにして下さい。
自分の書いたプログラムだとwhile( flame_count<64 )の中で画像を描写してて、ScreenFlipのあるwhileループに戻れてないということなんですね
全部同じ1つのフレームに描画している事になるのでアニメーションにはなりません。[誤字訂正]
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 戦闘グラフィックの表示方法
返信がかぶってしまいました;
ソフト屋さんが言っていることがわかりました!
毎回丁寧に回答してくれてありがとうございます。
また質問したときなど、よろしくお願いします。
ソフト屋さんが言っていることがわかりました!
毎回丁寧に回答してくれてありがとうございます。
また質問したときなど、よろしくお願いします。