Я работаю над простой игрой в java, где юнитами являются классы с их именами, состоянием здоровья и т. Д., Хранящимися в полях.Единицы считываются из файла и затем сохраняются в хэш-карте для формирования мастер-библиотеки, которая используется в качестве справочной информации при появлении новых единиц.
Я пытаюсь решить, как хранить фактические единицы вигра (не базовая единица, используемая в качестве ориентира, а действительные единицы, перемещающиеся по карте).Фактические единицы содержат больше данных, чем ссылки, такие как текущее состояние здоровья, бустеры и т. Д., Но им все еще необходимо иметь доступ к исходным характеристикам, таким как максимальное состояние здоровья и тому подобное.Мне кажется излишним, чтобы каждый экземпляр юнита носил с собой кучу неизменной информации, которая уже хранится в справочнике, поэтому я думаю о том, чтобы создать еще один класс для представления порожденных юнитов, который содержит такие данные, как текущее состояние,и т.д., а также ссылка на ссылочный класс, чтобы он все еще имел доступ к основным данным.Код будет выглядеть примерно так (это всего лишь тестовый код, который я использую для проверки концепции; впервые в Java):
`// начало кода
public class UnitTest
{
// Main test function.
public static void main(String[] args)
{
System.out.println("\nStarting test.\n\n");
ObjectDefinitions.UnitArchetype Base = new ObjectDefinitions.UnitArchetype("Soldier", 0.8f);
ObjectDefinitions.Unit Product = new ObjectDefinitions.Unit(Base, 9.0f);
Base.UnitArchetypeStats();
Product.UnitStats();
Base.SetUnitMaxHealth(11.0f);
Base.UnitArchetypeStats();
Product.UnitStats();
}
}
class ObjectDefinitions
{
static class UnitArchetype
{
// Fields
private String UnitType;
private float UnitMaxHealth;
// Constructor
UnitArchetype(String UnitType, float UnitMaxHealth)
{
this.UnitType = UnitType;
this.UnitMaxHealth = UnitMaxHealth;
}
// Methods
public void UnitArchetypeStats()
{
System.out.println("UnitType: " + UnitType + "\nUnitMaxHealth: " + UnitMaxHealth + "\n");
}
public void SetUnitMaxHealth(float Health)
{
UnitMaxHealth = Health;
}
}
static class Unit
{
// Fields
private ObjectDefinitions.UnitArchetype BaseUnit; // the reference to the base unit
private float UnitCurrentHealth;
// Constructor
Unit(ObjectDefinitions.UnitArchetype Model, float CurrentHealth)
{
this.BaseUnit = Model;
this.UnitCurrentHealth = UnitCurrentHealth;
}
// Methods
public void UnitStats()
{
System.out.println("UnitType: " + BaseUnit.UnitType + "\nUnitMaxHealth: " + BaseUnit.UnitMaxHealth + "\nUnitCurrentHealth: " + UnitCurrentHealth + "\n");
}
}
}
ИтакУ меня два вопроса.Во-первых, сработает ли связывание с базовым модулем таким способом без каких-либо проблем, или это может что-то сломать в коде?
Во-вторых, стоит ли вообще беспокоиться о чем-то подобном, или я должен просто расширитьэталонный класс, добавив дополнительные поля, которые мне нужны, и затем клонируйте всю информацию каждый раз, когда появляется новый юнит, так что каждый внутриигровой юнит содержит всю информацию?Я пытался оптимизировать для памяти, но, честно говоря, даже с дополнительными полями для текущего состояния здоровья и других битов информации, порожденный юнит все равно будет состоять только из дюжины или около того полей.Стоит ли пытаться заморачиваться чем-то таким подправленным?Я прихожу из среды Python и буквально изучаю Java, когда пишу это, так что я действительно мало знаю о том, что можно назвать «тяжелым» в Java.