ちょっと進んだ

アバター
BEAT
記事: 4
登録日時: 14年前
住所: 兵庫県S市杜王町
連絡を取る:

ちょっと進んだ

投稿記事 by BEAT » 14年前

最近毎日日記かいてるな・・・まぁ昨日一昨日はくだらない妄想日記でしたがww

以前から「こいつ何いってるんだ?」と思われていたでしょう「座標修正処理」がちょっと進みました。

「座標修正処理」とは?
現在、俺が作ってるゲームでのシステム的問題である「敵や壁と重なってしまう」状態を解消するための処理
というカンジですかね。

で、以前の日記で「whileで当たらないところまで移動させればいいじゃない」といわれたのでやってみました。

【処理の流れ】
           敵に当たっているか→あたってない
                 ↓
              無敵状態か→通常状態
                 ↓
接触した敵とプレイヤーの位置関係を計算し修正方向を決定
                 ↓
         →→ int i=0 while(i==0)
        ↑         ↓
        ↑     接触しているか→i=1→ループ離脱
        ↑         ↓
        ↑←←修正方向に1移動

といった感じです。分かりにくいww
まぁ先ほども言ったように「当たらなくなるまで移動」ですね。

ですがコレには問題が・・・
コレはつまり、敵が自分のほうに来ても起きるわけで、「敵が自分を押していく」形になってしまうんです。

で、その状態で押される方向に敵が居たら・・・
優先順位①と②の敵が居たとして、①に②のほうに押されると
あとで処理される②のほうに重なった分が修正され、結果的に①と重なってしまうんですよね・・・

......(①っ`・ω・)っ)P´Д`)ω・`②)→(①´・ω(P´Д`)C(`・ω・´②)

こんな感じですね。うん、分かりにくいですねww

コレを改善するために「敵も無敵状態のプレイヤーと重なったら移動をやめる」
というカンジにしようと思うんですが。これをすると「無敵状態のプレイヤーが張り付いてると移動できない」
ということになってしまうんですね~(´・ω・`)

どうしたもんか・・・
最後に編集したユーザー BEAT on 2011年3月17日(木) 11:19 [ 編集 2 回目 ]

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前

Re: ちょっと進んだ

投稿記事 by MoNoQLoREATOR » 14年前

敵の方にも、障害物(プレイヤー)にあたるまで1ピクセルずつ移動させる処理を行えばいいと思いますよ。

アバター
BEAT
記事: 4
登録日時: 14年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: ちょっと進んだ

投稿記事 by BEAT » 14年前

「プレイヤーと当たる」ということだけを判定基準にすると無理っぽいです(´・ω・`)

「敵の進行方向とプレイヤーの進行方向」を基準に考えたほうがよさそうです。

あまり上手く説明できませんが

アバター
MNS
記事: 35
登録日時: 14年前

Re: ちょっと進んだ

投稿記事 by MNS » 14年前

お互い押し合ってしまうようになると、解決は難しいでしょうね。
どうしても重なってしまうのが困る場合なら、
やはり、動かしてからズラすよりも、
当たるようなら動かない処理を実装するほうが懸命でしょうね。
(その予測は大して難しいことではありませんが、衝突しなくなります。)

でも、この場合なら、プレイヤーが無敵な状態なときは、
障害物だけ判定して、敵とは判定しないようにすればうまくいきませんかね?

アバター
BEAT
記事: 4
登録日時: 14年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: ちょっと進んだ

投稿記事 by BEAT » 14年前

すみません、もうちょっと詳しく説明いただけますか?

アバター
MNS
記事: 35
登録日時: 14年前

Re: ちょっと進んだ

投稿記事 by MNS » 14年前

どういうゲームを作っているのかいまいちイメージをつかめていないので、
わりと的外れなことを言っているかもしれませんが…

現在の、ゲームの流れ[ループ]は次のようになっているのではないかと思います。

プレイヤーを動かす → 敵を動かす → 座標を修正する → 戻る

これを、以下のような処理に変えます。

プレイヤーの移動量を計算
→ 移動先の座標を計算
→ その座標においてプレイヤーが障害物に
     重なる → 移動させない(移動量を加算しない)
     重ならない → 移動させる(移動量を加算)
→ 同様のことを敵にも。

こうすれば、そもそも障害物がある位置にキャラクターが存在できなくなるので、
必然的にキャラクターが障害物にめりこむことも無くなります。

無敵云々に関しては、たとえば敵がプレイヤーにめり込んでもよいゲームの話で、
例えばマリオのようなゲームなら、敵とぶつかったら、プレイヤーは死ぬか無敵状態になって、
そのままプレイヤーと敵に衝突判定はなくなり、重なります。
こういうゲームの場合は、上の処理方法はうまく働かない可能性もあります。

アバター
BEAT
記事: 4
登録日時: 14年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: ちょっと進んだ

投稿記事 by BEAT » 14年前

あ、そうか!
今作ってるゲームは
プレイヤーの仮移動→敵の仮移動
→プレイヤーが敵と当たっているか→当たっていてかつ無敵状態なら→座標を修正
ってしてるんですが

プレイヤー仮移動→進める場所かどうか
敵の仮移動→進める場所かどうか
という風に別々の処理にしたほうがよさそうですね。
1つの処理で行っていたから問題が出ていたわけですね。

MNSさんのアドバイスをちゃんと理解できているか不安ですが。こんな感じですかね?

アバター
MNS
記事: 35
登録日時: 14年前

Re: ちょっと進んだ

投稿記事 by MNS » 14年前

はい、おそらくそれで出来るでしょう。
ただし、今までプレイヤー1つ分で計算していたものを、敵の数分計算することになるので、
負荷が増えた場合には色々と別のテクニックを使う必要も生じるかもしれません。
(全キャラクタ数をNとすると、今までN回行っていたの衝突判定が、N*N回行うになります)

アバター
BEAT
記事: 4
登録日時: 14年前
住所: 兵庫県S市杜王町
連絡を取る:

Re: ちょっと進んだ

投稿記事 by BEAT » 14年前

なるほど、よかった

プレイヤーと敵N体との当たり判定に加えて
敵N体の当たり判定も行わなければなりませんからね・・・

まぁそうなったらそうなったでがんばりますww
ありがとうございました!

ISLe
記事: 2650
登録日時: 14年前

Re: ちょっと進んだ

投稿記事 by ISLe » 14年前

最初にのけぞりと書かれた日記を読んだときに、挟まれたときの処理だと思ってました。
敵がのけぞると当たり判定の幅が大きくなってプレイヤーを押し返すことになる状況を想像してました。
やっぱり根本的に勘違いしてたようです。

補正して右に移動したら、左には動けないフラグを立てて、次の1フレームは『当たった相手の』動けない方に補正しない
というふうに上下左右に対して行うと瞬間的にめり込みますが端から順に補正されていきます。
見た目には一瞬なので気にならないと思いますけど。

あとめり込む前提で処理すると、敵に張り付いたり囲まれたりしているときに、プレイヤーの攻撃に当たり判定を持たせれば、敵を後退させたりふっ飛ばしたりするのが簡単にできます。

何回もループ回さなくても、キャラクターの移動処理と座標の補正処理はまとめて行えば良いですよ。