ページ 11

戦闘グラフィックの表示方法

Posted: 2012年4月01日(日) 22:53
by 田中太郎
DXライブラリでRPGなどで使われるような戦闘グラフィックを表示したいのですが、表示方法がいまいちわかりません。
カウンタを使って表示するのかな、と思っているのですがそのプログラムが思いつかないんです。

画像情報は、横8、縦1、1枚あたり(240×240)ピクセルの画像で表示時間は1秒ほどと考えています。

画像は
LoadDivGraph( "date/anime/ファイア.png" , 8 , 8 , 1 , 240 , 240 , fire );
このように宣言しています。

どなたかこの条件に当てはまるプログラムを教えてください。
そのまま教えると力がつかないと思った方はヒントだけでも教えてくださると助かります。

宜しくお願いします。

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月01日(日) 23:36
by softya(ソフト屋)
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 ] ← 表示に使う
とすれば永久にアニメを繰り返します。

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 00:07
by 田中太郎
>softya(ソフト屋)さん
いつもご解答頂いてありがとうございます。
ソフト屋さんに教えてもらったものを使ってみたのですが画像が一瞬ほどしか映りませんでした。
このプログラムだとどの辺がいけないのでしょうか。

コード:

//アニメーション

static int flame_count = 0;

void draw_anime(){
	while( flame_count<64 ){
		flame_count++;

		DrawGraph( 220 , 60 , fire[flame_count/8] , TRUE );
	}
}

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 00:33
by softya(ソフト屋)
田中太郎 さんが書きました:>softya(ソフト屋)さん
いつもご解答頂いてありがとうございます。
ソフト屋さんに教えてもらったものを使ってみたのですが画像が一瞬ほどしか映りませんでした。
このプログラムだとどの辺がいけないのでしょうか。

コード:

//アニメーション

static int flame_count = 0;

void draw_anime(){
	while( flame_count<64 ){
		flame_count++;

		DrawGraph( 220 , 60 , fire[flame_count/8] , TRUE );
	}
}
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

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 00:44
by 田中太郎
ああ、ごめんなさい。
色々と書くの忘れてました。

このdraw_animeはメインループ内で呼び出される関数でヘッダーで宣言してあります。
プレイヤーが”ファイア”の項目でエンターキーを押すと呼ばれるようになっています。

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 01:05
by softya(ソフト屋)
田中太郎 さんが書きました:ああ、ごめんなさい。
色々と書くの忘れてました。

このdraw_animeはメインループ内で呼び出される関数でヘッダーで宣言してあります。
プレイヤーが”ファイア”の項目でエンターキーを押すと呼ばれるようになっています。
上で説明してますがdraw_anime内で64回ループしているのが問題です。
DrawGraph()したら必ずメインループに戻って下さい。
今の仕組みだと64回分のDrawGraph()に対して1回のScreenFlip()ですから、1フレームに64回描画することになります。
全部のコマが重なって描画されるので最終的に見えるのは一番上に来る最後に描画されたコマだけです。

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 01:09
by 田中太郎
>こちらのメインループの事です。描画したらかならずScreenFlipのあるwhileループに戻るようにして下さい。
自分の書いたプログラムだとwhile( flame_count<64 )の中で画像を描写してて、ScreenFlipのあるwhileループに戻れてないということなんですね

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 01:12
by softya(ソフト屋)
田中太郎 さんが書きました:>こちらのメインループの事です。描画したらかならずScreenFlipのあるwhileループに戻るようにして下さい。
自分の書いたプログラムだとwhile( flame_count<64 )の中で画像を描写してて、ScreenFlipのあるwhileループに戻れてないということなんですね
そうです。
全部同じ1つのフレームに描画している事になるのでアニメーションにはなりません。[誤字訂正]

Re: 戦闘グラフィックの表示方法

Posted: 2012年4月02日(月) 01:14
by 田中太郎
返信がかぶってしまいました;
ソフト屋さんが言っていることがわかりました!
毎回丁寧に回答してくれてありがとうございます。

また質問したときなど、よろしくお願いします。