Mencegah bencana yang berlebihan dalam game balapan

9

Saat bermain GTA III di Android, saya perhatikan ada sesuatu yang mengganggu saya di hampir setiap gim balap yang pernah saya mainkan (mungkin kecuali Mario Kart): Mengemudi lurus ke depan itu mudah, tetapi kurva sangat sulit. Ketika saya berpindah jalur atau melewati seseorang, mobil mulai berputar bolak-balik, dan segala upaya untuk memperbaikinya membuatnya semakin buruk. Satu-satunya hal yang bisa saya lakukan adalah menginjak rem. Saya pikir ini semacam oversteering.

Apa yang membuatnya sangat menjengkelkan adalah bahwa hal itu tidak pernah terjadi pada saya dalam kehidupan nyata (terima kasih Tuhan :-)), jadi 90% game dengan kendaraan di dalamnya terasa tidak nyata bagi saya (walaupun mungkin memiliki mesin fisika yang sangat bagus). Saya sudah bicara dengan beberapa orang tentang ini, dan sepertinya Anda 'mendapatkan' game balap, atau tidak. Dengan banyak latihan, saya berhasil mendapatkan semi-bagus di beberapa game (misalnya dari seri Need for Speed), dengan mengemudi sangat hati-hati, pengereman banyak (dan biasanya mendapatkan kejang di jari-jari saya).

Apa yang dapat Anda lakukan sebagai pengembang game untuk mencegah bencana resonansi oversteering, dan membuat berkendara terasa benar? (Untuk gim balap santai, itu tidak mengusahakan 100% fisika realistis)

Saya juga bertanya-tanya permainan seperti apa yang dilakukan Super Mario Kart secara berbeda sehingga mereka tidak memiliki terlalu banyak oversteering?

Saya kira satu masalah adalah bahwa jika Anda bermain dengan keyboard atau layar sentuh (tetapi tidak roda dan pedal), Anda hanya memiliki input digital: gas ditekan atau tidak, kemudi kiri / kanan atau tidak, dan itu jauh lebih sulit untuk mengarahkan dengan tepat untuk diberikan kecepatan. Hal lainnya adalah Anda mungkin tidak memiliki kecepatan yang baik, dan berkendara lebih cepat dari yang Anda bayangkan (aman). Dari atas kepala saya, salah satu solusinya mungkin dengan memvariasikan respons kemudi dengan kecepatan.

jdm
sumber
3
Anda juga perlu mempertimbangkan siapa audiens target Anda. Jika penggila gemar mengemudi, Anda hanya akan mengasingkan mereka dengan 'memperbaiki' kenyataan. Anda mungkin tidak membalap mobil, dan tidak mengerti bahwa pada kecepatan tinggi dari suatu perlombaan masalah yang Anda alami adalah hal yang sangat nyata yang merupakan masalah bagi pembalap sejati. 'Perbaikan' yang sebenarnya adalah menjadi lebih kasual, dan itulah yang dilakukan Mario Kart berbeda. Mereka lebih longgar dengan fisika dan tidak memodelkan kekuatan yang dibutuhkan untuk membuat buntut ikan, dan karenanya tidak menarik bagi penggemar game mengemudi hardcore.
DampeS8N
Saya tidak tahu betapa mudahnya Anda memiliki akses ke ini, tetapi berpikir itu mungkin membantu. Saya memainkan permainan PSX dulu bernama Formula One .. mereka membuat beberapa dari mereka tapi itu yang pertama. Bagaimanapun itu adalah simulasi, tetapi opsi memiliki kemudi dan melanggar opsi bantuan dengan slider yang dapat Anda tambahkan atau kurangi. Jadi, jika Anda memiliki assist patah sangat tinggi misalnya, mobil Anda akan pecah secara otomatis jika terlalu cepat, dan itu juga akan mengarahkan Anda (tergantung pada seberapa banyak assist yang Anda inginkan), jadi Anda mungkin ingin memeriksa itu untuk solusi.
wardd

Jawaban:

7

Salah satu solusinya adalah sedikit menipu dan menebak apa yang ingin dilakukan pemain. Ketika pemain berada di bagian lurus dan menekan ke kiri, Anda dapat mengasumsikan bahwa ia ingin pindah jalur. Ketika dia dekat dengan kurva atau persimpangan, dia pasti ingin berbelok. Pemain tidak dapat mengendalikan sudut kemudi yang tepat dalam sebuah kurva, sehingga Anda dapat memutuskan untuk memberikan pemain keraguan dan selalu membiarkannya mengemudi melalui kurva di sudut yang ideal ketika ia menekan tombol belok pada saat yang tepat (selama sebagai mungkin secara fisik - setiap pemain yang mencoba mengemudi dengan melalui kurva jepit rambut dengan 200 km / jam layak dihukum dengan penerbangan pendek di atas rumput).

Ini, tentu saja, bisa menjadi rumit ketika pemain benar-benar ingin berbalik pada bagian lurus atau benar-benar ingin mengganti jalur sebelum persimpangan.

Solusi lain adalah memiliki perbedaan antara mengetuk kunci dan memegang kunci. Semakin lama pemain menahan tombol putar, semakin tinggi sudut belok. Ini bahkan tidak terasa tidak realistis, karena ketika Anda memiliki setir, Anda perlu waktu untuk mengubahnya sepenuhnya.

Sunting: Pada layar sentuh, Anda dapat menggunakan bilah geser alih-alih tombol untuk mengontrol kemudi dan kecepatan secara analog. Saat layar peka terhadap tekanan, Anda juga bisa menginterpretasikan tekanan (tapi berikan umpan balik visual pada tekanan maksimum, atau pemain yang terlalu bersemangat mungkin merusak display mereka). Saat perangkat memiliki sensor orientasi, Anda dapat menggunakan memiringkan perangkat untuk mengontrol kemudi.

Philipp
sumber
Terima kasih atas koreksi Anda, @kotekzot. Tetapi Anda dapat menyarankan pengeditan ke pos orang lain secara langsung tanpa harus meminta mereka.
Philipp
ide kamu bagus. Ketika tombol kanan ditekan (0/1), itu akan memutar mobil dengan sudut yang tergantung pada kurva. Tepat seperti saat Anda mengemudi: Anda mengatakan 'saya belok kiri' (0/1) tetapi sebenarnya Anda akan memutar setir lebih atau kurang tergantung pada kemiringannya. Dan juga sesuatu yang layak disebut: sudut berangsur-angsur berubah, tidak tiba-tiba.
GameAlchemist
0

Saya menemukan pertanyaan (lama) ini saat meneliti game apa yang telah diterapkan selain Grand Theft Auto IV dan V, tetapi saya memiliki jawaban yang layak untuk mencapai oversteer yang terkendali. Saya hanya memiliki beberapa pengalaman bermain-main dengan model mengemudi di Grand Theft Auto V, tetapi informasi ini harus berlaku untuk model mengemudi paling realistis.

Apa yang tampaknya terjadi di sebagian besar game mengemudi, adalah bahwa output kemudi mobil langsung dikaitkan dengan input pemain - bahkan jika semacam penghalusan (sementara) digunakan. Ini menyebabkan perasaan lamban atau perasaan tersentak - dan mobil tidak memperbaiki dirinya sendiri setelah melepaskan kontrol. Ini berbeda dengan mobil sungguhan, di mana mobil cenderung memusatkan dirinya setelah melepaskan kekuatan pada roda. Beberapa gim mencoba memperbaikinya dengan mengubah model penanganannya atau menggunakan model penanganan arcade.

Apa yang dapat diamati dalam Grand Theft Auto V, adalah input kemudi pengguna tidak secara langsung terkait dengan output kemudi. Kendaraan mengarahkan dengan sendirinya, menuju vektor kecepatan saat ini. Ini terlihat ketika memaksa situasi sedikit oversteer dan mengamati roda kemudi - tanpa input, mereka melawan sendiri. Setiap input pengguna kemudian ditambahkan di atas koreksi "alami" ini.

Kelemahan dari pendekatan ini, adalah mobil terasa terlalu lengket dan agak keras kepala untuk masuk ke powerslide atau drift - sehingga nilai countersteer ini dapat dibatasi pada beberapa sudut.

Teori ini dapat diverifikasi dengan menerapkan kembali sistem kemudi dan membandingkannya dengan perilaku asli.

  • Ketika menghubungkan input ke output secara langsung, kendaraan memang sangat sulit dikendalikan, bahkan ketika telah menerapkan pembatas input kemudi berbasis kecepatan.
  • Ketika menambahkan countersteer alami, perilakunya hampir identik dengan implementasi gim, tetapi mobil "terlalu" stabil.
  • Ketika menambahkan batas 15 derajat untuk countersteer, perilaku ini hampir identik.

Satu hal yang perlu diingat adalah bahwa Grand Theft Auto V dianggap "ideal" di sini - meskipun saya belum menemukan game lain yang mengimplementasikan sistem ini.

Jika Anda penasaran dengan beberapa kode, berikut cuplikan implementasi saya.

// Returns in radians
float Racer_calculateDesiredHeading(float steeringMax, float desiredHeading,
    float reduction) {
    desiredHeading *= reduction;
    float correction = desiredHeading;

    // Get the relative velocity vector
    Vector3 speedVector = ENTITY::GET_ENTITY_SPEED_VECTOR(vehicle, true);
    if (abs(speedVector.y) > 3.0f) {
        // Simplify it to an angle
        Vector3 target = Normalize(speedVector);
        float travelDir = atan2(target.y, target.x) - static_cast<float>(M_PI) / 2.0f;
        if (travelDir > static_cast<float>(M_PI) / 2.0f) {
            travelDir -= static_cast<float>(M_PI);
        }
        if (travelDir < -static_cast<float>(M_PI) / 2.0f) {
            travelDir += static_cast<float>(M_PI);
        }
        // Correct for reverse
        travelDir *= sgn(speedVector.y);

        // Limit to some degree, R* uses 15 degrees
        travelDir = std::clamp(travelDir, deg2rad(-15.0f), deg2rad(15.0f));

        // User input deviation
        correction = travelDir + desiredHeading;
    }

    return std::clamp(correction, -steeringMax, steeringMax);
}
ikt
sumber