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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
田中太郎
記事: 24
登録日時: 13年前

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

#1

投稿記事 by 田中太郎 » 13年前

DXライブラリでRPGなどで使われるような戦闘グラフィックを表示したいのですが、表示方法がいまいちわかりません。
カウンタを使って表示するのかな、と思っているのですがそのプログラムが思いつかないんです。

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

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

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

宜しくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 13年前

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 ] ← 表示に使う
とすれば永久にアニメを繰り返します。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

田中太郎
記事: 24
登録日時: 13年前

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

#3

投稿記事 by 田中太郎 » 13年前

>softya(ソフト屋)さん
いつもご解答頂いてありがとうございます。
ソフト屋さんに教えてもらったものを使ってみたのですが画像が一瞬ほどしか映りませんでした。
このプログラムだとどの辺がいけないのでしょうか。

コード:

//アニメーション

static int flame_count = 0;

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

田中太郎 さんが書きました:>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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

田中太郎
記事: 24
登録日時: 13年前

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

#5

投稿記事 by 田中太郎 » 13年前

ああ、ごめんなさい。
色々と書くの忘れてました。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

田中太郎 さんが書きました:ああ、ごめんなさい。
色々と書くの忘れてました。

このdraw_animeはメインループ内で呼び出される関数でヘッダーで宣言してあります。
プレイヤーが”ファイア”の項目でエンターキーを押すと呼ばれるようになっています。
上で説明してますがdraw_anime内で64回ループしているのが問題です。
DrawGraph()したら必ずメインループに戻って下さい。
今の仕組みだと64回分のDrawGraph()に対して1回のScreenFlip()ですから、1フレームに64回描画することになります。
全部のコマが重なって描画されるので最終的に見えるのは一番上に来る最後に描画されたコマだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

田中太郎
記事: 24
登録日時: 13年前

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

#7

投稿記事 by 田中太郎 » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 13年前

田中太郎 さんが書きました:>こちらのメインループの事です。描画したらかならずScreenFlipのあるwhileループに戻るようにして下さい。
自分の書いたプログラムだとwhile( flame_count<64 )の中で画像を描写してて、ScreenFlipのあるwhileループに戻れてないということなんですね
そうです。
全部同じ1つのフレームに描画している事になるのでアニメーションにはなりません。[誤字訂正]
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

田中太郎
記事: 24
登録日時: 13年前

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

#9

投稿記事 by 田中太郎 » 13年前

返信がかぶってしまいました;
ソフト屋さんが言っていることがわかりました!
毎回丁寧に回答してくれてありがとうございます。

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

閉鎖

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