トップページ > 過去ログ > 記事閲覧
フィールド上に痕を残す方法
名前:1.23 日時: 2007/02/28 15:52

こんにちわ。 早速質問なのですが フィールド上に黒丸や線等を残す方法はありますか。 例えば、ボンバーマンの様なキャラが置いた爆弾が 爆発して、地面に焦げあとがゲーム終了まで ずっと残る様な感じです。 何度も爆弾が爆発すると、焦げあとが無数について それでゲーム的には支障が無い風に出来たら 良いなと思っています。 描画する関数に GetDrawScreenGraph( 0 , 0 , 640 , 480 , GHandle ) ; とやって毎回画面を取り込んでみようと思ったのですが 重過ぎて出来ませんでした。 上手く行える方法はあるでしょうか。

Page: 1 |

Re: フィールド上に痕を残す方法 ( No.1 )
名前:管理人 日時:2007/03/01 15:09

 1.23さん始めまして、DXライブラリの管理人です。  焦げ跡の画像を描画した画面を保存しておくという方法は 現時点の環境では難しいので、焦げ跡の位置を記録しておいて、 毎フレーム焦げ跡を描画するという方法をとるしかないと思います。  この場合数が多くなれば多くなるほど処理が重くなりますので、 64個以上の焦げ跡が付いた場合は一番古い焦げ跡の記録を消す等の 処理をすることになります。
Re: フィールド上に痕を残す方法 ( No.2 )
名前:1.23 日時:2007/03/01 17:47

管理人さんこんにちわ。 お返事ありがとうございます。 なるほど、管理人さんが提示してくれた方式で プログラムを組んで見ようと思います。 自分はVC++を使っているのですが VC++そのままの方でそう言う処理をする方法はありますか。 DXライブラリから脱線してしまいますが もしあったとしたら知りたいです。
Re: フィールド上に痕を残す方法 ( No.3 )
名前: 日時:2007/03/01 19:13

 横槍ですが、ボンバーマンくらいのフィールドでしたら、二次元配列で管理できるレベルだと思いますよ。  たとえば、 0……焦げなし 1……中心から右に焦げ 2……中心から下に焦げ …… 7……十字の焦げ …… と、番号で置き換えておいて描画すれば、少なくとも一地点の描画回数は1〜2回(地面と焦げを別に処理するかどうかによる)  半透明処理などをつかって重複した焦げも表現するとなった場合、管理人さんのやり方のほうが面倒でないと思うので、キューを使ってはどうでしょうか。  二次元配列を作って(ここでは(8*3)個分場所を取ります)、更に「最新の焦げ」の番号を表す変数を宣言します。 最初: 焦げの座標:00000000       00000000 焦げの種類:00000000//焦げの有無や火力の違いの判断に利用 最新の焦げ:↑ 番号:0 (0,0)に配置: 焦げの座標:00000000//焦げ座標       00000000 焦げの種類:30000000//火力3 最新の焦げ:↑ 番号:0 (3,1)に配置: 焦げの座標:03000000//焦げ座標       01000000 焦げの種類:33000000//火力3 最新の焦げ: ↑ 番号:1//人によると思いますが、番号が指す添字の「焦げの種類」が0以外のときインクリメントするようにすると見やすいかもしれません …… …… (4,1)に配置: 焦げの座標:03156484//焦げ座標       01364791 焦げの種類:33333333//火力3 最新の焦げ:↑ 番号:0//一周して戻ってきます (2,5)に配置: 焦げの座標:23156484//焦げ座標(古いものは上書きされます)       51364791 焦げの種類:33333333//火力3 最新の焦げ: ↑ 番号:1  このような処理をすることで、メモリの消費を抑えて簡単に「順番待ち」を作ることができます(この例では、順番待ちの数が限られてしまいますが)。  先入後出しのスタックと並んでプログラミングにおいては覚えておいて損はない方法だと思いますよ。  なお、描画処理をするときは、番号の次から順に描画し、一周して最後に番号の描画をするようにすると、上下の重なりがあるときも大丈夫です。  長文ですみません。
雪さんありがとうございます ( No.4 )
名前:1.23 日時:2007/03/01 20:43

こんばんわ。 何度も読んで見て、やっとわかりました。 管理人さんの言っていた「順番に焦げを表示する」 と言う方法をこのやり方でやると良さそうですね。 ちょうど焦げの種類の部分の変数で 直線とか十字の焦げを表現出来る所など とても参考になりました。 この最大数を大体全体の処理スピード的に 問題が無い位の大きさにすれば作り方は問題無いですね。 色々変数の作り方を考えていましたが 雪さんの方法で1回作って見ます。 勉強になりました。ありがとうございます。 しかし、どうしても思ってしまうのは それでも全部の焦げを残す事は難しいのでしょうかね。 それはやっぱりしょうがないのでしょうか…。
Re: フィールド上に痕を残す方法 ( No.5 )
名前:通りすがり 日時:2007/03/01 22:55

背景画像に直接焦げを書き込むのはどうなのでしょうか? 背景にしている640x480の画像を仮に img1 とします。 焦げの処理が発生した場合、img1 を描画先にして焦げを書きます。 その後、描画先をバックバッファに戻し、 img1 や プレイヤー等の画像を 描画すればよいと思います。 ただこの方法は、焦げの描画プライオリティが背景画像の次に低い場合でないと 使用できません。
Re: フィールド上に痕を残す方法 ( No.6 )
名前:1.23 日時:2007/03/01 23:14

通りすがりさん、お返事ありがとうございます。 自分もそれを考えていたのですが 画像に直接描き込むと言うのは どう言う風にやると良いのでしょう。
Re: フィールド上に痕を残す方法 ( No.7 )
名前:通りすがり 日時:2007/03/02 13:48

DXライブラリのリファレンスをさくっと見た限りでは レンダリングターゲットを変更する関数が見当たりませんね。 >> 管理人さん レンダリングターゲットを変更する関数あるのでしょうか?
Re: フィールド上に痕を残す方法 ( No.8 )
名前:管理人 日時:2007/03/06 15:15

SetDrawScreen という関数に画像ハンドルを渡すことで レンダリングターゲットを変更することが出来ます。 ただ、どんな画像ハンドルでも良いと言うわけではなくて、 レンダリングターゲットにすることが出来る画像ハンドルである必要があります。  レンダリングターゲットにすることができる画像ハンドルを作成する為には、 レンダリングターゲットにすることができる画像ハンドルを作成するかどうかを 設定する関数 SetDrawValidGraphCreateFlag に TRUE を渡して呼び出した後、 MakeGraph 関数で画像ハンドルを作成します。 int SubScreen; SetDrawValidGraphCreateFlag( TRUE ); SubScreen = MakeGraph( 640, 480 ); SetDrawValidGraphCreateFlag( FALSE );  こうして作成した画像ハンドルは SetDrawScreen で描画先とすることが出来ます。 SetDrawScreen( SubScreen );  普通の画像として描画することも出来ます。 DrawGraph( 0, 0, SubScreen, TRUE );  ただ、この機能は他の機能に比べて正常に動作するグラフィックチップの 敷居が高いので、余りお勧めできません。 (ソフトウエアレンダリングモードでしたら確実に動作しますが)
Re: フィールド上に痕を残す方法 ( No.9 )
名前:1.23 日時:2007/03/06 16:42

設定画面みたいなものを作って 全部焦げあとを描き残すのが無理だった人は 順番に描画していく方式に変えられる様に してみたいと思います。 自分の代わりに聞いてくれた通りすがりさん 管理人さん どうもありがとうございました。

Page: 1 |