ニートが頑張るブログ

ニートが現実逃避するために創作活動など色々とカオスに頑張ってみる
ニートが頑張るブログ TOP  >  ニートメソッド >  衝突のしかた

衝突のしかた

なんかものすごいやる気がなくなってきた.

paraflaで3Dのゲームを作ろうとするという
多分頭のおかしいことをしてるんだろう.

どういう風にしているかメモ


 


点,テクスチャ,キャラ,影
全てのものにx座標y座標z座標を変数で持たせています.
_x_,yじゃなしに.
テクスチャは4つの点を持っていて重心が基準になっています.
それを座標変換してカメラからの距離に応じて並べて表示しています.

壁に衝突したときどうするか.
いろいろ試行錯誤した結果こんな感じになりました↓.


このゲームのマップは
すっごい適当な配列で記述できるようになってます.
地形の高さを参照するときもその配列を使ってます.

map = [
[6,5,0,7,0,"家テスト",0x331133,100],
[//高さ設定
3,3,0,0,0,1,
3,3,0,1,1,1,
0,4,5,5,4,2,
1,7,5,5,4,3,
1,4,5,5,4,3],
[//坂設定
7,6,0,0,3,0,
8,5,11,7,4,4,
4,3,3,1,1,4,
0,0,3,1,1,0,
7,3,3,1,1,0],
[]//テクスチャ設定

……
]


こんなんがステージ毎にならんだ二次元配列です.

この一つ一つの数字が
100×100の広さのセル1個の高さになってます.
主人公のx座標とz座標が分かれば
そこの位置の高さも求められます.

面=0;
横=map[4*面][0];

function 高さ教えて (x座標,z座標){
場所=Math.floor(x座標/100)+Math.floor(z座標/100)*横; //位置特定
return 高さ=map[4*面+1][場所]*100;
}


こんな感じでx座標とz座標を入れれば
高さが返ってくるような関数を作っておきます.


今までは,主人公の真下の高さしか見てなかったけど
それプラス前後左右に20ズラした位置の高さを監視するようにしました.
20は,主人公が1フレームに移動できる最大のスピードよりも大きい数字.


この例では高さ4が主人公の高さより大きいので,上れません.
主人公のz座標+=20-主人公のz座標%100;
とすることで壁から20離れたところに押し戻します.
この場合,x軸方向には干渉しないので
壁際をツツーっと歩くことが出来るようになったのです.


理屈でここまでたどり着いても,
実際組んでみても何故か思った通りに動かなかったりして
そういうのがキツイです.全然駄目だった頃↓


こんな感じで何故か壁にめり込んだり,
壁伝いで空中に浮いたり,瞬間移動したり.

そんでいろいろ直した結果,昨日のようなトコまで
動くようになったのです.


それでもまだ問題があります.
四角い壁のヘリにナナメ45度の向きで侵入した時とかです.
周囲の4点の高さをスルーしながら壁に衝突出来るからです.
そういうときは今まで通りノックバックが起こります.
アホい.

関連記事
[ 2009/05/16 21:37 ] ニートメソッド | TB(0) | CM(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

月別カレンダー
07 ≪│2017/08│≫ 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -