トップダウン宇宙ゲーム制御問題


8

タイトルが示唆するように、私はトップダウンの宇宙ゲームを開発しています。

プレイヤーが制御する船でニュートン物理学を使用するつもりはありません。FlatSpace 2(素晴らしいゲーム)に似た制御スキームを実現しようとしています。マウスコントロールではなく、キーボードコントロールでこの感覚を実現する方法を理解できません。助言がありますか?

Unity3dを使用していて、C#またはjavaScript(unityScriptまたは正しい用語は何か)を使用して、コード例をいくつかドロップしたい場合は問題なく動作します。

編集:もちろん、私はFlatSpace 2の制御スキームについて説明する必要があります。マウスボタンを押したまま、船を移動したい方向にマウスを動かします。しかし、それは私が操作方法を知らないコントロールではなく、車の運転と飛行機の飛行の混合感です。それは本当によくできています。YouTubeリンク:iPhoneのFlatSpace2

私はiPhoneゲームを開発していませんが、ビデオはムーブメントスタイルの原則を示しています。
編集2 少し興味があるようですので、私は継続するために使用したコードのバージョンを投稿します。十分に機能します。時々十分で十分です!

using UnityEngine;
using System.Collections;

public class ShipMovement : MonoBehaviour 
{
    public float directionModifier;
    float shipRotationAngle;
    public float shipRotationSpeed = 0;
    public double thrustModifier;
    public double accelerationModifier;
    public double shipBaseAcceleration = 0;
    public Vector2 directionVector;
    public Vector2 accelerationVector = new Vector2(0,0);
    public Vector2 frictionVector = new Vector2(0,0);
    public int shipFriction = 0;
    public Vector2 shipSpeedVector;
    public Vector2 shipPositionVector;
    public Vector2 speedCap = new Vector2(0,0);

    void Update() 
    {

   directionModifier = -Input.GetAxis("Horizontal");


   shipRotationAngle += ( shipRotationSpeed * directionModifier ) * Time.deltaTime;


   thrustModifier = Input.GetAxis("Vertical");

   accelerationModifier = ( ( shipBaseAcceleration * thrustModifier ) ) * Time.deltaTime;

   directionVector = new Vector2( Mathf.Cos(shipRotationAngle ), Mathf.Sin(shipRotationAngle) );
   //accelerationVector = Vector2(directionVector.x * System.Convert.ToDouble(accelerationModifier), directionVector.y * System.Convert.ToDouble(accelerationModifier));
   accelerationVector.x = directionVector.x * (float)accelerationModifier;
    accelerationVector.y = directionVector.y * (float)accelerationModifier;
   // Set friction based on how "floaty" controls you want

    shipSpeedVector.x *= 0.9f; //Use a variable here
    shipSpeedVector.y *= 0.9f; //<-- as well
   shipSpeedVector += accelerationVector;


   shipPositionVector += shipSpeedVector;

   gameObject.transform.position = new Vector3(shipPositionVector.x, 0, shipPositionVector.y);
    }

}

2
FlatSpace 2の制御方式を説明できますか?

4
アイザックニュートンの後のニュートニアン。
グレゴリーAvery-Weir

@Joe-説明とリンクを追加。
Phil

Flatspaceは、ほとんどのゲームと同様に、通常の「ニュートン」物理学を使用しているようです。船には中程度の加速、低い最大速度、および高い抗力が与えられており、ユーザーに高い制御を与えているようです。
BlueRaja-Danny Pflughoeft 2014

回答:


4

したがって、私が正しく理解している場合、左右の矢印で船を回転させ、上下の矢印で推力を制御する必要があります。

この制御方式は、一度作成したスペースシュータープロトタイプに実装しました。

以下のコードは、非常に単純な非言語固有のコード例です。文字どおりに受け取らないでください。

編集:OOps、コードは摩擦によって引き起こされる負の加速度を制限しません。したがって、船は実際にはしばらくして後退し始めます。「コード」を少し変更しました。

update( deltaTime ) 
{

   if( leftButtonPressed ) 
   { 
      directionModifier = 1
   }
   else if ( rightButtonPressed ) {
      directionModifier = -1
   }
   else {
     directionModifier = 0;
   }

   shipRotationAngle += ( shipRotationSpeed * directionModifier ) * deltaTime;


   if( upButtonPressed ) {
     thrustModifier = 1
   }
   else if( downButtonPressed ) {
     thrustModifier = -1
   }
   else {
     thrustModifier = 0
   }



   accelerationModifier = ( ( shipBaseAcceleration * thrustModifier ) ) * deltaTime

   directionVector = Vector2( cos( shipRotationAngle ), sin ( shipRotationAngle ) )
   accelerationVector = Vector2( directionVector.x * accelerationModifier, directionVector.y * accelerationModifier )

   // Set friction based on how "floaty" controls you want
   frictionVector = -directionVector * shipFriction

   shipSpeedVector += accelerationVector

   // APPLY friction vector to shipSpeedVector
   // Make sure that friction vector doesn't speed to go in the opposite of the 
   // original direction. Otherwise your ship will go backwards instead of stop.

   //IMPORTANT: (I'm too lazy to add code here) Cap speedvector to a maximum speed.
   //Remember to cap total speed, not just X and Y components of the speedVector 


   shipPositionVector += shipSpeedVector
}

私はそれをコードに移植しようとしましたが、それを機能させることができませんでした。問題は、私が本当にあなたの解決策を理解できないことだと確信しています。入力後の部分はあなたが私を失ったところです。
Phil

キネマティクスに関するYouTubeのビデオを検索することをお勧めします。directionVector =ベクトル2(COS(shipRotationAngle)、罪(shipRotationAngle)):ここでは背後にある数学の一例だ youtube.com/watch?v=rGFaVoz2Jig&feature=related
ネイラー


1

私は疑似コードをC#に変換しました:

void Update() 
{

   directionModifier = Input.GetAxis("Horizontal");


   shipRotationAngle += ( shipRotationSpeed * directionModifier ) * Time.deltaTime;


   thrustModifier = Input.GetAxis("Vertical");

   accelerationModifier = ( ( shipBaseAcceleration * thrustModifier ) ) * Time.deltaTime;

   directionVector = new Vector2( Math.Cos(shipRotationAngle ), Math.Sin(shipRotationAngle) );
   accelerationVector = new Vector2( directionVector.x * accelerationModifier, directionVector.y * accelerationModifier );

   // Set friction based on how "floaty" controls you want
   frictionVector = -directionVector * shipFriction;

   shipSpeedVector += accelerationVector;

   // APPLY friction vector to shipSpeedVector
   // Make sure that friction vector doesn't speed to go in the opposite of the 
   // original direction. Otherwise your ship will go backwards instead of stop.

   //IMPORTANT: (I'm too lazy to add code here) Cap speedvector to a maximum speed.
   //Remember to cap total speed, not just X and Y components of the speedVector 


   shipPositionVector += shipSpeedVector;
}

これに問題がある場合は、コメントを残してください。

擬似コードを提供してくれたNailerに感謝


いくつかの問題がありました。私はそれらを修正し、私の質問に更新されたコードを投稿しました。
Phil

@zanlokおっと、少し速すぎたように見えた...
Joe the Person
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.