Apa itu "kode logika game?"

50

Saya menggunakan C # / XNA dan telah diberitahu beberapa kali untuk tidak mencampur kode pembaruan dengan kode draw - dan saya yakin saya tidak! Tetapi bisakah orang menjelaskan apa sebenarnya 'kode logika' itu?

Seperti yang terlihat di sini: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx

[...] pastikan Anda memasukkan semua logika game Anda ke dalam metode Pembaruan (bukan dalam Draw!) dan semuanya akan berjalan dengan kecepatan konstan yang bagus.

Saya menanyakan hal ini karena kecepatan permainan saya berfluktuasi relatif terhadap FPS. FPS yang lambat sama dengan benda yang bergerak lambat dan sebaliknya. Dan ya, saya termasuk position += speed * (float)gt.ElapsedGameTime.TotalSeconds;kode yang diharapkan .

Ini mungkin pertanyaan pemula yang besar, tapi saya hanya ingin benar-benar jelas tentang definisi ini.

Cowok pemalu
sumber
Saya pikir Anda maksud position = speed * ...TotalSeconds. Perhatikan itu =bukan +=. Jika +=seperti saat Anda mengetik, maka posisi Anda akan terbang dari layar hampir seketika.
DrZ214
Saya memiliki kode yang terlihat seperti 'posisi + = arah * kecepatan * ... TotalSeconds' dan itu berfungsi dengan sangat baik. Saya mungkin salah ketik sesuatu, tetapi posisi = kecepatan akan menetapkan itu setiap pembaruan. Cara Anda mungkin berhasil, tetapi kode saya berfungsi seperti ini. (Perhatikan bahwa arah dinormalisasi)
Shyy Guy
Saya pikir gt.ElapsedGameTime.TotalSecondsjumlah detik berlalu dari memulai program (permainan). Jika Anda mengalikan kecepatan Anda dengan itu, maka setelah 5 detik bermain, kecepatan Anda akan 5 kali lebih cepat (kecuali kasus khusus di mana kecepatan diatur ke 0). Tidak yakin apa lagi yang bisa Anda miliki yang membuat itu tidak benar, tapi saya tertarik.
DrZ214
1
Aha, itu sejak pembaruan terakhir. gamedev.stackexchange.com/questions/67968/…
Shyy Guy
2
Menarik saya tidak akan pernah menduga itu. Tidak pernah memiliki kebutuhan untuk hal seperti itu dalam hitungan detik, karena saya pribadi menggunakan variabel saya sendiri yang disebut iiibahwa saya secara manual menambah setiap pembaruan, karena saya tidak menginginkannya dalam hitungan detik, saya ingin langkah atau bingkai. Saya dapat melihat bahwa cara Anda adalah cara yang valid untuk soft-coding.
DrZ214

Jawaban:

102

Apakah itu mengubah keadaan dunia game Anda? Itu kode logika.

Apakah ini menampilkan keadaan dunia game? Ini merender kode.

Nils Ole Timm
sumber
Saya akan melirik kode saya untuk menjadi 100% pasti. Penjelasan yang bagus, terima kasih.
Shyy Guy
38
Apakah ini menangani input? Kode pengontrolnya. Pisahkan kontrol dari logika, sehingga Anda dapat menggunakan logika yang sama dengan berbagai jenis kontrol. Misalnya FPSInputController + CharacterMotor vs. AIInputController + CharacterMotor vs NetworkInputController (mis. Pemain lain dalam instance multiplayer) + CharacterMotor. Motor (kode logika) tidak peduli bagaimana mendapatkan instruksi yang dilakukannya, hanya saja mereka diberikan (decoupling semacam ini memungkinkan transisi yang mudah dari pemain ke AI bot (pikirkan Left 4 Dead dan idle players) dan kembali, antara lain).
Draco18s
10
Draco mengemukakan poin yang bagus. Ada banyak divisi berbeda yang dapat Anda masukkan ke dalam kode. Divisi Nils adalah apa yang saya anggap sebagai pembagian pola dasar antara logika dan rendering, tetapi ada banyak lapisan lain yang akan Anda lihat. Alasan sebenarnya untuk memisahkan mereka ke dalam lapisan adalah bahwa setiap lapisan terdiri dari tindakan serupa yang memerlukan gaya kode yang sama dengan persyaratan yang sama. Misalnya, dalam banyak game, Anda bisa lolos dengan logika permainan yang menghabiskan 2 atau 3 frame untuk menyelesaikan, tetapi jika Anda tidak melakukan rendering setiap frame, mata pengguna akan melihat dengan cepat.
Cort Ammon
Menjaga mereka tetap berbeda akan membantu Anda mengelola kebutuhan Anda ketika mereka mulai menjadi sumber ketegangan.
Cort Ammon
6
Dan ingat bahwa jika Anda melempar terlalu banyak MVC ke dalamnya, ia dapat melambat menjadi perayapan, jadi selalu berusaha untuk keseimbangan antara rawatan dan optimisasi. Tapi jangan optimalkan terlalu dini, kecuali Anda benar-benar yakin dengan apa yang Anda lakukan. Dan ingat Anda selalu bisa refactor. Dan ... Eh, buat banyak game dan belajarlah dari kesalahan Anda.
Maurycy
24

Pemisahan Anda benar jika:

  • Panggilan Gambar () beberapa kali berturut-turut tanpa ada panggilan yang diselingi ke Pembaruan () tidak akan menghasilkan perubahan yang terlihat di antara panggilan.
  • Memanggil Pembaruan () beberapa kali berturut-turut tanpa panggilan diselingi ke Draw () akan seperti bermain game dengan layar dimatikan: semuanya bergerak dengan sempurna dan konsisten, Anda tidak bisa melihatnya.
Thomas
sumber
5
Ditulis dengan benar Draw()dapat menggambar gambar yang berbeda seiring berjalannya waktu. Misalnya, bingkai sprite animasi dapat terus berubah. Selain itu, objek dapat terus bergerak secara visual jika kode rendering menggunakan trik umum dan menambah velocity * time since last update / period of updateposisi objek yang terlihat (sementara posisi aslinya tetap tidak berubah).
HolyBlackCat
2
iffartinya jika-dan-hanya-jika?
BalinKingOfMoria
3
@HolyBlackCat: itu bisa diperdebatkan. Bagaimana jika saya ingin menjeda gambar? Bagaimana jika bingkai animasi memengaruhi game (animasi serangan yang sesuai dengan hitbox, dll.)? Interpolasi visual masih menyiratkan bahwa "waktu" (seperti dalam delta waktu permainan) sedang berlalu, tetapi jika waktu berlalu dan Anda tidak tahu Updateapa lagi yang tidak sinkron? Input pemain tidak terjawab, acara jaringan tidak sedang diproses, dll? Gim harus dimatikan dari satu jam tunggal, dengan kutu tetap untuk logika game atau fisika yang berasal dari jam itu, dan keadaan grafis yang diturunkan juga didorong oleh jam yang sama.
Sean Middleditch
@SeanMiddleditch Saya setuju, hampir selalu Anda bisa menulis Draw()sedemikian rupa sehingga selalu menarik gambar yang sama ketika dipanggil beberapa kali berturut-turut. Seseorang harus melakukan itu jika memungkinkan. Tetapi ada beberapa kasus ketika Anda tidak tahu frekuensi apa yang Draw()akan dipanggil. Misalnya, jika Anda ingin dukungan penuh (120 FPS aktual) untuk monitor 120Hz baru dan Anda menghidupkan vsync. What if I want to pause graphics?Kemudian Anda melewati 0 bukannya waktu delta aktual ke Draw().
HolyBlackCat
2
@HolyBlackCat: Tidak ada yang saya maksudkan akan menghalangi penggunaan rendering 120hz. Saya benar-benar tidak merekomendasikan tingkat penarikan tetap; itu hanya amatir. Seharusnya ada satu jam gim global yang delta diukur dalam kerangka render frame yang dimasukkan ke dalam nilai akumulasi untuk kutu logika game tingkat-tetap. Jam global itu menggerakkan grafik, termasuk interpolasi. Anda dapat menjeda gambar dengan mengatur skala jam ke 0. Anda dapat memiliki jam hierarkis sehingga mis. UI masih berjalan dan menjiwai sementara interpolasi karakter berhenti juga, sangat sangat mudah.
Sean Middleditch
7

Intinya di sini adalah pemisahan Model hal-hal yang bukan model.

Logika Game adalah Model sebagaimana dimaksud dalam

Ini semua berbeda, terkait, pola arsitektur perangkat lunak. Tetapi dalam semua kasus Model adalah hal yang sama itu adalah logika nyata dan keadaan sebenarnya.

Ini adalah saat membuat perangkat lunak bisnis itu kadang-kadang disebut logika bisnis, dan menyandikan beberapa kebijakan bisnis. Misalnya jika Anda mengkodekan sesuatu untuk bank, untuk menghitung tagihan kartu kredit, maka fungsi yang menyebabkan seseorang tidak perlu membayar bunga jika mereka menghapus hutang mereka dalam waktu kurang dari 30 hari, adalah bagian dari logika bisnis, ia tinggal di model. Misalnya tidak hidup di salah satu lapisan tampilan. Kode untuk mencetak tagihan, misalnya, tidak mengedit teks berdasarkan tindakan mereka. Contoh ini mungkin menyoroti mengapa Anda mungkin ingin mengatur kode Anda seperti itu.

Mirip dengan logika gim.

Bayangkan suatu saat gim Anda dipindahkan ke konsol lain. Mungkin membantu membayangkan sesuatu yang sangat berbeda dengan target Anda saat ini. Misalnya, jika Anda menargetkan sesuatu yang sedang bermain dengan gamepad / pengontrol, Bayangkan game Anda di-porting ke tablet layar sentuh. Logika gim adalah bagian dari kode yang tidak berubah ketika Anda porting.

Jika gim Anda mirip gim strategi militer, bayangkan gim ini dikonversi menjadi boardgame paling rumit di dunia. Logika permainan adalah bagian-bagian kode, yang secara langsung sesuai dengan garis-garis dalam buku aturan. (Tidak semua baris dalam buku peraturan, bukan yang tentang memindahkan potongan, tetapi beberapa.).

Logika permainan adalah hal yang tidak pernah berubah, apa pun bentuknya.

Lyndon White
sumber