Cara Mendekati Ular 360 Derajat

8

Saya baru saja masuk ke XNA dan harus mengatakan saya menyukainya. Sebagai semacam game halo dunia saya memutuskan untuk membuat game klasik "Snake". Versi 90 derajat sangat sederhana dan mudah diimplementasikan. Tetapi ketika saya mencoba membuat versi yang memungkinkan rotasi 360 derajat menggunakan panah kiri dan kanan, saya mengalami masalah.

Apa yang saya lakukan sekarang berasal dari versi 90 derajat: Iterasi melalui setiap bagian tubuh ular mulai dari ekor, dan berakhir tepat di depan kepala. Ini bekerja sangat baik ketika bergerak setiap 100 milidetik. Masalah dengan ini adalah bahwa itu membuat gaya permainan berombak karena secara teknis permainan hanya berkembang pada 6 fps daripada potensi 60.

Saya ingin memindahkan ular setiap putaran permainan. Tapi sayangnya karena ular itu bergerak dengan ukuran ukuran kepalanya, ia berjalan terlalu cepat. Ini berarti bahwa kepala harus bergerak pada kenaikan yang jauh lebih kecil seperti (2, 2) ke arah itu daripada apa yang saya miliki sekarang (32, 32). Karena saya telah mengerjakan permainan ini selama beberapa minggu sambil mengelola sekolah, saya pikir saya telah berpikir terlalu keras tentang bagaimana menyelesaikan ini. Ini mungkin solusi sederhana, saya hanya tidak menangkapnya.

Berikut adalah beberapa kode semu untuk apa yang saya coba berdasarkan dari apa yang masuk akal bagi saya. Saya tidak bisa memikirkan cara lain untuk melakukannya.

for(int i = SnakeLength - 1; i > 0; i--){
    current = SnakePart[i], next = SnakePart[i - 1];

    current.x = next.x - (current.width * cos(next.angle));
    current.y = next.y - (current.height * sin(next.angle));

    current.angle = next.angle;
} 

SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;

Ini menghasilkan sesuatu seperti ini: Code in Action . Seperti yang Anda lihat, setiap bagian selalu berada di belakang kepala dan tidak membuat efek "Jejak".

Contoh sempurna dari apa yang saya akan dapat ditemukan di sini: Worm Data . Bukan rotasi viewport tetapi efek trailing dari segitiga.

Terima kasih atas bantuannya!

Austin Brunkhorst
sumber

Jawaban:

5

Dengan algoritme itu, Anda membuat setiap segmen menghadap sudut yang sama dengan yang ada di depannya. Itu sebabnya mereka semua akhirnya langsung berada di belakang kepala, mereka semua akhirnya menghadap ke sudut yang sama. Seperti yang dapat Anda lihat di game Worm Data yang Anda tautkan, setiap segmen menghadap ke segmen di depannya . Tentukan sudut dari segmen saat ini ke nextdan memiliki titik segmen seperti itu daripada mengaturnya next.angle.

Untuk implementasi itu, Anda mungkin ingin benar-benar beralih dari depan ke belakang sebagai gantinya. Perilaku akan berbeda berdasarkan arah Anda melewati daftar. Cobalah keduanya dan lihat mana yang lebih baik.

Saya telah menggunakan ide serupa untuk prototipe proyek di masa lalu ( tautan Unity WebPlayer ). Saya menggunakan kode yang serupa (walaupun 3D) untuk membuat setiap segmen beralih ke segmen di depannya dan tetap berada pada jarak yang telah ditentukan. Bekerja seperti pesona.

chaosTechnician
sumber
Itu keren! Saya membaca sebuah blog yang menggunakan konsep yang mirip dengan itu tetapi tidak berpikir untuk beralih dari depan ke belakang. Saya akan mencobanya dan menandai ini sebagai jawaban jika itu berhasil.
Austin Brunkhorst
Pembaruan: Sudah berfungsi! Butuh waktu untuk memahami konsep dan memahami apa yang sebenarnya terjadi. Sekali lagi terima kasih telah menuntun saya ke arah yang benar! Ini video kode kerjanya :) screenr.com/Fhn8 . Tidak masalah tabrakan makanan, belum menghabiskan banyak waktu untuk itu.
Austin Brunkhorst
1
Senang bisa membantu!
chaosTechnician
Tautan Anda mati.
Jeff
1
@ Jeff Rupanya Dropbox memutuskan saya entah bagaimana menggambar terlalu banyak lalu lintas, yang aneh ...
chaosTechnician