2012-11-09 3 views
2

게임 엔진을 만들고 있는데 스크립팅에 Io을 사용하고 싶습니다. 엔진은 C++가 아니라 순수한 C99로 작성되었습니다. 성공적으로 Io를 게임의 C 함수 중 일부에 바인딩했으며 제대로 작동합니다.
그러나 C 게임 루프에서 Io 메서드를 호출하고 싶습니다. 기본적으로, 나는 C 게임 루프에서, 그리고Io 언어 포함 : C에서 Io 메소드 호출

Game init := method(...) 
Game keypress := method(key, ...) 
// and update, render, etc 

의 라인을 따라 뭔가를 포함 (IoState_doFile_()와 아마) 스크립트를로드하고 싶습니다, 내가 필요한 일부는 이러한 기능을 호출하고 싶습니다 인수를 전달하는 것. 불행히도, Io의 문서는 훌륭하지만 믿을 수 없을 정도입니다. 나는 IoVM 코드를 약간 파헤쳐 봤고 유용한 것은 아무것도 발견하지 못했다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 아마 정말 비효율적 말할 것도없고,

sprintf(buf, "Game update(%u)", &deltaTime); 
IoState_doCString_(buf); 

같은 뭔가 (내가 시도하지 않은 심지어 그것을 가정하는 것은 작동) 오히려 hackish 보인다.

+0

HTTP를 참조하십시오. yahoo.com/group/iolanguage/message/4471 – Christoph

+0

@Christoph 당신은 검색 닌자입니다! (나는 야후 그룹을 성공시키지 않으려 고 노력했다.) 고마워, 내가 뭘 찾고있는 것처럼 보였다. 답변으로 게시하면 받아 들일 것입니다. –

+0

@Christoph 두 번째 모습에서는 하드 코딩 된 인수 만 전달할 수 있습니다. 나는 그걸 좀 가지고 놀고 내가이 일을 할 수 있는지 알아 보겠다. –

답변

1

this mailing-list thread에 따르면 IoObject_rawDoString_label_()IoState_retain_()을 사용하여 소스의 메시지를 컴파일하고 IoMessage_locals_performOn_()과 함께 적용 할 수 있습니다.

또는 메시지는 IoMessage_newWithName_()IoMessage_setCachedArg_*() 함수를 통해 수동으로 생성 할 수 있습니다.

관련 기능에 대한 문서는 IoMessage.h에서 찾을 수 있습니다.

이 특정 사건에 대한 작동 코드는 당신이 인수를 전달해야 할 메시지의 경우

/* When you initialize everything */ 
renderMessage = IoObject_rawDoString_label_(IoState_lobby(state), 
    IoState_symbolWithCString_(state, "message(Game render())"), 
    IoState_symbolWithCString_(state, "[Game render]")); 
IoState_retain_(state, renderMessage); 

/* In the game loop's render function */ 
IoMessage_locals_performOn_(renderMessage, IoState_lobby(state), IoState_lobby(state)); 

이, 당신이 대신해야 //tech.groups :

/* When you initialize everything */ 
updateMessage = IoMessage_newWithName_(state, IoState_symbolWithCString_(state, "update")); 
IoState_retain_(state, updateMessage); 

/* In the game loop's update function */ 
IoMessage_setCachedArg_toInt_(updateMessage, 0, deltaTime); 
IoMessage_locals_performOn_(updateMessage, IoState_lobby(state), 
    IoObject_getSlot_(IoState_lobby(state), IoState_symbolWithCString_(state, "Game"))); 
+0

정말 고마워. –