Компонентная система сущностей с прототипами компонентов - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть Entity Component System, написанная на ES7.Я хотел бы минимизировать использование памяти.Поскольку многие из этих объектов в системе очень похожи, они разделяют ссылки на «одинаковые» компоненты.Я называю их прототипами компонентов .

Однако существует проблема.Я хочу иметь возможность изменять данные компонентов для одной сущности, не затрагивая другие сущности.

Они имеют одинаковую ссылку на объект компонента.Я понимаю, что мне придется сделать копию данных и изменить ссылку на компонент на эту копию, когда я хочу внести изменения в общий компонент, но я хотел бы сделать это автоматически.

class Entity {
 // get component // prop getter - read from reference
 // set component // clone the data
}

class Component {
   data = 'test'
}

let component = new Components()

let entity1 = new Entity()
let entity2 = new Entity()

entity1.component = component
entity2.component = component // shared entity

entity2.component.data = 'test2' // now the entity should clone the component

Есть идеи, как этого добиться?Спасибо за любые подсказки.

Ответы [ 2 ]

0 голосов
/ 20 августа 2019

Вы можете использовать прототипное наследование JavaScript, заменив существующий компонент наследующим объектом, например так:

entity2.component = Object.create(component) // extend the base prototype
entity2.component.data = 'test2' // other components don't inherit this change

Остерегайтесь этого, поскольку вы используете классы (которые являются несколько "самоуверенным" синтаксическим сахаромиз-за наследования прототипа) этот метод может потенциально взаимодействовать с вашим существующим кодом.

0 голосов
/ 24 февраля 2019

Я думаю, вы можете вернуть объект defaultComponent до того, как будет установлен реальный объект

const defaultComponent = {
	foo: 'bar',
  x: 1,
  y: 1
}

class Test {
	get component() {
  	return this._component || defaultComponent
  }
  set component(c) {
  	this._component = c
  }
}

const a = new Test()
console.log(a.component)
a.component = { ...defaultComponent }
a.component.x = 3
a.component.foo = 'derp'
console.log(a.component)

Но считаете ли вы, что такая оптимизация действительно того стоит?

...