Masalah kontrol permainan ruang atas ke bawah

8

Seperti judulnya, saya sedang mengembangkan game ruang angkasa dari atas ke bawah.

Saya tidak ingin menggunakan fisika newton dengan kapal yang dikendalikan pemain. Saya mencoba mencapai skema kontrol yang agak mirip dengan FlatSpace 2 (game keren). Saya tidak tahu bagaimana mencapai perasaan ini dengan kontrol keyboard dibandingkan dengan kontrol mouse. Ada saran?

Saya menggunakan Unity3d dan C # atau javaScript (unityScript atau apa pun istilah yang benar) berfungsi dengan baik jika Anda ingin memberikan beberapa contoh kode.

Sunting: Tentu saja saya harus menjelaskan skema kontrol FlatSpace 2, maaf. Anda menahan tombol mouse ke bawah dan menggerakkan mouse ke arah yang Anda inginkan kapal bergerak. Tapi itu bukan kontrol yang saya tidak tahu bagaimana melakukannya, melainkan perasaan campuran mengendarai mobil dan menerbangkan pesawat terbang. Ini dibuat dengan sangat baik. Tautan Youtube: FlatSpace2 di iPhone

Saya tidak mengembangkan permainan iPhone tetapi video menunjukkan prinsip gaya gerakan.
Sunting 2 Karena tampaknya ada sedikit minat, saya akan memposting versi kode yang saya gunakan untuk melanjutkan. Ini bekerja dengan cukup baik. Terkadang cukup baik sudah cukup!

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);
    }

}
Phil
sumber
2
Bisakah Anda menggambarkan skema kontrol FlatSpace 2?
4
Newton, setelah Isaac Newton.
Gregory Avery-Weir
@ Jo - Menambahkan penjelasan dan tautan.
Phil
Flatspace tampaknya menggunakan fisika "Newtonian" normal, seperti kebanyakan game. Sepertinya kapal diberi akselerasi sedang, kecepatan maksimum rendah, dan hambatan tinggi, yang memberi pengguna kendali tinggi.
BlueRaja - Danny Pflughoeft

Jawaban:

4

Jadi jika saya mengerti dengan benar, Anda ingin panah kiri dan kanan untuk mengubah kapal Anda, dan panah atas dan bawah untuk mengendalikan dorong.

Saya telah menerapkan skema kontrol ini dalam prototipe penembak ruang yang pernah saya buat.

Kode di bawah ini adalah contoh kode khusus non-bahasa yang sangat naif. Jangan menganggapnya terlalu harfiah.

EDIT: OOps, kode tidak membatasi percepatan negatif yang disebabkan oleh gesekan. Jadi kapal akan benar-benar mulai mundur setelah beberapa saat. Jadi, ubah "kode" sedikit.

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
}
Nailer
sumber
Saya mencoba untuk port ke kode tetapi tidak bisa berfungsi .. Saya yakin masalahnya adalah bahwa saya tidak bisa benar-benar mendapatkan solusi. Bagian setelah input adalah di mana Anda kehilangan saya.
Phil
Saya sarankan Anda mencari video di YouTube tentang Kinematika. Berikut ini contoh matematika di belakang: directionVector = Vector2 (cos (shipRotationAngle), sin (shipRotationAngle)) youtube.com/watch?v=rGFaVoz2Jig&feature=related
Nailer
1

saya mengonversi kode psuedo menjadi 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;
}

Jika ada yang salah dengan ini, silakan tinggalkan komentar.

Terima kasih kepada Nailer untuk menyediakan kode-psuedo

Joe the Person
sumber
Ada beberapa masalah. Saya mengoreksi mereka dan telah memposting kode yang diperbarui dalam pertanyaan saya.
Phil
@zanlok oops, sepertinya saya melewati sedikit terlalu cepat ...
Joe the Person