0

私は大規模なロールプレイングゲームを開発しています。問題は、アイテムとインベントリ システムをどのように管理するかを設計するのに苦労していることです。現在、私はこれに似たものを持っています:

  • public 抽象クラス Item には 5 つの入れ子になったクラスがあり、これらはすべて抽象的で静的であり、Item の型を表します。すべてのネストされたクラスには、独自の use()、delete() (クラス インスタンスをファイナライズする)、および Sell() (削除のトリガー) void があります。また、必要なすべてのフィールドを埋める setAll() メソッドのような、オプションの getter および setter メソッドもあります。
  • デフォルト: 基本価格、取引可能性ブール値、文字列名などがあります...非常に柔軟です
  • 武器: デフォルト タイプにあるもの以外に、装備時の統計ボーナスの整数があります (equip() および unequip() void で使用されます)。public クラス Hero とやり取りします。
  • Equipment: Weapon と同様ですが、装備する場所を決定する「EquipSlot」と呼ばれる Enum フィールドがあります。
  • 消耗品: デフォルトと似ていますが、それを使用するときにプレイヤーが特定の効果をヒーローに適用できるようにする consumer() void があります。通常、消費とは、delete() void をトリガーすることを意味します。
  • 特別: 通常、'Tradeable' ブール値がstatic、final、常に falseであるクエスト関連のアイテム。

さて、私のカスタムアイテムの作り方はこうです。

  • まず、新しいクラスを作成します(抽象ではありません)
  • 次に、Item.ItemType を拡張します。
  • 次に、内部に setAll(info) void を持つコンストラクターを作成します。
  • 次に、このクラスを他のクラスで使用できます。

それはすべて次のようになります。

package com.ep1ccraft.Classes.Items.Defaults;

import com.ep1ccraft.apis.Item.*;

public class ItemExample extends Item.Default {
    public ItemExample() { // Constructor
        this.setAll(lots of arguments here);
    }
}

それから私はすることができます:

ItemExample something = new ItemExample();

そして、必要なすべてのプロパティを備えた完璧な ItemExample を持っているので、そのさまざまなインスタンスを作成し、「getName()」などの素晴らしいメソッドを使用できます。

インスタンスに他のインスタンスとは異なる名前を付けて衝突しないようにする自動化されたフォームを作成する方法がわからないため、インスタンスの名前付けに問題が生じます。また、スロットをコンテナーとして使用し、スタックを保持できるインベントリ システムを実装したいと考えています (スタック可能なアイテムのみ)。また、その主な機能は、それらを他のスロットにドラッグ アンド ドロップできることです (たとえば、再編成または移動するため)。銀行などの別の在庫インスタンスに移動したり、許可されている場合はヒーローの武器や装備スロットに配置したりできます)、それらをクリックして、アイテムの名前、説明、および可能なアクションを示す画面を表示できます (どのトリガー前述の delete() および use() void)。

全部読んでくれてありがとう!多分私はあまりにも多くを求めていることを知っていますが、とにかくどんな答えでも感謝します!

4

1 に答える 1

0

基本的に、オブジェクトの一意の識別子を求めています。これにはおそらく数え切れないほどのアプローチがありますが、すぐに思い浮かぶ 3 つの異なるアプローチは次のとおりです。

1: UUID。何かのようなもの:

java.util.UUID.randomUUID()

長所:非常にシンプルなソリューション...

短所: 大量のバイト (16 + オブジェクト自体) を生成し、メモリ/ディスク ストレージを使用します。これは MMO で問題になる可能性があります。

2: グローバルランニングナンバー。何かのようなもの:

class ID {
    private static volatile long id = 0;
    public synchronized long nextId() {
        return id++;
    }
}

長所:繰り返しますが、簡単な解決策です...

短所: これは非常に単純なクラスですが、"volatile" と "synchronized" が含まれているため、特に頻繁に使用される場合、MMO の問題になる可能性があります。また、数がなくなった場合、実行時間X年後にどうなりますか. 64 ビットの長さでは、かなり多くの名前付きオブジェクトを作成する必要がありますが、結局のところ問題にはならないかもしれません...自分で計算する必要があります。

3: 命名されたグローバル ランニング ナンバー。何かのようなもの:

class NamedID {
    private static volatile Map<String, Long> idMap = new HashMap<String, Long>();
    public synchronized long nextId(String name) {
        Long id = idMap.get(name);
        if (id == null) {
            id = 0;
        } else {
            id++;
        }
        idMap.put(name, id);
        return id;
    }
}

長所: ID は、使用している名前に「ローカライズ」されます。

短所: 少し複雑なソリューションであり、同期が長く続くため、速度の点で "2" よりも劣ります。

注: この最後の提案をより速くする方法がわかりませんでした。を使用することを考えConcurrentHashMapましたが、下位レベルで機能するため機能しません。idMap.getつまり、と idMap.putステートメントの間で 2 つのスレッドが互いに干渉しないという保証はありません。

于 2013-02-21T22:36:49.360 に答える