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

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

ただいまの
回答率

90.33%

キャラを矢印キーの方向に回転して向かせたい時の問題...

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 467

F-hero

score 6

こんにちは。
私は専門学校でゲームプログラミングをならっているんですが、
個人で制作をしているときにある処理で何時間も詰まってしまっていて、
どなたか詳しい人にご教授を頂きたくてここに質問を書きに来ました。
どうかよろしければ、ご協力よろしくお願いします。

【やろうとしていること】
・上下左右キーを押したら、プレイヤーがその角度に向く。

という処理です。この処理自体はできたのですが、ひとつ大きな問題があって、
それが上矢印を押したときの角度が0、右が90、下が180、左が270と設定したときに、
左キーを押して、上キーを押すと、
270→0に角度が向かってしまうのです。
つまり逆回転して遠回りしてしまうという失敗です。

以下失敗コードです

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RocketGame.Actor
{
    // プレイヤーの移動を行うクラス
    class PlayerMove
    {
        private float currentDir;       // 目標角度
        private float angle;            // 現在の角度

        // プレイヤーの角度を計算するメソッド
        public float GetAngle()
        {
            // 角度を計算する
            // ★ここで代入の形で処理しているので、問題がある。
            // ★currentDir+=GetDirection();の形で、処理を行う必要がある
            currentDir = GetDirection();

            // 線形補完でなめらかに描画する
            angle = MathHelper.Lerp(angle, currentDir, 0.2f);

            return angle;
        }

        // 入力キーから角度を計算するメソッド
        private float GetDirection()
        {
            float direction;
       // Input.IsKeyHold(key)はキーを押している間trueになります。
            if (Input.IsKeyHold(Keys.Up) && Input.IsKeyHold(Keys.Right)) { direction = 45; }    // 右上
            else if (Input.IsKeyHold(Keys.Up) && Input.IsKeyHold(Keys.Left)) { direction = -45; }   // 左上
            else if (Input.IsKeyHold(Keys.Down) && Input.IsKeyHold(Keys.Right)) { direction = 135; }    // 右下
            else if (Input.IsKeyHold(Keys.Down) && Input.IsKeyHold(Keys.Left)) { direction = -135; }    // 左下
            else if (Input.IsKeyHold(Keys.Up)) { direction = 0; }   // 上
            else if (Input.IsKeyHold(Keys.Right)) { direction = 90; }   // 右
            else if (Input.IsKeyHold(Keys.Left)) { direction = -90; }   // 左
            else if (Input.IsKeyHold(Keys.Down)) { direction = 180; }   // 下
            else { direction = currentDir; } // 入力がなければ現在の角度を維持

            return direction;
        }
    }
}

以上が失敗コードです。関係ないコードは省いていますが、必要であれば言ってほしいです。

処理の課題として、
・上を向いている状態のとき下を向くと右回り左回りランダム(必須要素というわけではない)で回って真後ろを向く
・右を向いている状態のとき下キーを押したら下を向く。
・←↑→↓←...というように回転する動作をしても逆回転することがないようにしたい。
・左回り、もしくは右回り限定などの制限はない。

どうかご教授よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

現在の角度と向かせたい角度の差をとって、90,-90,270,-270 のときに回転方向を算出してその方向に向かせる処理を入れればよろしい。

この4通りのどれがどの向きか、はわかるよね?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/25 09:48

    自分にはかなり難しかったですが、やっと問題を解決することができました!
    本当にありがとうございます。助かりました。

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る