Bagaimana cara membuat karakter melompat?

44

Saat ini saya membuat game dalam C # menggunakan Direct X 9.0. Game remake adalah Donkey Kong NES. Saya hampir menyelesaikan semuanya, tetapi saya memiliki masalah dengan fisika lompatan Mario. Saya memiliki variabel yang dideklarasikan untuk koordinasi Y dan X.

Saya bertanya-tanya apakah ada metode sederhana untuk melakukan ini. Saya telah mencari tinggi dan rendah untuk jawaban tetapi jawaban yang saya temukan tidak relevan / atau menggunakan bahasa pemrograman yang berbeda seperti XNA.

Saat ini saya memiliki set variabel bool untuk memeriksa untuk melihat apakah W telah ditekan maka itu akan memicu kode apa saja untuk membuatnya melompat. Saya telah bermain-main seperti.

  if (jump == true)
    {

        Playerypos -=  vel;
        Playerxpos +=  vel;
    }

Yang tidak bekerja dengan baik. Saya telah mencari jawaban yang tinggi dan rendah dan sekarang saya putus asa, jika seseorang dapat mengarahkan saya ke arah yang benar untuk solusi sederhana. Itu akan bagus. Sangat dihargai atas tanggapan apa pun.

Sarah
sumber
5
Jawaban menggunakan bahasa pemrograman yang berbeda tidak seharusnya menimbulkan masalah. Algoritme adalah yang menarik, bukan implementasi spesifik ... kecuali Anda hanya berharap untuk menyalin & menempel tanpa memahami apa pun, yang tentu saja saya harap tidak! Mampu membaca dan mengadaptasi algoritma dari bahasa pemrograman lain adalah keterampilan yang sangat baik untuk dimiliki.
ccxvii

Jawaban:

84

Pertama-tama, XNA juga menggunakan C # juga jadi itu bahasa pemrograman yang sama. Dan meskipun API yang mendasari mungkin memiliki beberapa perbedaan dari DirectX, itu tidak ada hubungannya dengan melompat, jadi tutorial atau jawaban yang sama harus diterapkan di sini. Juga, ada banyak cara untuk mengimplementasikan ini, tergantung pada banyak faktor. Apa yang akan saya uraikan di bawah ini hanyalah salah satu kemungkinan.

Persyaratan Fisika Dasar

Pertama, Anda perlu beberapa variabel fisika dasar dan perhitungan pada loop pembaruan Anda. Secara khusus, Anda memerlukan posisi, kecepatan, dan gravitasi yang ditentukan, dan loop pembaruan Anda harus melakukan sesuatu yang mirip dengan ini (deteksi tabrakan dan respons dihilangkan untuk kesederhanaan):

float positionX, positionY;     // Position of the character
float velocityX, velocityY;     // Velocity of the character
float gravity = 0.5f;           // How strong is gravity

void Update(float time)
{
    positionX += velocityX * time;      // Apply horizontal velocity to X position
    positionY += velocityY * time;      // Apply vertical velocity to X position
    velocityY += gravity * time;        // Apply gravity to vertical velocity
}

Tetap Tinggi Lompat

Sekarang cara termudah untuk menerapkan lompatan yang selalu memiliki ketinggian yang sama, tidak peduli berapa lama Anda menekan tombol, adalah dengan mengubah kecepatan vertikal sekali. Ini akan membuat karakter mulai naik, sementara gravitasi secara otomatis akan membantu menjatuhkannya:

void OnJumpKeyPressed()
{
    velocityY = -12.0f;   // Give a vertical boost to the players velocity to start jump
}

Penting Anda tidak ingin bisa memulai lompatan jika karakter Anda tidak berada di tanah, jadi Anda harus menambahkan tanda centang untuk itu.

Tinggi Variabel Lompat

Tetapi permainan seperti Mario dan Sonic memiliki lompatan variabel di mana ketinggian lompatan tergantung pada berapa lama Anda menekan tombol ke bawah. Dalam hal ini Anda harus menangani menekan dan melepaskan tombol lompat. Anda dapat menambahkan sesuatu seperti:

void OnJumpKeyReleased()
{
    if(velocityY < -6.0f)       // If character is still ascending in the jump
        velocityY = -6.0f;      // Limit the speed of ascent
}

Tweaking semua nilai-nilai ini (yaitu angka-angka seperti 0.5, -12.0fatau -6.0f) dalam kode di atas Anda dapat mengubah nuansa lompatan Anda, seberapa tinggi ia melompat, berapa banyak momentum yang ia simpan bahkan setelah melepaskan tombol lompat, seberapa cepat ia jatuh, dll .

Penting Jangan panggil fungsi-fungsi ini setiap frame. Panggil mereka hanya sekali ketika tombol ditekan atau dilepaskan. Kalau tidak, karakter Anda akan terbang bukannya melompat.

Contoh Kerja

Saya baru saja membuat contoh cepat dari teknik yang dijelaskan di atas, yang dapat Anda coba di browser Anda di sini (tekan tombol mouse untuk melompat, lepaskan di tengah jalan untuk mengontrol ketinggian lompatan). Ada dalam JS tapi seperti yang saya sebutkan sebelumnya, bahasanya tidak relevan dalam kasus ini.

http://jsfiddle.net/LyM87/

David Gouveia
sumber
11
Boleh juga mengambil kesempatan untuk membagikan artikel menakjubkan ini yang ditulis beberapa hari yang lalu dengan informasi yang berkaitan dengan topik ini: Panduan untuk mengimplementasikan platformer 2D . Dan juga ini: Sonic Jumping .
David Gouveia
2
Artikel ini menjelaskan cara yang berbeda dalam melakukan lompatan variabel daripada yang Anda lakukan dalam jawaban Anda. Itu panggilan untuk menekan gravitasi atau terus menambahkan impuls saat tombol ditahan. Saya biasanya melakukan apa yang dikatakan David dalam jawabannya, tetapi apakah ada pemikiran salah satu metode artikel?
Jeff
@ Jeff Itu menarik perhatian saya juga, dan itulah sebabnya saya menyebutkan bahwa ada beberapa cara untuk mengimplementasikannya. Artikel pertama menjelaskan dua cara tambahan untuk menangani masalah yang sama, sedangkan cara saya jelaskan didasarkan pada artikel kedua. Saya tidak tahu bagaimana mereka membandingkan satu sama lain, meskipun salah satu dari mereka cukup mudah diimplementasikan. Pada akhirnya, saya memilih metode ini karena lebih mudah dijelaskan, dan tidak perlu menambahkan penghitung waktu atau berurusan dengan beberapa impuls dengan besaran yang semakin berkurang.
David Gouveia
Jawabannya dapat bervariasi berdasarkan game tertentu dan berapa banyak animasi yang ingin Anda lakukan. Metroid menggunakan lompatan kecepatan konstan: / descent, tetapi menutupinya dengan pekerjaan animasi berkualitas tinggi agar terlihat halus dan "melengkung" di puncaknya. Banyak platformer lain menggunakan lompatan kecepatan variabel, yang membutuhkan lebih banyak pekerjaan untuk membuatnya bekerja dengan baik.
Sean Middleditch
1
ini sangat membantu, 5 tahun kemudian :) dan hal biola ini sangat keren - saya harus belajar JS!
Fluiditas
1

Seperti dalam fisika. Hanya pada saat Anda menekan jump keydan karakter berada di tanah menambahkan kecepatan ke atas (disebut impuls), tetapi membuat karakter jatuh oleh gravitasi sepanjang waktu.

Jika Anda tidak ingin karakter melompat setiap kali menyentuh tanah - karena Anda memegang jump key- tambahkan jump key is being pressedvariabel yang Anda hapus setelah jump keydilepaskan dan ditetapkan setelah. Kodesemu:

if jump being key pressed == false && jump key just pressed
   add y velocity 
   jump being key pressed = true

if jump key released
   jump being key pressed = false

decrease velocity by gravity
check for collisions // to not penetrate ground ...

Jika saya menggunakan cara Anda:

if jump key not pressed
     jump height = 0            // imaginary height donkey would travel without gravity

if jump key pressed
     // going up
     if jump height < maximal height donkey might jump
         jump height += 5
         donkey.y    += 5        // 
     // going down
     else if jump height < 2 * maximal height donkey might jump
         jump height += 5
         donkey.y    -= 5

Bagaimana donkey.yperubahan akan tergantung pada imajinasi Anda. Kecepatannya harus semakin kecil keledai lebih tinggi di udara agar terlihat bagus.

pengguna712092
sumber