Melampaui Proyek Game "Novice"


22

Saya membaca jawaban ini tentang jenis matematika yang harus diketahui pengembang game dan bagian ini sangat menonjol bagi saya:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

Itulah bagaimana saya berpikir untuk melakukannya, jadi saya kira itu menunjukkan tingkat keahlian saya. Setidaknya untuk jenis 2D side-scrolling, game arcade-style yang saya buat di masa lalu, itu saja yang saya butuhkan. Itu dan sedikit trigonometri.

Sebenarnya, saya belum menggunakan banyak aljabar linier atau bahkan mendengar angka empat sebelum membaca posting itu. Apakah karena matematika ini tidak muncul sampai Anda bekerja dengan 3D atau itu karena game 2D saya cukup sederhana sehingga saya lolos dengan implementasi yang naif.

Pertanyaan tindak lanjut: Jika saya ingin terbiasa dengan jenis matematika itu, jenis proyek apa yang harus saya lakukan? IE: menulis mesin gim, mengerjakan gim 3D, dll.


1
khanacademy.org sangat bagus untuk belajar matematika pemula dan lanjutan. Plus ada prestasi! Tidak ada yang seperti teori permainan untuk menghidupkan akademisi yang membosankan.
decaviatedcaviar

Jawaban:


16

Trik sebenarnya dengan ini adalah sains tingkat sekolah menengah; yang seharusnya Anda lakukan. Jika Anda tidak melakukan pencarian cepat Google akan membantu Anda memulai . Untuk menjelaskan bagaimana Anda menghindari pola pikir 'pemula', ambil contoh pendarat bulan .

Setelah Anda membaca bahwa [change in position] = [velocity] * [time passed]menjadi jelas bahwa Anda perlu melacak variabel-variabel tersebut:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

Setelah itu, Anda cukup menerapkan kecepatan ke posisi setiap frame:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Sekarang kami ingin mengubah kecepatan setiap frame sehingga kami dapat menambah gravitasi. Menurut sumber yang sama persis [change in velocity] = [acceleration] * [time passed]. Karena itu kita dapat menerapkan prinsip yang sama persis:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

Sekarang Anda membutuhkan cara bagi pemain untuk mengendalikan pesawat ruang angkasa. Dari membaca lebih lanjut tentang fisika dasar, Anda akan belajar bahwa gerak adalah hasil dari kekuatan - saya tidak dapat menemukan sumbernya tetapi [change in acceleration] = ([force] / [mass]) * time(sejauh yang saya ingat). Jadi ketika pemain menekan tombol, Anda cukup mengatur fxdan fyvariabel untuk sesuatu dan menerapkan persamaan selama pembaruan Anda.

Pada akhirnya Anda perlu memikirkan fisika di sekitar objek dalam gim Anda - dan alih-alih mencoba membuatnya bergerak sesuai cara yang Anda pikirkan, lebih baik mencari persamaannya .

Catatan di Masa Depan: Ingatlah bahwa ini jelas bukan cara terbaik untuk melakukan fisika (ini disebut Euler Integration dan dapat menyebabkan beberapa skenario aneh pada frame rate rendah) - Anda perlu melihat ke cara lain dalam melakukan sesuatu (Artikel itu memiliki cukup banyak artikel bagus tentang dasar-dasar telanjang). Namun, tetaplah dengan Euler Integration untuk saat ini, karena itu artinya Anda mencoba untuk belajar satu hal lebih sedikit.

Game mana yang akan mengajarkan Anda bagaimana cara berpikir dengan pola pikir yang benar?

Bagaimana Anda menguji bahwa Anda telah melakukan hal-hal dengan benar dan dengan pola pikir yang benar? Masukkan Sleep(10 milliseconds)dalam lingkaran permainan Anda dan semuanya masih harus bergerak dan bereaksi dengan cara yang sama seperti framerate penuh.

Akhirnya, harap jauhkan dari 3D (dan oleh karenanya Kuarter dan Matriks) sampai Anda memiliki pengalaman yang baik dalam membuat game 2D berfungsi. Saya berani mengatakan bahwa beberapa pengembang game tidak benar-benar tahu cara kerja Quaternions atau Matrices - tetapi hanya tahu cara menggunakannya - mendekati mereka nanti (atau tidak pernah sama sekali, game 2D sangat menyenangkan dan bisa sangat berhasil). Anda tidak benar-benar perlu tahu aljabar linier dan sebagainya untuk melakukan ini di tingkat dasar (tetapi itu benar-benar membantu, jadi pergilah ke beberapa kelas malam jika Anda bisa).

Bonus terakhir: Satu hal yang selalu dikatakan guru seni saya adalah "jangan menggambar apa yang Anda pikir Anda lihat, menggambar apa yang Anda lihat." Hal yang sama berlaku di sini "jangan memodelkan apa yang Anda pikir terjadi ( object.position++), memodelkan apa yang terjadi (` object.position + = kecepatan * waktu) "- setidaknya ke batas yang wajar (Anda tidak memodelkan sistem yang sangat akurat, tetapi membuat sesuatu yang merupakan tiruan yang baik).


Saya suka ide Anda memasukkan lag buatan untuk pengujian. Juga, gravitasi Bumi 9,8, bukan 9,1
Steve

Berhati-hatilah dengan "jangan memodelkan apa yang menurut Anda terjadi, memodelkan apa yang terjadi" kecuali jika Anda menulis simulasi yang sebenarnya. Skala yang diperlukan untuk proyek Anda. Terkadang "apa yang Anda pikirkan terjadi" adalah jawaban yang bagus untuk desain Anda.
chaosTechnician

@chaosTechnician pada level ini "apa yang menurut Anda terjadi" adalah object.position++. Saya akan mengklarifikasi jawabannya.
Jonathan Dickinson

-1 untuk instead of trying to make them move in the way you would think, rather look up the equation. Ini tentang memahami persamaan, bukan mencari mereka. Yang paling penting adalah membuat gim ini menyenangkan, dan siapa tahu, mungkin Anda akan menemukan beberapa percepatan variabel yang membuat gravitasi lebih menyenangkan. Tetapi akan sangat sulit untuk memikirkan bagaimana melakukan itu jika Anda tidak memahami persamaannya.
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft itulah yang saya jelaskan kepadanya: tidak mengetahui persamaan di tempat pertama berarti Anda tidak pernah bisa memahaminya - dan satu-satunya cara untuk memahaminya adalah dengan menggunakannya dalam situasi nyata.
Jonathan Dickinson

3

Saya pikir sebagian dari jawaban yang Anda tautkan agak elitis dalam presentasi mereka. Memuji kebajikan matematika vektor kemudian mengatakan suatu objek membutuhkan posisi, arah, dan akselerasi tidak spesifik karena itu benar-benar hanya akan berujung pada sesuatu seperti object.position.x += (object.velocity.x + object.acceleration.x) * deltaTime— yang, pada dasarnya, tidak jauh berbeda dari itu object.position.x++. Quaternion adalah salah satu dari banyak cara untuk mewakili rotasi; Saya suka mereka tetapi mereka tidak penting untuk memahami rotasi 3D. Terlepas dari apa yang akan disiratkan oleh banyak pengguna Quaternion, mereka bukan Cawan Suci matematika rotasi.

Prinsip-prinsip aljabar linier hadir dalam gerakan 2D sederhana, rotasi, dll. Tetapi matematika lebih sederhana karena hanya ada dua dimensi. Ini sebuah contoh .

Ada banyak cara untuk mempelajari / meningkatkan pengetahuan Anda tentang aljabar linier:

  1. Saya telah mempertimbangkan mengambil kursus dalam aljabar linier tetapi beban saya sudah cukup berat jadi saya belum bisa membenarkan pekerjaan tambahan.
  2. Pemahaman saya tentang aljabar linier telah tumbuh jauh lebih signifikan karena saya telah mengambil serangkaian kelas pemrograman mesin game. Bagi saya, penggunaan Vektor, Matriks, dll. (Secara umum) lebih lazim di sisi mesin daripada di sisi game. Tentu saja, itu bukan berarti saya belum menggunakan matriks dalam kode permainan — saya hanya tidak menggunakannya sesering yang saya miliki dalam pengkodean mesin. ymmv
  3. Ada juga banyak buku yang dapat membantu Anda memahami matematika yang perlu Anda ketahui juga. Saya suka buku ini yang memiliki bab berjudul "Matematika 3D untuk Permainan."

Terakhir, jika desain gim Anda tidak membutuhkan matematika yang rumit, jangan gunakan itu. :) Tapi, tentu saja, jangan biarkan itu menghentikan Anda dari menggali ke dalam merancang game yang melakukannya.


0

Quaternions untuk 2D akan lengkap berlebihan, belum lagi komputasi terlalu mahal. Rotasi bitmap (2D) ditangani oleh banyak platform / perpustakaan besar secara implisit, karena itu sangat mendasar untuk menulis aplikasi apa pun, dan bahkan di mana pun tidak, rotasi bitmap 2D tidak lebih dari sedikit pemicu sederhana. Dalam 3D, segala sesuatunya menjadi kurang intuitif bagi manusia pada umumnya, kecuali tentu saja manusia tumbuh dengan menulis kode 3D ketika mereka seharusnya keluar dengan mengendarai sepeda.

Aljabar linier berlaku untuk 2D seperti halnya untuk 3D dan harus menjadi sesuatu yang Anda kenal bahkan jika Anda hanya mengerjakan matematika SMP. Jika Anda pernah melakukan persimpangan garis, atau merencanakan garis secara berkala (integrasi), maka Anda telah menggunakan aljabar linier.

Mempelajari matematika 3D biasanya dimulai dengan menempatkan objek sederhana (seperti kubus) di ruang 3D, dan menerapkan kamera bergerak yang dapat melihat objek itu dari perspektif yang berbeda, dan perspektif itu dapat memulai secara ortogonal untuk menjaga hal-hal menjadi lebih sederhana. Ini tentang memproyeksikan poin ke bidang 3D yang mewakili layar Anda (rumus di sini , Anda akan memperluas ini ke sumbu x dan z di samping y). Sungguh, itulah awal dari menulis mesin 3D, terlepas dari tingkat pengalaman Anda. Flash dan Processing.js adalah dua cara hebat untuk membuat prototipe seperti ini dengan mudah.


0

Anda benar di jalur aljabar linier dan matematika yang lebih kompleks biasanya melibatkan grafik 3D dan ruang 3D. Tapi masih ada lagi matematika yang bisa dilakukan dalam game 2D. Matematika fisika dapat menjadi sangat hardcore, dan akan menjadi lebih kompleks jika Anda mempertimbangkan fisika tubuh lunak dan dinamika B-spline (dan masih dalam 2D, perlu diingat)

Cobalah membangun atau membedah perpustakaan fisika yang akan mencakup penanganan tabrakan dan respons untuk bentuk 2D umum. Aljabar linier sangat berguna untuk menghitung vektor lintasan untuk tabrakan. Produk titik cukup terkait dengan lingkaran satuan yang digunakan dalam trigonometri. Namun, kompleksitas fisika tubuh yang kaku meningkat secara eksponensial ketika menerapkannya dalam 3D.

Grafik 3D memberi Anda pemahaman yang lebih besar tentang perhitungan matriks, angka empat, aljabar linier, dan beberapa kalkulus terapan. Hal pertama yang mungkin Anda ambil adalah menggunakan matriks untuk memindahkan dan memanipulasi objek dalam ruang 3D.


0

Jika Anda menulis game 2D, Anda mungkin sudah menggunakan aljabar linier .. Anda tidak tahu itu! Secara formal belajar setidaknya dasar-dasar tentang vektor cukup mudah, tetapi berjalan jauh dalam menyederhanakan pemikiran tentang gerakan sebaliknya-kompleks.

Sebagai contoh, kami mendapatkan banyak pertanyaan di sini tentang persamaan apa yang digunakan untuk mensimulasikan gerakan melengkung, seperti untuk tembakan bola meriam dari meriam, atau peluru kendali. Tetapi jika Anda memahami vektor, satu-satunya "persamaan" yang Anda butuhkan adalah menambahkan dua vektor bersamaan. Tidak hanya itu, tetapi menambahkan hal-hal seperti hambatan udara atau gesekan menjadi sangat sederhana - cukup hitung vektor seretnya, dan tambahkan ke kecepatannya. Presto!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.