Bagaimana cara membuat sistem inventaris dunia-ke-pemain?

11

Saya mengalami masalah dalam mencoba menerapkan sistem inventaris dalam XNA (tidak terlalu penting, bisa menjadi platform apa pun) tetapi sejauh ini. Ini adalah masalah yang saya coba utarakan:

Bagaimana saya bisa mendapatkan item dari dunia (pikirkan ketika Anda membunuh monster yang menjatuhkan armor) dan memasukkannya ke inventaris pemain saya?

Jika inventaris hanya daftar item, secara teknis, bagaimana saya bisa memasukkan Steel Sword dari dunia ke dalam inventaris pemain saya tanpa ada kelas yang melakukan lebih dari satu hal?

Saat ini saya memiliki struct item, yang berisi nilai hex unik, jumlah berapa item yang ada (untuk stackable, seperti panah) dan Tekstur untuk rendering dalam inventaris, dan beberapa properti tidak penting lainnya (nama, deskripsi, dll) .

Ini akan menjadi desain yang buruk jika saya harus memodifikasi kelas item saya yang ada untuk menampung posisi dunia, bersama dengan deteksi tabrakan (tidak ingin item jatuh melalui bumi).

Terima kasih atas pertimbangannya!

Ross
sumber
4
Tidak bisakah Anda memiliki WorldItemyang terpisah dari milik Anda InventoryItem? (Mungkin WorldItemmemiliki InventoryItemtemplat yang dimasukkan ke dalam inventaris pemain saat diambil).
George Duckett
1
@ GeorgeDuckett Anda harus membuat ini sebuah jawaban .. mungkin harus ada beberapa metode Inventoryyang membutuhkan WorldItemdan menambahkannya sebagai InventoryItem. Sehingga bisa juga menangani case di mana item perlu ditumpuk (mis. Panah).
bummzack
@bummzack: Selesai.
George Duckett

Jawaban:

17

Pendekatan yang saya gunakan adalah memiliki 2 struct (atau kelas) yang berbeda. WorldItemdan InventoryItem.

Anda kemudian dapat menambahkan InventoryItemsebagai properti / bidang milik Anda WorldItemyang akan ditempatkan di inventaris pemain saat item dunia diambil.

Anda ingin metode di suatu tempat (pada kelas pemain, atau salah satu kelas item) yang menangani menambahkan item inventaris ke inventaris pemain, untuk menangani penumpukan item seperti.

George Duckett
sumber
Saya sangat suka jawaban ini, terima kasih banyak, sangat masuk akal! Satu pemikiran terakhir, katakanlah orang tersebut ingin menjatuhkan item, akankah item Inventaris juga membutuhkan WorldItem di dalamnya?
Ross
Jika perlu 2 cara saya akan tergoda untuk memiliki kelas 'pencarian' terpisah yang menyimpan pasangan barang dunia dan barang inventaris. Anda kemudian akan menggunakannya untuk mencari satu, mengingat yang lain.
George Duckett
Ohhh bagus, tidak pernah memikirkan itu. Itu ide yang sangat menarik. Karena semua item konkret, masuk akal untuk mencari mereka.
Ross
2
Saya akan menghancurkan WorldItem ketika diambil dan membuat yang baru ketika item dijatuhkan.
Simon Richter
Sepakat. Bukan berarti menyiratkan sebaliknya.
George Duckett
0

Seperti yang disebutkan sebelum membagi menjadi beberapa kelas atau array akan menjadi taruhan terbaik Anda. Saya akan membuat 3 kelas, Dunia, Pemain dan Item Kelas dunia akan memiliki Daftar WorldItems di dalamnya, begitu juga kelas Player, tetapi bernama Daftar Inventaris Ketika pemain mengambil item, Anda memindahkannya dari daftar di Dunia kelas ke daftar di kelas Player.

Dalam loop pengundian gim Anda, Anda bisa membuat lingkaran yang menarik semua Item di daftar WorldItems ke layar, tetapi tentu saja mengabaikan daftar Inventaris pada objek pemain.

Thomas
sumber
Metode saya saat ini adalah bahwa saya memiliki kelas WorldItem yang merangkum InventoryItem, keduanya berkaitan dengan item yang sama. Dalam metode Pembaruan Game, saya menggilir semua item dunia dan menguji batas tabrakan dengan pemain. Jika keduanya bertabrakan, WorldItem dihapus dari daftar WorldItem dan dimasukkan ke dalam inventaris pemain (yang merupakan Daftar <> InventoryItem)
Ross