2012-06-12 4 views
2

저는 ThreeJS를 사용하여 사람들이 큐브를 클릭 할 수있는 상호 작용을 만듭니다. 그러나 이러한 큐브는 클릭 할 때 다르게 동작합니다 (아이디어를 단순하게 유지하기 위해 다양한 색상 애니메이션).ThreeJS 개체를 확장하는 방법이 있습니까?

내 아이디어는 THREE.Mesh 개체의 확장 클래스를 만들고 사용자 지정 함수와 특성을 추가하는 것이 었습니다. 이렇게하면 큐브의 다른 동작을 격리하고 더 명확한 코드를 제공하는 데 도움이됩니다.

나는 John Resigs' function to extend classes을 사용해 보았지만 궁극적으로 그의 "클래스"클래스를 확장하는 클래스에서만 작동하는 것처럼 보입니다.

이 방법이 있습니까?

+0

당신이 그 일을 시도 되세요 일반적인 방법 :'THREE.Mesh.prototype.your_method = function {}'? – Hassan

+0

@Hassan 나는 그 일을하고 있었지만 코드에 의해 혼란스러워졌다. – PCoelho

답변

3

클래스 기반 시스템을 만드는 방법에는 여러 가지가 있습니다. John Resig의 "클래스"는 훌륭한 것이지만 Three.j가 사용하는 상속 유형이 아닙니다.

공지 사항 the Cube class file의 라인 :

THREE.Geometry.call(this); 
당신이 라이브러리 사용하지 않는, 그래서 자바 스크립트, 클래스 상속에 내장 된 모델을 제공하지 않습니다

클래스 구성으로 상속을 굽는 (등이 존 레식의), 당신 super 메소드를 명시 적으로 호출해야합니다.

클래스 내에서, 당신이 호출하면 클래스가 CubeGeometry에서 상속 것

:

THREE.CubeGeometry.call(this); 

이 또한 가능성이 프로토 타입으로 CubeGeometry를 설정하는 것이 좋습니다 :

THREE.MyCubeGeometry.prototype = new THREE.CubeGeometry(); 
THREE.MyCubeGeometry.prototype.constructor = THREE.MyCubeGeometry; 
+0

좋아, 나는 당신의 아이디어를 사용하여 그것을 작동하게 만들었다. 호출 함수가 다른 언어의 "수퍼"처럼 동작한다고 말할 수 있습니까? – PCoelho

+0

@PCoelho'call'은 지정된 컨텍스트에서 함수를 실행하는 방법 일뿐입니다. – jbabey

+0

JS에 내장 된 "슈퍼"가 없습니다. "THREE.Geometry"는 수퍼 메소드이고 call()은이를 호출하고 "this"라는 로컬 스코프를 주입합니다. 클래스 기반의 자료는 다른 언어와 같지 않기 때문에 JS에서 약간 이상하게 보일 수 있지만 JS는 다른 고유의 클래스 기반 언어보다 훨씬 유연합니다. – BishopZ

관련 문제