|
「天国への階段」というゲームについて 投稿日時: 2004-4-24 午前 3:19 |
「天国への階段」という、天国へ続くらせん階段を上り続けるゲームを作っています。
しかし、そこで一つ問題が出ました。
ここにある画像のように、階段を描画しているのですが、一番下にきた階段を、一番上にある階段と同じ位置にもっていき、Y方向に少し上に上げ、Y軸でランダムに回転させ、Z方向に移動させて、天国へ続く階段を表現しています。
そこで問題というのが、主人公がその階段を上っていくとき、左右旋回で操作するのですが、インコースをついて近道をすると、主人公が徐々に階段に近づき、終いには階段にめりこんでしまいます。
どうすればこの問題を回避できるでしょうか?
ちょっとこの掲示板にふさわしくない質問かもしれませんが、アドバイスよろしくお願いします。 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-26 午前 10:59 |
単純に考えると、階段の回転中心をその床面の中心にすると、インコース側は主人公に近づくので、その近づいた分を考慮しないと、めり込む結果になります。アウトコースに行けば逆に次の段は遠くなります。
階段の回転(による接近)を考慮して主人公を移動させれば、よいのではないでしょうか。
川西 裕幸 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-26 午後 6:51 |
具体的には、階段の回転(による接近)を考慮しての主人公の移動とは、どのようなプログラムになるでしょうか?
|
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-26 午後 9:17 |
| d(θ) = d_original - r * sin θ |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-28 午後 6:29 |
すみません。文系なので数式で言われると弱いんです。
「d(θ)」は、求める主人公の位置。 「d_original」は、最初の主人公の位置。 「r」は、階段のZ方向の移動量。 「θ」は、階段の一つ下の階より回転した角度。
なのかと思ったのですが、うまくいきません。
よかったらプログラムでお願いできませんか?
|
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-28 午後 9:08 |
主人公は回転した階段の内側の端にいるとします(進行方向への移動のみ考えます) 「d(θ)」は、回転後の主人公と次の階段との距離。 「d_original」は、回転前の主人公と次の階段との距離。 「r」は、階段の半径あるいは直径(回転中心から端までの距離)。 「θ」は、階段の一つ下の階より回転した角度。 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-29 午前 2:47 |
やっぱりわかりません。
d(θ)が求まっても、次の階段のどこからの距離なんでしょうか?また次の階段のどの方向との距離なんでしょうか?
rは、主人公が階段の端、つまり階段の中心から半径の距離にいるからでしょうか?
ここにソースコードをアップロードしているのですが、厚かましいお願いですが、よかったらプログラムで説明していただけないでしょうか?
よろしくお願いします。
|
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-29 午後 3:53 |
川西さんの書かれている方法が分からないのであれば,階段の上に乗るようにキャラクターのY座標を階段のY座標にあわせるという方法もあるでしょう.
階段との接触判定の部分を以下のように書き換えました.
// キャラが階段から落ちていないかチェック
// 上の階段を優先するために上からチェックする
for ( i = STAIRWAY_LENGTH - 1; i >= 0; --i )
{
v = stairwayMDL[i].GetPos();
double dx = vHero.X-v.X;
double dz = vHero.Z-v.Z;
if ( Math.Sqrt(dx*dx+dz*dz) < 120 )
{
// 階段が上昇を始めたら 30 だけ上にずらす
float offset = count > 150 ? 30.0f: 0.0f;
// 階段との高さ判定
if( Math.Abs( vHero.Y + offset - v.Y ) < 80 )
{
// 階段の高さに合わせる
vHero.Y = v.Y + offset;
break;
}
}
}
// どの階段にも乗らなかった場合
if ( i < 0 )
{
sound.Play(uwaWAV,false);
ChangeScreen(GAME_OVER_SCREEN);
} あわせてキャラクターの移動部分を以下のように書き換えます.
// キャラクターの移動
heroCHA.rotate.Y += rotate;
heroCHA.transform = Matrix.Translation(0,0,4)
*Matrix.RotationY(Geometry.DegreeToRadian(heroCHA.rotate.Y))
*Matrix.Translation(vHero);
// キャラクターの描画
heroCHA.Draw(cyber3D.device); まあこれでも多少はめり込むこともありますし,カメラ移動がガクガクして見苦しいですが,一応ゲームにはなっているようなのでこの辺でいいんじゃないでしょうか?. 凝ったことをしようとすると数学が必要になるのは仕方ないかと思います.無理そうならゲームシステムの方に制限を加えるというのも1つの手でしょう.(今回の件であれば,上方向に移動せず水平移動のみというシステムにしておけばもっと簡単に済んだでしょう) 面白さを残したまま,プログラムでは無理をしないというのがゲームプログラミングでの理想でしょうね.
|
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-30 午後 4:36 |
NyaRuRuさんのやり方を試してみましたが、おっしゃるとおり、めり込むしカメラ移動がガクガクしてしまうので、やはり川西さんのやり方をプログラムで教えていただけないでしょうか?
> 上方向に移動せず水平移動のみというシステムにしておけばもっと簡単に済んだでしょう
これをすると、ゲームのタイトル「天国への階段」が意味なくなってしまいます。 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-4-30 午後 7:02 |
NyaRuRu さん、ありがとうございます。
Cyderdelia さん、コードを読んでないし、コードで説明もしませんが、今年のゴールデンウィークは長いので、中学校の数学でも思い出してがんばってください。
座標系として、現在の階段の短い辺に平行な方向を A、現在の階段の長い辺に平行な方向を B とします。
>次の階段のどこからの距離なんでしょうか?また次の階段のどの方向との距離なんでしょうか? 現在の階段の端から、次の階段の端までの、A 方向の距離。
>rは、主人公が階段の端、つまり階段の中心から半径の距離にいるからでしょうか? はい、回転中心からの B 方向のキャラクタの位置がわかれば、A方向にどの程度次の階段が近づいているのかがわかります。したがって、r は必ずしも端までの距離ではなく、階段の回転中心とキャラクタとの B 方向の距離です。
考え方は、次の階段はインコースでは近づいているので、A 方向の移動距離を制限しようということです。 制御方法はいくつか考えられます。1ステップでの移動距離を d/d_original にすれば、同じステップで d しか進まないように制御できますし。あるいは、A 方向の移動距離を変数として持たせれば、それ以上進めないように制限することもできます。
川西 裕幸 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-1 午後 5:30 |
> 回転中心からの B 方向のキャラクタの位置
これはどうやって求めればいいのでしょうか?
よくわかりませんが、図にしてみたのですが、ここにアップロードしたのですが、あっているでしょうか?
簡単なことなんでしょうが、数式だけでいわれると、やっぱりわけがわかりません。
「中学校の数学でも思い出してがんばってください」と言われると、10年前は、数学も得意だったんですが。ちょっと余計ですが、センター試験も200点満点だったし、すべりはしましたが、東大の二次も合格ラインの1問解けたんですが。
|
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-2 午後 6:30 |
次の階段のオフセットや回転中心によって式は若干変わりますが、キャラクタと次の階段との衝突位置が、r と θ の関数になるのは、わかると思います。あとは、紙と鉛筆で解くだけです。 d を「距離」と書いたのは誤解を招いているかもしれませんね。(現在の階段座標系で)回転後の次の階段との衝突位置のほうがわかりやすいでしょうか。
川西 裕幸 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-3 午後 4:00 |
ここにアップロードした図で正しいでしょうか? (更新ボタンをおさないと以前の画像が表示されるかもしれません) |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-3 午後 6:21 |
これで次の階段の回転中心を、その下側の辺にすれば、以前の式 d(θ) = d_original - r * sin θ (この場合、正確には tan θ かな)が使えますね。オフセットが必要なら後で平行移動すればよいでしょう(もちろん衝突位置も平行移動します)。
川西 裕幸 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-4 午後 3:27 |
「d(θ)」は、回転後の主人公と次の階段との距離。 「d_original」は、回転前の主人公と次の階段との距離。
のときも少し気になったのですが、階段は移動する前に、 先に回転してからZ方向にまっすぐ進ませるわけですが、
「次の階段の回転中心を、その下側の辺に」
というのは、階段のZ方向の移動が回転角によって違っ てくるので正しいのでしょうか? |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-4 午後 5:33 |
>先に回転してからZ方向にまっすぐ進ませるわけですが、 平行移動して階段を登らせているわけですから、元々の衝突位置は分かっているわけですね。 先の式(あるいはその変形)を使ってその位置を移動させればよいでしょう。 実際の移動と衝突検出のキャラクタ制御用のロジックが一致しなくても、問題ありません。
川西 裕幸 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-4 午後 6:20 |
>実際の移動と衝突検出のキャラクタ制御用のロジックが一致しなくても、問題ありません。 より正確には、「この衝突検出では、回転による相対的な変化だけを考慮すればよいので、平行移動は無視してかまわない」でした。
川西 裕幸 |
|
|
|
Re: 「天国への階段」というゲームについて 投稿日時: 2004-5-6 午後 4:42 |
それでやってみます。
何度も執拗に質問してすみませんでした。
それではありがとうございました。 |
|
|