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.
sumber
position = speed * ...TotalSeconds
. Perhatikan itu=
bukan+=
. Jika+=
seperti saat Anda mengetik, maka posisi Anda akan terbang dari layar hampir seketika.gt.ElapsedGameTime.TotalSeconds
jumlah 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.iii
bahwa 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.Jawaban:
Apakah itu mengubah keadaan dunia game Anda? Itu kode logika.
Apakah ini menampilkan keadaan dunia game? Ini merender kode.
sumber
Pemisahan Anda benar jika:
sumber
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 menambahvelocity * time since last update / period of update
posisi objek yang terlihat (sementara posisi aslinya tetap tidak berubah).iff
artinya jika-dan-hanya-jika?Update
apa 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.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 yangDraw()
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 keDraw()
.0
. Anda dapat memiliki jam hierarkis sehingga mis. UI masih berjalan dan menjiwai sementara interpolasi karakter berhenti juga, sangat sangat mudah.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.
sumber