Problema di controllo del gioco spaziale top down


8

Come suggerisce il titolo, sto sviluppando un gioco spaziale top down.

Non sto cercando di usare la fisica newtoniana con la nave controllata dal giocatore. Sto cercando di ottenere uno schema di controllo in qualche modo simile a quello di FlatSpace 2 (gioco fantastico). Non riesco a capire come ottenere questo feeling con i controlli da tastiera invece dei controlli del mouse. Eventuali suggerimenti?

Sto usando Unity3d e C # o javaScript (unityScript o qualunque sia il termine corretto) funziona bene se si desidera eliminare alcuni esempi di codice.

Modifica: ovviamente dovrei descrivere lo schema di controllo di FlatSpace 2, scusa. Tieni premuto il pulsante del mouse e muovi il mouse nella direzione in cui vuoi che si muova la nave. Ma non sono i comandi che non so come fare, ma piuttosto la sensazione di un mix di guidare un'auto e far volare un aereo. È davvero ben fatto. Link Youtube: FlatSpace2 su iPhone

Non sto sviluppando un gioco per iPhone ma il video mostra il principio dello stile di movimento.
Modifica 2 Poiché sembra esserci un leggero interesse, posterò la versione del codice che ho usato per continuare. Funziona abbastanza bene. A volte è abbastanza buono!

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
Puoi descrivere lo schema di controllo di FlatSpace 2?

4
Newton, dopo Isaac Newton.
Gregory Avery-Weir,

@Joe - Aggiunti spiegazione e collegamento.
Phil

Lo spazio piatto sembra usare la normale fisica "newtoniana", come la maggior parte dei giochi. Sembra che le navi ricevano un'accelerazione media, una bassa velocità massima e un'elevata resistenza, che offre all'utente un controllo elevato.
BlueRaja - Danny Pflughoeft,

Risposte:


4

Quindi, se ho capito bene, vuoi che le frecce sinistra e destra ruotino la tua nave e le frecce su e giù per controllare la spinta.

Ho implementato questo schema di controllo in un prototipo di sparatutto spaziale che ho realizzato una volta.

Il codice seguente è un esempio di codice specifico non linguistico molto ingenuo. Non prenderlo troppo alla lettera.

EDIT: OOps, il codice non limita l'accelerazione negativa causata dall'attrito. Quindi la nave inizierà effettivamente a tornare indietro dopo un po '. Quindi ho cambiato un po 'il "codice".

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
}

Ho provato a portarlo sul codice ma non sono riuscito a farlo funzionare. Sono sicuro che il problema è che non riesco davvero a capire come risolvere la tua soluzione. La parte dopo l'input è dove mi hai perso.
Phil

Ti suggerisco di cercare video su YouTube sulla cinematica. Ecco un esempio della matematica dietro: directionVector = Vector2 (cos (shipRotationAngle), sin (shipRotationAngle)) youtube.com/watch?v=rGFaVoz2Jig&feature=related
Nailer


1

ho convertito il codice psuedo in 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;
}

Se c'è qualcosa di sbagliato in questo, ti preghiamo di lasciare un commento.

Grazie a Nailer per aver fornito psuedo-code


Ci sono stati alcuni problemi. Li ho corretti e ho pubblicato il codice aggiornato nella mia domanda.
Phil

@zanlok oops, mi sembrava di averlo superato un po 'troppo in fretta ...
Joe the Person il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.