2012-03-07 3 views
2

클래스 개체를 등록하고 클래스의 특정 인스턴스를 스크립트에 전달하는 올바른 방법으로 AngelScript 설명서를 읽는 데 문제가 있습니다. 내가 C++ 클래스 Circle을 가지고 AngelScript를 인식하고 싶다고 해봅시다.AngelScript에서 C++ 클래스 등록 및 클래스 인스턴스 전달

class Circle 
{ 
public: 
    int getArea(); 

    int radius; 
}; 

여기에서 I는 AngelScript 엔진에 getArea()있어서 레지스터 (또는 가능한 경우 자동 클래스의 모든 메소드 등록), 및 전달은 Circle 클래스의 인스턴스를 생성하고자 클래스 인스턴스 자체를 AngelScript 환경에 추가합니다.

Circle circleInstance; 
circleInstance.radius = 10; 

// Initialize AngelScript engine 

asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); 

engine->RegisterObjectMethod("Circle", "int getArea()", 
    asMETHOD(Circle, getArea), asCALL_THISCALL); 

AngelScript에서 인스턴스 변수에서 메서드를 호출하고 C++ 함수의 결과를 반환하고 싶습니다.

circleInstance.getArea(); 

그러나, 위의 코드에서 나는 스크립팅 환경은 그 존재의 아무 생각이 없다, 그래서 명확하게, 어떤 방법으로 AngelScript 엔진 인스턴스 circleInstance을 통과하지 않다. 내가 뭔가를 간과하고 대답은 C++의 한두 줄 정도라고 가정합니다. Circle 클래스를 RegisterObjectType 또는 RegisterInterface과 같은 메서드를 통해 등록해야합니까?이 작업을 수행하려면 Circle에서 asIScriptObject을 상속해야합니까? 모든 통찰력은 높이 평가됩니다!

+0

이 [매뉴얼에] 적용되지 않은 경우 (http://www.angelcode.com/angelscript/sdk/docs/manual/doc_register_type.html) 상세? –

+0

그곳이 보일 곳 이겠지만 "객체 유형 등록하기"어디에도 클래스의 인스턴스를 전달하는 방법은 설명되어 있지 않습니다. 단, 일부 텍스트를 간과하지 않는 한 말이지요.'Circle'과 같은 클래스 이름을 클래스 타입으로 전달하는 법을 설명하고 있지만 환경에 클래스 인스턴스 (예 :'circleInstance')를 인식시키는 방법을 궁금합니다. – Vortico

+0

하지만 지금 나는 무언가를하고 있습니다. 스크립팅 환경에서'circleInstance'를 전역 변수로 등록하고자한다면'Engine-> RegisterGlobalProperty ("Circle @circleInstance", & circleInstance);를 호출 할 수 없습니까? 그렇다면 내 문제의 절반을 해결할 수 있습니다. AngelScript에 클래스에 대한 정보를 제공하려면'RegisterObjectType' 또는'RegisterInterface'를 사용해야합니까? 그런 다음 클래스의 각 메소드를 등록해야합니까, 아니면 자동으로이 메소드를 등록합니까? (그렇지 않다면 나는이 인상을 어디서 얻었는지 전혀 모른다.) – Vortico

답변

7

먼저 서클 개체를 등록하십시오.

engine->RegisterObjectType("Circle",0, asOBJ_REF); // asOBJ_REF because you wanted a reference call 
engine->RegisterObjectBehaviour("Circle", asBEHAVE_ADDREF, "void f()", asMETHOD(Circle, AddRef), asCALL_THISCALL); 
engine->RegisterObjectBehaviour("Circle", asBEHAVE_RELEASE, "void f()", asMETHOD(Circle, ReleaseRef), asCALL_THISCALL); 

AddRef 및 ReleaseRef 함수에 유의하십시오. 이것들은 Angelscript가 필요할 때 메모리에서 그것들을 해제 할 수있게하는 필수 기능입니다. 당신은 당신의 예제에서 당신이 참조만을 사용하기를 원하는 것처럼 실제로 구현할 필요가 없다. 그냥 이렇게 선언 해주세요.

class Circle 
{ 
public: 

    void AddRef() { /* do nothing */ } 
    void ReleaseRef() { /* do nothing */ } 
} 

지금 개체 메서드를 등록하십시오. (getArea() 함수)

engine->RegisterObjectMethod("Circle", "int getArea()", asMETHOD(Circle, getArea), asCALL_THISCALL); // asCALL_THISCALL means we will call function using myCircle.getArea() 

다음 글로벌 등록 속성을 등록하십시오. 이것은 angelscript에서 사용하려는 인스턴스입니다.

engine->RegisterGlobalProperty("Circle myCircle", &CircleInstance); 

이제 angelscript 파일

int value = myCircle.getArea(); // remember you registered myCircle as Circle reference 

int radius = myCircle.radius; // error. you need to register each member. 

에 난 당신이 끝까지 문서의 시작을 읽고 조언한다. 개체 핸들, 참조 계산 등은 파악해야하는 매우 중요한 개념입니다.

angelscript는 매우 쉽게 삽입 할 수 있으며, 설명서가 많이 도움이됩니다. 그러나 확실히 당신 손을 잡지는 않습니다.

Google을 통해 알 수 있듯이 이것은 늦은 답변입니다. 나는 그 질문에 답을주지 않고 싶지 않았다. 어떤 사람이 내 대답을 유용하게 생각할 수도 있습니다.

img

관련 문제