내 게임 엔진의 클로저 배열에 대한 내 상황을 더 잘 설명합니다.
먼저 나는 게임 오브젝트를 수정 재미있는 구성 요소를 만들 :
그들은 같은 것을 보일 것이다 :
class ComponentA extends Component {
update() {
console.log('Component A')
}
}
class ComponentB extends Component {
update() {
console.log('Component B')
}
}
을
다음으로, w henever 나는 gameObject가 해당 객체의 기능에 접근하도록하고 싶습니다. 단지 그 구성 요소를 gameObject에 연결합니다. 이제 모든 프레임마다 업데이트 기능이 실행됩니다. ComponentA
에서 위의 gameObject1
및 gameObject2
주에서 동일한 기능을
let gameObject1 = new GameObject()
gameObject1.addComponent(ComponentA) // component instance gets added to global array
let gameObject2 = new GameObject()
gameObject2.addComponent(ComponentA) // component instance gets added to global array
gameObject2.addComponent(ComponentB) // component instance gets added to global array
하지만 gameObject2
도 ComponentB
에서 추가 기능이 있습니다 : 그것은 다음과 같이 보입니다.
class engine {
static components = []
tick() {
// Here is what you need to pay attention to:
engine.components.forEach(comp => {
if(typeof comp == 'function') {
comp['update']()
}
})
window.requestAnimationFrame(this.tick.bind(this))
}
run() {
window.requestAnimationFrame(this.tick.bind(this))
startRenderer()
}
}
new engine().run()
즉 : s는 생성 된 우리의 gameObject
'(우리는 당신의 질문과 관련된 곳이다) 엔진이 구성 요소의 배열을 통해 루프와 같은 자신의 update
를 실행의 일단 지금
모든 내 엔진이 어떻게 작동하는지, 이것은 당신이하는 것과 매우 흡사합니다. 단지 그것을하는 다른 방법 일뿐입니다.
게임 엔진에서 비슷한 일을합니다. 클로저가있는 객체 배열을 가지고 있고, 각 프레임에서 객체를 순환하고 객체의'update()'클로저를 호출합니다. –
예, 실제 소프트웨어에서이 패턴을 사용하는 이유가 있습니다. 물론 그것은 사용 사례에 달려 있습니다. 원하는 경우 함수 배열없이 필요한 모든 작업을 수행 할 수있는 방법이있을 수 있습니다. 그러나 예를 들어 뷰를 배열로 업데이트하는 함수를 밀어서 볼 수 없을 때 페이지에 대한 업데이트를 지연시키는 코드가 있습니다. 페이지가 다시 표시되면보기를 업데이트하기 위해 페이지를 반복합니다. 그래서 나는 그것의 쓸데 없거나 흔치 않은 패턴을 말하지 않을 것이다. – CRice
@GetOffMyLawn 이해가 안되요. 왜 클로저 여야합니까? CRice - 원시 자바 스크립트인가요? 왜 단지 상태 객체를 가지고 페이지가 보이도록 확인하지 않는가? 나는 btw 답장을 주셔서 감사합니다. – VSO