質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1761閲覧

プレイヤーの水平移動時に地面との衝突(反射)が発生してしまいます

konsukeyama

総合スコア12

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2017/05/30 21:52

SwiftでSpriteKitを使って、スーパーマリオのような横スクロール型アクションゲームを作りたいのですが、プレイヤーの水平移動時に、まれに地面と衝突(反射)が発生してしまい、プレイヤーを滑らかに動かすことができず、困っております。

<主な物理設定>

  • シーンの重力(gravity) = Y方向のみ: -9.8
  • プレイヤーと地面の摩擦係数(Friction) = 0.2
  • プレイヤーと地面の反射係数(Restitution) = 0
  • プレイヤーの移動は、applyForce()でX方向の力を加えることで行っています。

update()でプレイヤーの水平移動時の力の発生をモニタしてみると、基本的にY方向の力(velocity.dy)は0で推移するのですが、ふとしたタイミングでY方向のプラスの力が発生し、そのタイミングで衝突が発生してプレイヤーがピクッと動いてしまいます。
これはSpriteKitの特性上どうしようもないものでしょうか?

このようなご経験をお持ちの方がいらっしゃいましたら、どんな事でも構いませんのでアドバイスいただけますと幸いです。
どうぞよろしくお願いいたします。

Bongo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

昨晩ちょっと試してみましたが、今ひとつ目に見えるほどの違和感は現れなかったんですよね...単なる正方形と水平の地面でやったのですが、形状の違いのせいでしょうか?
ただ、速度Y成分の微妙な変動は観察されました。SpriteKitに限らず、この手の物理シミュレーションで多少の誤差が発生するのは仕方ないものと考えるべきかと思います。

対策案としてはありきたりかもしれませんが、ご製作中のゲームがスーパーマリオ的なものならば、プレイヤーがジャンプするアクションを実装されているでしょうか。この際の、ジャンプ可能かどうか(プレイヤーの足が地に着いているかどうか)の判定機構を流用して、足が地に着いている場合にはUpdate内で速度Y成分を強制的に0にしてしまう、というのはどうでしょう(ただしジャンプする瞬間は除いて)。
もっとも、もしこの意図しないガタツキによって、地上空中判定も影響を受ける場合はうまくいかないかもしれませんが...

投稿2017/06/01 06:49

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

konsukeyama

2017/06/01 12:11

検証までしていただき、ありがとうございます。 ゲーム作成自体に慣れておらず、些細なことでもアドバイスいただくと大変ありがたいです。 地面との接地判定を用いるという件、勉強になります。ぜひ試してみたいと思います。 ちなみに制作(というか公開されているサンプルを検証している段階ですが...)はこちら(↓)になります。左右スワイプで移動、ジャンプボタンでジャンプします。 お手すきのときで構いませんので、挙動の確認などにどうぞ。 https://github.com/konsukeyama/GameApp_proto
konsukeyama

2017/06/01 21:41 編集

プレイヤーが空中でない場合にプレイヤーの少し下の座標を調べ、それが地面だったら「接地」と判定し、接地中はY方向の力を強制的に0にしたところ、プレイヤーを滑らかに動かすことができました! 上り坂や下り坂の場合にどうなるかまだ未検証ですが、とりあえず数日間悩んでいた問題をクリアすることができました。 アドバイスいただき、ありがとうございました。
Bongo

2017/06/01 22:21

解決されたようで何よりです。質問者さんのおっしゃるように、衝突判定に遊び領域を設けて誤差を吸収させるのが無難そうですね。坂道となると今度はY方向の動きも考慮しなければならないので厄介になるかもしれませんが、やりがいがありそうです。 ※ゲーム拝見しました。なかなかうまくできており、こちらも勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問