ページ 11

マップスクロールをする方法

Posted: 2012年9月23日(日) 21:39
by yamoko
はじめまして
C言語は4日前、このサイトを見させてもらったのは2日前とかなりの初心者なので
この掲示板を使わせていただくのは場違いかもしれませんが
どうしてもわからないことがあったので質問させてください


当方、一応ここのコンテンツのゲームプログラミングの館を勉強したつもりですが
マップスクロール(RPGやアクションゲームなどで主人公の動きに合わせて周りの景色も変わるアレ)
のやり方がわかりません

自分はてっきり普通に画像を表示させて移動キーが押された場合に主人公の座標を動かすのではなく
主人公以外のオブジェクトの座標を変化させればマップスクロールが実現できると思っておりました

しかし、マップスクロールのやり方を調べていましたら
「表示窓の左上の座標をキャラの位置からピクセル位置で計算する
表示窓の座標をキャラの座標から引くと窓内の相対位置が出ますので、その座標で描画する」
このような説明をこの掲示板で見かけまして、自分の考えていたものとは違うなと・・・


今の自分のレベルでは上記の説明がどんなことをいっているのか理解ができませんし、プログラムの仕方も
さっぱりです しかし、きっと私の考えたやり方よりも優れている気がするのです
そこで、お願いなのですが上記の説明の意味と具体的なやり方をご教授いただきたいのです
どうかお願いいたします

Re: マップスクロールをする方法

Posted: 2012年9月23日(日) 22:20
by softya(ソフト屋)
はじめまして。
そうですね。画面の移動に合わせて他のキャラを移動させたほうが簡単に見えると思いますが実はそのほうがややこしいのです。
これは現実世界に当てはめてみると分かります。

横長い舞台があると考えてみてください。それを撮影しているカメラがあります。
このカメラはレールの上に載っていて左右にしか動きませんしカメラの首も触れません。
イメージは出来ましたか?
舞台の端から主人公が登場し、カメラは横に移動して主人公を画面中央に据えます。
そして敵の皆さんが舞台のそれぞれの場所で配置につきました。
これで準備は整いました。いよいよ冒険譚の始まりです。

この舞台で主人公は右に左にと動きまわります。カメラはそれに合わせて付いて行くだけです。
敵も主人公を狙って攻撃してきますがカメラのことは意識していません。

これがよく使われるマップスクロールの仕組みを説明したものです。
画面はカメラの撮影している所で、背景は動かずカメラが動いています。
敵も画面の場所ではなく舞台上の場所を基準に動いているわけです。

その仕組の説明が「表示窓の左上の座標をキャラの位置からピクセル位置で計算する
表示窓の座標をキャラの座標から引くと窓内の相対位置が出ますので、その座標で描画する」となるわけです。

【追記】
yamokoさんの考えるカメラに対して他のものを動かすと言うのは、固定されているカメラに対して動いて見えるように
敵や舞台を動かすということですね。それも別々に撮影した敵と舞台を合成するって行為に近いです。
主人公や敵が舞台の何処に立っているか調べないと障害物とか避けれない訳ですが、そのためには舞台の端からの距離を調べないと舞台の何処かが分からいわけです。
でも、分かっているのはカメラから相対位置だけなんですね。これを元に計算するのは凄く間違えるみたいなので止めたほうが良いというのが私の結論です。

この方法は、オブジェクトではなくカメラを動かすのはオブジェクトの座標系のリセットが必要になった時に面倒な事が一つ。
移動するのにマップの座標とカメラの座標を両方管理しないと攻撃も移動もできないのがバグの元になるというのも問題です。

Re: マップスクロールをする方法

Posted: 2012年9月24日(月) 21:30
by yamoko
ご返信ありがとうございます
こんなに説明していただいて恐縮なのですが、まだ分からない事がありまして
理屈はソフト屋さんの説明でよく理解できたのですが
「キャラの座標-窓の左上座標=窓内の相対位置」
この部分が納得できません
なぜキャラの座標から窓の左上座標を引くのか、引くとどうなるのか私の単細胞脳では理解できません

この部分をどうかご教授いただければ幸いです

Re: マップスクロールをする方法

Posted: 2012年9月24日(月) 21:46
by softya(ソフト屋)
舞台の左端から5mの所にキャラクタがいるとします。
その舞台をカメラが撮影しています。画面で見えているのは舞台の左端から3mから6mの範囲です。つまり画面幅は3mです。
さて、カメラ画面の左端からみてキャラクタは何mの所にいるように見えるでしょうか?

これが分かれば大丈夫ですよ。
よく分からなければ図を書いてみましょう。