ゲーム画面の拡大縮小について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬこ

ゲーム画面の拡大縮小について

#1

投稿記事 by ぬこ » 16年前

こんばんは~
ちょっとした疑問なのですが、格闘ゲームなんかでよくみられるんですがズームイン、アウトについて質問させてください。
格闘ゲームってキャラ同士が接近するとそれにともないゲーム画面もズームインしたり、
逆にキャラ同士遠くなるとズームアウトされますよね。
あの機能を実装したいのですが上手くいきません。
あれってどのような処理をしてるんでしょうか?

自分でちょっとあれこれ試してみたのですが思ったようになりませんでした。
DXライブラリのDrawExtendGraphを使うと画像の大きさだけ変わるので動きがズレてしまいます。
SetWindowSizeExtendRateをつかってみたところ求めていた機能なのですが、
ウィンドウもいっしょに小さくなってしまいます。

ウィンドウサイズを固定したまま画像だけ拡大縮小する方法はないでしょうか?
自分では一応DrawExtendGraphをつかって動きも縮小率にあわせて変更すればいいのかなっと思いついたのですが、
ドット単位で少しづつ拡大縮小するたびにずれる気がしますorz
他に何か良い方法があるのなら紹介していただけるとうれしいです。

プログラミングは勉強中ですがそんなに得意じゃありません。
もしかしたら見当違いなことをいってるかもしれませんが答えていただけるとありがたいです。

Justy

Re:ゲーム画面の拡大縮小について

#2

投稿記事 by Justy » 16年前

 市販のゲームは、というと個々のゲームやハードによって変わってくるのですが、
3次元的に処理すれば簡単にできます。

 キャラは面がカメラの方を向くようにして、カメラを近づければ拡大しますし、
遠ざければ小さくなります。


 全てを2Dで処理する場合でも、本格的に作るなら基本的には似たような……
Z軸の代わりに「拡大率」のようなパラメータとカメラ的な概念と取り入れて、
システム的に内部座標から表示座標を計算して表示する……処理になるでしょう。

 ただ、完全な2Dライブラリではカメラの概念がない場合があるので、
その場合は自作となります。



>DXライブラリのDrawExtendGraphを使うと画像の大きさだけ変わるので動きがズレてしまいます。

 手っ取り早くやるなら、拡大しようとしている画面の中心点から
オブジェクトの中心へのベクトルを求めて、描画する時はスケール値に応じてこのベクトルを
伸縮させた位置に表示すればいいんじゃないかと。

 その場合、DrawExtendGraphより、DrawRotaGraphの方がやりやすいかもしれません。

チルチル

Re:ゲーム画面の拡大縮小について

#3

投稿記事 by チルチル » 16年前

Justyさんの方法の方が良いとは思いますが

ズームするだけなら普通に描画した後に画面全体をキャプチャして
キャラの距離に応じて拡大して貼り付ければ良いんじゃないでしょうか?

処理が重たくなるかもしれませんが、細かい処理を加える必要が無いので
追加、改良が楽だと思いますが・・

kazuoni

Re:ゲーム画面の拡大縮小について

#4

投稿記事 by kazuoni » 16年前

>チルチルさん
例えば、ウォー○ーを探せ的なやつで、
見つけたいキャラクタがここにいました!って
いうのはそれで事が足りるのですが、
ゲームの動き(リアルアクション)を考慮するならやはりベクトル概念
もしくはJustyさんのおっしゃるような、カメラは必要かと思います。


2D用カメラ自作してみたいですね。
っというか、具体的にどんな手順を踏めばいいのかが
良く分からないんですが。。
ベクトルなら見通しがつくのですが・・・。

ぬこ

Re:ゲーム画面の拡大縮小について

#5

投稿記事 by ぬこ » 16年前

色々と方法を提示していただき皆様ありがとうございました。
参考にして色々と試して見ました。

3Dだとカメラ近づけるだけでズームできるんですね。
考えてみれば当然のことですが、こんな方法全然思いつきませんでした。
ただ試してみようとしたのですが・・・
「Z軸の代わりに「拡大率」のようなパラメータとカメラ的な概念と取り入れて」
↑この辺で断念しました。勉強不足なのかちょっと処理がわかりませんでしたorz

画面全体をキャプチャする方法もカンタンそうなので試してみました。
少し求めていたものと違ったのですがこんな方法もあるんですね。
今後色々と使えそうです。細かい処理がいらないのもお手軽でいいですね。
参考になりました。

とりあえず現状でも手がつけれそうなDrawRotaGraphを使う方法でやってみようと思います。
勉強になりました。答えてくださった皆様ありがとうございます。

うぉ いつのまにか追加されとる。
DrawModiGraphで色々つかってみたところ綺麗にできそうです。
一括でやってなかったからまとめなきゃだけども ちょっとこれでやってみようと思います。
情報ありがとうございました~。
あとは色々と試しつつがんばってみますね。
力技は得意なのでw あとで後悔することが多いけどもorz

バグ

Re:ゲーム画面の拡大縮小について

#6

投稿記事 by バグ » 16年前

昔のゲーム機では、拡大・縮小をサポートしていないハードなのに無理矢理に実現させていた作品がありました。

その作品では単純に大きさの違うキャラクターを用意しておいて、状況に応じて書き換えていたようでした。

まぁ、当然ですが、この方法ではスムーズには拡大・縮小はできません。カクカクします(笑)

口で言うのは簡単ですが、この方法は当時のメモリの少ないハードで実現するのは相当に大変だったのではないかと推測します(^_^;)

最適解を求めるのも、もちろん勉強になりますが、例え力技でも自分の思い付くままに色々とテストしてみるのもよろしいかと思いますよ(o^-')b

司馬司

Re:ゲーム画面の拡大縮小について

#7

投稿記事 by 司馬司 » 16年前

描画命令を一元的に管理しているという前提が必要ですが、
DrawModiGraphを使うと上手くできるように思いました。

具体的には、まず描画は全てDrawModiGraphを使用し、処理は一点にまとめておきます。
(このとき自分の場合だと、拡大率・輝度・回転角度などを詰めたDrawInfoクラスを引数に渡しています。
 そして、このDrawInfoの情報を元にして4点の座標を計算します)
そうしておけば、全体の平行移動や拡大縮小や回転などはDrawModiGraphの4点の座標を再計算するだけで済みます。
処理速度的には現在のハードウェアであれば他のDraw系命令を呼ぶのと変わらないか、あるいは速いはずです。

なお、描画には等倍であればDrawModiGraphを、等倍でなければDrawModiGraphFを使用するときれいに描画されます。

閉鎖

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