ページ 1 / 1
マップスクロール
Posted: 2011年6月25日(土) 12:18
by world
自機を真ん中に固定し、自機の移動に伴って大きめのマップ上を表示画面がスクロールするようにしたいです。
STGなのでマップチップという考え方はとりあえず使っていません。
そこで考えたのが、表示画面のある部分をGetDrawScreenGraph()で切り取り、それを格納し
DrawExtendGraph()で拡大して表示するということなのですが・・・
FdHandle = MakeGraph(MapW, MapH); //画像を切り抜く
GetDrawScreenGraph(MapX, MapY, MapX+MapW, MapY+MapH, FdHandle); //FdHandleに格納する
DrawExtendGraph(0, 0, 640, 480, FdHandle, TRUE); //FdHandleを拡大し描画する
できたのはいいのですが、処理が重くなってしまいました。
原因はやはり、このやり方がいけないのでしょうか?
ご教授お願いします。
Re: マップスクロール
Posted: 2011年6月25日(土) 17:41
by softya(ソフト屋)
すいません処理イメージが湧きませんが、
SetDrawArea()で描画範囲を制限して、DrawExtendGraph()で好きなサイズに拡大とは意味が違うのでしょうか?
Re: マップスクロール
Posted: 2011年6月26日(日) 00:32
by world
返信ありがとうございます。
その方法で試してみました。
しかし、SetDrawAreaでプレイヤーを中心とした画像が切り抜かれたのはいいのですが、
DrawExtendGraphで拡大されず、表示したい画面は小さいままで、黒い部分が残ってしまいました。
もうひとつ伺いたいのですが、x座標は640以上は存在しないのですか?
もし存在するのであれば、1280pixelの画像を用意して座標幅を0<x<1280に設定できたらいいなと思います。
なんだか思ったよりも難しいです。
Re: マップスクロール
Posted: 2011年6月26日(日) 00:47
by softya(ソフト屋)
だめですか。
実は、何がしたいのかがよく分からないのでアドバイスが難しい状況です。
自機の周りを拡大表示したいってことは、なんとなく分かるのですがそれ以上のことが分かりません。
自機の周りはどうしたいのか? 自機周辺外の部分はどうしたいのか? ここが分かると良いのですが。
なぜ、一度書きだしたものを切りだして表示する必要があるかがよく分からないので答えかねております。
それとDrawExtendGraph()では矩形は元の画像よりも大きな座標系を支持しないと拡大しません。
たとえば、32x32の画像imageを64x64で(x,y)に表示する場合は
DrawExtendGraph(x,y,x+64,y+64, image, TRUE );
と書きます。
もうひとつ伺いたいのですが、x座標は640以上は存在しないのですか?
もし存在するのであれば、1280pixelの画像を用意して座標幅を0<x<1280に設定できたらいいなと思います。
画像は1280pixelでも問題ないです、画面は640が基本ですね。
ただ、SetGraphMode()でウィンドウのサイズを640よりも大きくは出来ますが当然ながらウィンドウのサイズも巨大化します。
xも0~639の座標系に1280pixelの画像を縮小して表示したり、一部を切りだして表示(スクロールなど)することも出来ます。
これも1280pixelをどう画面に表示したいかが分からないと答えとしては曖昧になってしまいます。
Re: マップスクロール
Posted: 2011年6月26日(日) 01:07
by world
素早い返信ありがとうございます。
大きなマップ内で自機を中心として移動する画面を作るのが最終的なゴールです。
例えば1280×960pixelのマップを用いるのであれば、プレイヤーを中心として表示される画像(ウィンドウに表示される画像)は640×480pixelで、フィールド内を自由に動けるようにしたいです。
具体的な状況としては、敵が1280×960pixelのマップ内のどこかにいて、ウィンドウに表示される画像は自機を中心として動き、その敵を探して倒すみたいな感じです。
もしくは、640×480pixelのフィールド(背景画像)を使うのであれば、プレイヤーを中心とした320×240pixelを切り取って、ウィンドウ(640×480pixel)で表示できればと思っています。もちろん全体的なスケールも縮小します。
とりあえず、
描画してある画像の指定部分を切り取って描画する関数があれば、それで終わりなんですけどね・・・
Re: マップスクロール
Posted: 2011年6月26日(日) 01:16
by softya(ソフト屋)
画像から矩形部分を切り取って表示するだけならDrawRectGraph()があります。
http://homepage2.nifty.com/natupaji/DxL ... html#R3N20
これで事足りるって話でしょうか?
[追記]この関数は1280×960pixelの画像から任意の640×480pixelの部分を表示させることが可能です。
Re: マップスクロール
Posted: 2011年6月26日(日) 01:22
by ISLe
world さんが書きました:もしくは、640×480pixelのフィールド(背景画像)を使うのであれば、プレイヤーを中心とした320×240pixelを切り取って、ウィンドウ(640×480pixel)で表示できればと思っています。もちろん全体的なスケールも縮小します。
とりあえず、
描画してある画像の指定部分を切り取って描画する関数があれば、それで終わりなんですけどね・・・
DrawModiGraphのことですかね。
Re: マップスクロール
Posted: 2011年6月26日(日) 01:38
by world
それらの関数は確かに”マップだけ”を表示するには使うことができました。
しかし、敵の座標などはウィンドウ上の640×480の座標を基準としているので、マップがスクロールされても敵やオブジェクトはウィンドウ上に止まったままで、スクロールされませんでした。
つまり、ハンドルから表示するのではなく、敵の座標、弾の座標、プレイヤーの座標など色々な処理を施したうえで表示されているウィンドウから表示されている画像を、ウィンドウサイズで表示したいわけです。
そこで先ほどの描画してある画像を一度ハンドルとして読み込んで、そのハンドルからロードして拡大表示するという方法をとっていました。
先ほどの1280×960pixelでマップを用意し、普通にx=1280, y=960までの座標があるとして処理することは問題ないのでしょうか?例えば、敵の位置座標を
(x,y) = (1000, 900)
と設定し、計算等を行っていくことは可能なのですか?もし可能であれば、色々な値を描き変えなければなりませんが無難な方法ではあると思います。
Re: マップスクロール
Posted: 2011年6月26日(日) 10:03
by softya(ソフト屋)
普通のゲームは画面座標(640×480)で位置を持つ場合は、ほぼありません。
敵や弾や自機が仮想的な空間座標(1280×960など可変)をもち、その座標から表示座標に計算して画面座標(640×480)に反映します。
例えば、
自機 (1000,900)
敵 (1200,800)
だとしたら画面表示に使う座標は
マップ (1000-320,900-240)
自機 (320,240)
敵 (1200-1000+320,800-900+240)
となります。
Re: マップスクロール
Posted: 2011年6月26日(日) 12:47
by world
お~、なるほど!
プレイヤーは画面中央に固定して、風景を動かしていくって感じですね。
こんな画期的な方法があるとは知りませんでした・・・
多分これで解決すると思います。
もの凄い色々と変えなければならないと思いますが。
長々とありがとうございました。
ソフト屋さんに敬礼!