2011-04-11 6 views
1

동일한 구조를 구현하는 스크립트를 여러 개 갖고 싶은 게임을 개발 중입니다. 각 스크립트는 코드가 다른 스크립트와 겹치지 않도록 자체 범위에서 실행해야합니다. 예를 들어 :javax.script를 사용하여 여러 스크립트를 효율적으로 실행하는 방법

structure.js 이제

function OnInit() { 
    // Define resources to load, collision vars, etc. 
} 

function OnLoop() { 
    // Every loop 
} 

function ClickEvent() { 
    // Someone clicked me 
} 

// Other fun functions 

, 내가 가지고 있다고 할 수 있습니다 : "BadGuy.js", "ReallyReallyBadGuy.js", "OtherBadGuy.js"- 그들은 모두 위처럼 구조 측면에서. 게임 내에서 이벤트가 발생할 때마다 적절한 함수를 호출하고 싶습니다.

문제는 효율성과 속도가 저하됩니다. 각 스크립트 인스턴스 (getEngineByName 사용)에 대한 엔진을 생성하여 작동하는 해결책을 찾았지만 이상적이지 않습니다.

더 나은 해결책이 없다면 각 스크립트에 고유 한 클래스/함수 이름이있는 것이 좋습니다. 나는. 나는 생각하지 않는다

BadGuy.js

var BadGuy = new Object(); 

BadGuy.ClickEvent = function() { 
} 

답변

-1

당신은 모든 "사람"에 대한 새의 ScriptEngine을 작성해야합니다. 하나의 엔진에서 모두 관리 할 수 ​​있습니다. 그래서 당신에게 게임 시나리오를 도살하기위한 사전 사과와 함께 .....

  1. Rhino 엔진의 한 인스턴스를 가져옵니다.
  2. 엔진에서 새 JS 개체를 추가하고이 개체에서 지원할 다양한 동작 (또는 기능)과 함께 eval (script) 문을 실행합니다.
  3. 각각에 대해 호출 할 수있는 몇 가지 선택 사항이 있지만 각각의 "녀석"이 고유 한 이름을 가진 한 항상 이름으로 참조하고 이름 지정된 메소드를 호출 할 수 있습니다.
  4. 성능에 민감한 조작 (일종의 라운드 기반 이벤트 루프)의 경우 원본을 다시 평가하지 않고도 실행할 수있는 동일한 엔진에서 스크립트를 사전 컴파일 할 수 있습니다.

다음은 Groovy에서 작성한 샘플입니다.

import javax.script.*; 
sem = new ScriptEngineManager(); 
engine = sem.getEngineByExtension("js"); 
engine.getBindings(ScriptContext.ENGINE_SCOPE).put("out", System.out); 
eventLoop = "for(guy in allGuys) { out.println(allGuys[guy].Action(action)); }; " 
engine.eval("var allGuys = []"); 
engine.eval("var BadGuy = new Object(); allGuys.push(BadGuy); BadGuy.ClickEvent = function() { return 'I am a BadGuy' }; BadGuy.Action = function(activity) { return 'I am doing ' + activity + ' in a BAD way' }"); 
engine.eval("var GoodGuy = new Object(); allGuys.push(GoodGuy); GoodGuy.ClickEvent = function() { return 'I am a GoodGuy' }; GoodGuy.Action = function(activity) { return 'I am doing ' + activity + ' in a GOOD way' }"); 
CompiledScript executeEvents = engine.compile(eventLoop); 
println engine.invokeMethod(engine.get("BadGuy"), "ClickEvent"); 
println engine.invokeMethod(engine.get("GoodGuy"), "ClickEvent"); 
engine.getBindings(ScriptContext.ENGINE_SCOPE).put("action", "knitting"); 
executeEvents.eval(); 
관련 문제