Vấn đề kiểm soát trò chơi từ trên xuống


8

Như tiêu đề cho thấy tôi đang phát triển một trò chơi không gian từ trên xuống.

Tôi không muốn sử dụng vật lý newtonian với con tàu do người chơi điều khiển. Tôi đang cố gắng đạt được sơ đồ điều khiển hơi giống với FlatSpace 2 (trò chơi tuyệt vời). Tôi không thể tìm ra cách để đạt được cảm giác này với các điều khiển bàn phím trái ngược với điều khiển chuột. Bất kỳ đề xuất?

Tôi đang sử dụng Unity3d và C # hoặc javaScript (unityScript hoặc bất cứ điều gì là thuật ngữ chính xác) hoạt động tốt nếu bạn muốn bỏ một số ví dụ mã.

Chỉnh sửa: Tất nhiên tôi nên mô tả sơ đồ điều khiển của FlatSpace 2, xin lỗi. Bạn giữ nút chuột xuống và di chuyển chuột theo hướng bạn muốn con tàu di chuyển. Nhưng đó không phải là điều khiển tôi không biết làm mà là cảm giác pha trộn giữa lái xe và lái máy bay. Nó thực sự được thực hiện tốt. Liên kết Youtube: FlatSpace2 trên iPhone

Tôi không phát triển trò chơi iPhone nhưng video cho thấy nguyên tắc của phong cách di chuyển.
Chỉnh sửa 2 Vì dường như có một chút quan tâm, tôi sẽ đăng phiên bản mã tôi đã sử dụng để tiếp tục. Nó hoạt động đủ tốt. Đôi khi đủ tốt là đủ!

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
Bạn có thể mô tả sơ đồ điều khiển của FlatSpace 2 không?

4
Newton, sau Isaac Newton.
Gregory Avery-Weir

@Joe - Thêm giải thích và liên kết.
Phil

Không gian căn hộ dường như sử dụng vật lý "Newton" bình thường, giống như hầu hết các trò chơi. Có vẻ như tàu được tăng tốc trung bình, tốc độ tối đa thấp và lực kéo cao, giúp người dùng kiểm soát cao.
BlueRaja - Daniel Pflughoeft

Câu trả lời:


4

Vì vậy, nếu tôi hiểu chính xác, bạn muốn mũi tên trái và phải quay tàu của bạn, và mũi tên lên và xuống để kiểm soát lực đẩy.

Tôi đã thực hiện sơ đồ điều khiển này trong một nguyên mẫu game bắn súng không gian mà tôi đã thực hiện một lần.

Các mã dưới đây là ví dụ mã cụ thể phi ngôn ngữ rất ngây thơ. Đừng hiểu theo nghĩa đen.

EDIT: OOps, mã không giới hạn gia tốc âm do ma sát. Vì vậy, con tàu sẽ thực sự bắt đầu đi lùi sau một thời gian. Vì vậy, thay đổi "mã" một chút.

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
}

Tôi đã cố gắng chuyển nó thành mã nhưng không thể làm cho nó hoạt động được .. Tôi chắc chắn rằng vấn đề là tôi thực sự không thể hiểu được giải pháp của bạn. Phần sau đầu vào là nơi bạn mất tôi.
Phil

Tôi khuyên bạn nên tìm kiếm video trên YouTube về Động học. Đây là một ví dụ về toán học đằng sau: directionVector = Vector2 (cos (shipRotationAngle), sin (shipRotationAngle)) youtube.com/watch?v=rGFaVoz2Jig&feature=related
Nailer


1

tôi đã chuyển đổi mã psuedo thành 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;
}

Nếu có điều gì sai với điều này, xin vui lòng để lại nhận xét.

Cảm ơn Nailer đã cung cấp mã psuedo


Có một số vấn đề. Tôi đã sửa chúng và đã đăng mã cập nhật trong câu hỏi của tôi.
Phil

@zanlok ôi, hình như tôi đã trải qua một chút quá nhanh ...
Joe the Person
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.