javascript - QUEUE and 'IF' 'ELSE' 'WHILE' statements from scratch and running functions

标签 javascript if-statement while-loop queue game-engine

我正在用 javascript 制作一个游戏引擎,需要一些方法来编写一些 Action 。

代码在这里:

<!DOCTYPE html> <html> <body> <script>
var engine={}, actions={}; engine.atomStack=new Array();
events = {
    1: ["action1|5","action2|2;2","action1|2"],
    2: ["action2|5;2","action2|2;2"],
    3: ["action2|5;2","action1|2"] };

engine.runatomStack = function(){
    while(engine.atomStack.length > 0){
        var actionToRun = engine.atomStack.shift();
        actionToRun[0](actionToRun[1]);  } };

eventActivate = function(event) {
    for (var i = 0; i < events[event].length ; i++) {
        var actionAndParam = events[event][i].split('|');
        translateActions(actionAndParam[0],actionAndParam[1]);  } };

engine.action1 = function( param ) {
    console.log("executed action 1, param "+param[0]); }

engine.action2 = function( param ) {
    console.log("executed action 2, params "+param[0]+" "+param[1]); }

actions.action1 = function( param ) {
    var params = param.split(';');
    engine.atomStack.push([engine.action1,params]); }

actions.action2 = function( param ) {
    var params = param.split(';');
    params[1]=parseInt(params[1],10)+2
    engine.atomStack.push([engine.action2,params]); }

translateActions = function(action, param) { actions[action](param); };
</script> </body> </html>

发生了一些事情,我需要在一个事件中运行这些 Action 。我调用 eventActivate 传递应该发生的事件。函数 translateAction 读取此信息并调用设置 Action 的函数。我的逻辑是基于关卡包含事件,事件可以包含 Action ,每个不同的 Action 包含原子。

示例:在某个时候您调用 eventActivate(1) 并将相关事件压入堆栈。然后不时使用引擎并调用 engine.runatomStack() 来执行那里的任何内容。

//engine.atomStack is Array [  ]

eventActivate(2)
//engine.atomStack is Array [ Array[2], Array[2] ]

engine.runatomStack()

//prints:
//   "executed action 2, params 5 4" example.html:18
//   "executed action 2, params 2 4" example.html:18

//engine.atomStack is Array [  ]

好的,所以我的引擎开始增长,现在我想我需要添加 IF/ELSE 语句和 WHILE/BREAK 循环。我对实现有一些想法,但希望帮助了解使用此队列最有效的方法。很抱歉,如果它是重复的,但无法使用 Google 找到帮助。

我想,如果我有事件:

4: ["action2|5;2","IF|condition","action2|2;2","END|"]
5: ["action2|5;2","IF|condition","action2|2;2","ELSE|","action1|2","END|"]

我不确定到底该怎么做,什么最有效...

jsFiddle 版本链接:http://jsfiddle.net/e3b0kocc/

最佳答案

好的,

我有一个可以解决一些问题的实现,但我认为我不能将一个 if 放在另一个 if 中,这是一个问题。

<!DOCTYPE html> <html> <body> <script>
var engine={}, actions={}; engine.atomStack=new Array();
events = {
    1: ["action1|5","action2|2;2","action1|2"],
    2: ["action2|5;2","if|true","action1|5","else|","action2|2;2","end|"],
    3: ["action2|5;2","action1|2"] };

engine.runatomStack = function(){
    while(engine.atomStack.length > 0){
        var actionToRun = engine.atomStack.shift();
        actionToRun[0](actionToRun[1]);  } };

eventActivate = function(event) {
    for (var i = 0; i < events[event].length ; i++) {
        var actionAndParam = events[event][i].split('|');
        translateActions(actionAndParam[0],actionAndParam[1]);  } };

evalCondition = function( param ){
    return false
}

engine.if = function( param ) {
    if ( evalCondition(param)) {
        var removeActions = false
        for (var i = 0; i < engine.atomStack.length ; i++) {
            if(engine.atomStack[i][0] == engine.else) {
                removeActions = true
            }
            if(engine.atomStack[i][0] == engine.end) {
                return
            }
            if(removeActions == true){
                engine.atomStack.splice(i)
            }

        }
    } else {
        var actionToRun =[0,0]
        while(engine.atomStack.length > 0 && 
              actionToRun[0] != engine.end &&
              actionToRun[0] != engine.else ){
        var actionToRun = engine.atomStack.shift();
        }
    }
}

engine.end = function () {}

engine.else = function () {}

engine.action1 = function( param ) {
    console.log("executed action 1, param "+param[0]); }

engine.action2 = function( param ) {
    console.log("executed action 2, params "+param[0]+" "+param[1]); }

actions.action1 = function( param ) {
    var params = param.split(';');
    engine.atomStack.push([engine.action1,params]); }

actions.if = function( param ) {
    var params = param.split(';');
    engine.atomStack.push([engine.if,params]); }

actions.else = function( param ) {
    engine.atomStack.push([engine.else,'']); }

actions.end = function( param ) {
    engine.atomStack.push([engine.end,'']); }

actions.action2 = function( param ) {
    var params = param.split(';');
    params[1]=parseInt(params[1],10)+2
    engine.atomStack.push([engine.action2,params]); }

translateActions = function(action, param) { actions[action](param); };
</script> </body> </html>

可以通过运行来测试

eventActivate(2)
engine.runatomStack()

将 evalCondition 的返回值修改为 true 会得到不同的结果。有人可以修改 engine.if 代码以允许 if inside if 吗?

关于javascript - QUEUE and 'IF' 'ELSE' 'WHILE' statements from scratch and running functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26172421/

相关文章:

javascript - 使用受控状态更新 react 形式

javascript - jQuery 将事件的水平菜单项滚动到中心

php - 如何在 PHP 中实现屏幕抓取工具?

c# - while 循环确认用户输入

javascript - HackReactor,编码窗口现在可以使用名为 "Admissions"的方法访问名为 "showApp"的对象。不带任何参数调用此方法?

JQuery 从多选列表 if 语句获取值 MVC3

C++ 简单 if 语句不检查?

jsf - 如果列表不为 null 并且 size() > 0,如何显示 JSF 组件

Java while循环无休止地捕获不匹配异常

c - 在没有整数的情况下重新启动c中的while循环