Bagaimana saya bisa menerapkan skrip cerdas, di game saya?

18

Saya sedang mengembangkan mesin game. Itu seharusnya menjadi entitas / komponen yang berbasis satu. Untuk mengembangkan game saya sendiri, saya berpikir untuk menggunakan beberapa bahasa scripting untuk benar-benar membuat entitas.

Misalnya, jika saya ingin menambahkan jenis monster yang agresif kepada pemain, itu akan menjadi entitas dengan beberapa komponen; komponen-komponen itu akan berubah dengan tipe monster, jadi jika aku memiliki seratus tipe monster yang berbeda, dalam gimku, aku tidak perlu membuat metode baru untuk masing-masingnya langsung dalam kode gimku.

Haruskah saya menggunakan bahasa scripting untuk menggambarkan entitas ini, dalam hal komponen atau apakah ada hal lain yang akan bekerja lebih baik? Secara umum, bagaimana saya harus menggunakan skrip, di game saya?

nathan
sumber
Hanya untuk deskripsi entitas, Anda hanya dapat menggunakan xml atau yang serupa, tidak perlu skrip. Untuk skrip saya akan menggunakan C #, tetapi hanya jika mesin Anda dalam. NET ...
Kikaimaru
@Kikaimaru C # Bukan bahasa skrip. Menggunakan lua akan menjadi ide yang lebih baik, atau bahasa lain yang dapat disematkan di mesin Anda.
JDSweetBeat
@DJMethaneMan "C # bukan bahasa scripting" tidak berarti apa-apa, Sama sekali tidak ada masalah dengan menulis skrip dalam C # dalam permainan yang ditulis dalam C # dan menggunakan sesuatu seperti Roselyn untuk kompilasi ... Tapi setelah 4 tahun, saya akan menggunakan json a javascript, bukannya xml dan C # :)
Kikaimaru

Jawaban:

17

Game saya menggunakan kerangka kerja komponen entitas dan menggunakan skrip untuk mendefinisikan entitas (ini tidak secara langsung mendefinisikan perilaku, saya akan berbicara lebih banyak tentang itu di akhir). Skrip menentukan komponen aktual yang akan digunakan untuk membuat setiap entitas. Ini menggunakan bahasa scripting sederhana yang saya buat. Ini adalah versi sederhana dari salah satu skrip saya:

ENTITY:"Goblin"
{
    description="It's currently their age."
    commonname="goblin"
    pluralCommonName="goblins"
    childname="gob'in"
    pluralChildName="gob'ins"
    active=Nocturnal
    tags=Mobile
    baseAttributes="OrganicMobileCreature"

    [Model]{
            meshname="Goblin"
            texturename="GoblinTexture"
    }

    [Motion]{
            maxvelocity=0.01:0.015
            locomotion=Walk,Swim
    }

    [Skills]{
            ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
    }

    [Inventory]{
            maxItems=2
            Allow=ALL
            Disallow=NONE
    }
}

Banyak dari itu menggambarkan diri sendiri, tetapi di sini ada beberapa hal penting:

  • Bagian pertama menjelaskan informasi umum untuk entitas. Itu termasuk deskripsi dan nama tampilan untuk berbagai aspek entitas.
  • The baseAttributesreferensi tag script file lain yang mendefinisikan komponen umum yang saya tidak mau harus mendefinisikan kembali beberapa kali. Ini mengandung komponen seperti position,liferequirements dan sebagainya. Jika ada komponen yang didefinisikan di sini lagi, komponen ini akan menimpa yang umum.
  • Setiap [NAME] { }set mendefinisikan komponen baru yang akan ditambahkan ke entitas ini.
  • Deskripsi ini bukan hanya untuk satu entitas , tetapi untuk semua goblin yang dibuat. Anda akan melihat bahwa beberapa nilai memiliki rentang (yaitu 0.01:0.015), ketika goblin baru dibuat, ia akan dibuat dengan komponen yang memiliki nilai acak dalam rentang itu. Jadi setiap goblin akan memiliki keterampilan yang sedikit berbeda dan kecepatan yang sedikit berbeda. Pengaturan ini menetapkan bahwa semua goblin akan mulai dengan keterampilan yang sangat baik dalam menempatkan kubus dan penambangan, yang sebenarnya hanya untuk tujuan pengujian saya sendiri. Tapi karena saya yakin Anda bisa menebak, sangat mudah untuk mengubah nilai menjadi apa pun yang saya inginkan.

Semua ini melibatkan pembuatan parser khusus, semacam struktur untuk menampung definisi entitas (saya sebut tambang Lexicon!) Dan pabrik untuk mengambil definisi entitas tersebut dan menghasilkan entitas baru. Bagi saya sistem ini masih dalam tahap awal, tetapi ternyata benar-benar baik. Ini adalah sistem yang sangat kuat untuk mendefinisikan entitas dengan cepat dan memungkinkan Anda untuk membuat entitas apa pun yang Anda inginkan menggunakan komponen yang Anda buat. Jika Anda tidak nyaman membuat parser Anda sendiri, saya pikir XML akan berfungsi dengan baik. Saya mengubah milik saya dari parser rekursif pushback yang saya tulis untuk bahasa pemrograman yang sedikit dibuat-buat.

Seperti yang Anda lihat, ini mendefinisikan entitas. Saya menyebutkan bahwa itu tidak secara langsung mendefinisikan perilaku. Namun, ia dapat dengan mudah mendefinisikan hal-hal seperti musuh yang dibenci dan seberapa agresif bereaksi terhadap musuh yang dikatakan. Ini akan sesederhana mendefinisikan komponen apa pun yang Anda gunakan untuk mengendalikan perilaku tersebut. Entitas saya juga memiliki komponen intelijen (tidak ditampilkan) yang mendefinisikan hal-hal seperti:

  • Bagaimana mereka menemukan jalur (gerakan saling berhadapan sederhana, A * sederhana, A prediktif, dll.)
  • Betapa agresif / defensifnya mereka. Entitas dapat memiliki zona rumah yang akan dipertahankan, tetapi mungkin tidak agresif di luar zona tersebut.
  • Kesadaran teknologi (pintu terbuka, gunakan gadget, hindari jebakan, dll)
  • Dan lagi ...

Bagaimanapun milik Anda, itu sistem Anda yang akan mengarahkan data dalam komponen itu, yang pada gilirannya mempengaruhi perilaku entites Anda.

MichaelHouse
sumber
Terima kasih telah berbagi. Saya benar-benar berpikir saya akan mencoba melakukannya dengan menggunakan format XML. Saya telah berpikir banyak tentang itu (terima kasih kepada AbstractChaos btw) dan harus memenuhi kebutuhan saya (setidaknya untuk deskripsi entitas).
nathan
1
@nathan Saya setuju Anda harus menggunakan XML. Alasan posting saya adalah lebih banyak data apa yang harus dimasukkan dalam XML Anda dan bagaimana menggunakannya. Format data bisa apa saja yang Anda suka. Data yang Anda pilih untuk dimasukkan dan bagaimana Anda menerapkan penggunaannya jauh lebih penting.
MichaelHouse
@ Byte56 Saya tahu posting ini sudah tua, tetapi bagaimana Anda menangani hubungan anak orang tua? Katakanlah kita memiliki pohon Skill dan Anda memerlukan 10 poin dalam skill A [0] untuk mengaktifkan A [1], dan 10 poin di dalamnya untuk mengaktifkan A [2], dll. Identitas orang tua? Jelas mereka setara secara logika, tapi saya harap Anda memiliki wawasan dunia nyata.
Superstringcheese
@ Superstringcheese if player.hasPoints(10) then i++ end skillTree[i]akan menjadi beberapa pseudocode. Saya tidak tahu bagaimana pertanyaan itu relevan dengan postingan itu.
JDSweetBeat
4

Jika yang benar-benar Anda butuhkan adalah cara mendefinisikan komponen-komponen dari sebuah Monster maka XML akan berfungsi dengan baik, baik C # maupun java memiliki implementasi cepat yang kilat.

Xml Anda bisa jadi

<?xml version="1.0" encoding="UTF-8"?>
<mobs>
  <mob>
    <personality>Aggressive</personality>
    <intelligence>20</intelligence>
  </mob>
</mobs>

Maka kelas Mob Anda bisa terlihat seperti. (Jawa)

public class Mob {
  private IPersonality personality;
  private Integer intelligence

  //**  Getters & Setters **//
}

Di mana IPersonality adalah antarmuka.

Anda kemudian dapat memuat xml Anda dan mengurai setiap nilai melalui pabrik.

misalnya mengurai Nilai Kepribadian ke dalam PersonalityFactory yang hanya:

public IPersonality getPersonality(String personalityName) {
  if(personalityName.equals("Aggressive")) {
    return new AggressivePersonality();
  }
  else if(personalityName.equals("Passive")) {
    return new PassivePersonality();
  }
  else {
     //Maybe allow for no personality (We all know monster like that ;) )
     return null; 
  }
}

Maka Anda bisa mengatur massa seperti itu

Mob mob = new Mob();
mob.setPersonality(getPersonality(xmlValue));
mobList.add(mob);

Kuncinya adalah bahwa mesin Anda mengetahui format xml dan memiliki pabrik untuk semua yang dibutuhkan.

Satu keuntungan dari xml adalah Anda dapat mendefinisikan skema Anda sendiri untuk memastikan bahwa formatnya selalu benar, lihat di sini .

Semoga ini membantu

AbstractChaos
sumber
Sebenarnya saya perlu menemukan cara untuk dengan mudah membuat entitas baru dari game proses pengembangan game. Apakah xml akan cukup fleksibel? Saya perlu menambahkan skrip untuk logika permainan internal.
nathan
Jika Anda membaca kelas Mob sebagai Entitas maka Anda sedang membuat Entitity (Mob) baru menggunakan XML dengan komponen yang berbeda (IPersonality, Intelligence [contoh data untuk mob itu]). Dan sayangnya saya tidak bisa menjawab jika itu akan cukup fleksibel karena saya tidak tahu apa lagi yang ingin Anda lakukan selain apa yang Anda tentukan, Namun XML adalah format di mana satu-satunya batasan adalah bagaimana Anda menafsirkan setiap bagian. Perbarui Pertanyaan Anda dengan contoh terperinci dan saya akan menunjukkan xml yang dapat mengatasinya. Logika permainan internal sepertinya harus internal?
AbstractChaos
0

Python baik-baik saja, saya pikir. Seringkali LUA juga merupakan alternatif yang baik jika Anda ingin menambahkan kemampuan scripting ke program Anda.

Anda bisa menggunakan XML untuk menggambarkan perilaku monster Anda, ini akan melibatkan beberapa pengkodean dalam kode permainan yang sebenarnya karena Anda hanya akan menyimpan "nama" atau beberapa atribut sesuai dengan perilaku (kecepatan, jenis senjata yang digunakan monster, dll. dari perilaku yang digunakan dalam kode game Anda.

Jika Anda menggunakan Scriptengine (misalnya LUA), Anda dapat mentransfer kode ini dari program yang telah dikompilasi ke file script yang dimuat selama runtime. Untuk melakukan ini, Anda harus mengekspos API "monster" Anda ke scriptengine. Itu memungkinkan Anda untuk memanggil metode kode monster-game dari luar.

Aron_dc
sumber
API monster saya? Maksud saya, saya harus dapat membuat komponen baru dari skrip (instanciation). Apa itu mungkin?
nathan
Afaik ini harus dimungkinkan. Anda juga bisa menggunakan pendekatan campuran dari penyimpanan eksternal (seperti yang disebutkan oleh abstractchaos atau byte56) dan bahasa scripting (LUA, Python ...). Keuntungan utama dari misalnya LUA adalah bahwa Anda dapat mengubah kode saat runtime dan langsung tersedia di game / mesin Anda yang sedang berjalan
Aron_dc
Ho serius? Ini memang keuntungan yang sangat besar. Juga saya punya LUA (atau bahasa scripting lainnya) untuk "timeline permainan". Maksud saya, untuk membuat beberapa adegan scenaris di mana pemain harus diblokir, sprite ini harus pindah ke sini, menyalakan di sana-sini ... Jadi mungkin saya juga bisa menggunakan bahasa skrip untuk memuat entitas? Juga saya akan memposting pertanyaan lain untuk mengekspos cara saya saat ini untuk mengelola entitas / komponen atas apa yang saya sebut "manajer" untuk melihat apakah saya baik-baik saja.
nathan