Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 队列和';如果'';其他'';而';从头开始的语句和正在运行的函数_Javascript_If Statement_While Loop_Queue_Game Engine - Fatal编程技术网

Javascript 队列和';如果'';其他'';而';从头开始的语句和正在运行的函数

Javascript 队列和';如果'';其他'';而';从头开始的语句和正在运行的函数,javascript,if-statement,while-loop,queue,game-engine,Javascript,If Statement,While Loop,Queue,Game Engine,我正在用javascript制作一个游戏引擎,需要一些方法来编写一些动作 代码如下: <!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","actio

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

代码如下:

<!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>
好的,我的引擎开始增长,现在我想我需要添加IF/ELSE语句和WHILE/BREAK循环。我对实现有一些想法,但希望通过使用此队列获得最佳效果的帮助。抱歉,如果它是重复的,但无法找到使用谷歌的帮助

我想,如果我有一些事情:

4: ["action2|5;2","IF|condition","action2|2;2","END|"]
5: ["action2|5;2","IF|condition","action2|2;2","ELSE|","action1|2","END|"]
我不知道该怎么做,什么最有效

链接到JSFIDLE版本:

Ok

我有一个可以解决一些问题的实现,但我认为我不能把一个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>

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

我不明白这个问题。您需要使用
if/else
while/break
做什么?您是在问如何只运行队列中的一些操作而不是所有操作吗?是的!我想我会做一个简单的游戏,但后来有了一些想法:如果我已经和角色a谈过了,角色B应该说些不同的话。我突然需要一种方法来让这个选项运行一些操作,而不是其他操作。IF语句本身就是一个可查询的操作。只是出于您的兴趣:我将使用对象而不是数组。然后你就可以摆脱分割函数(字符串)。为什么你不把它变成面向对象的呢?如果你想让它使用观察者模式,那么你可以更容易地编写你的游戏。如果您想实现更多的解耦,那么六边形架构可能适合您的需要。一些例子:尽管如此,您的案例还是很顺利地符合对象观察者/触发器模式。现在我将游戏中的信息存储在json文件中,因为它很容易阅读、理解和操作。我读过一些关于观察者模式的文章,但对你说的话一无所知。同样为了方便起见,请理解IF will的参数可以调用一个名为evalCondition(“条件”)的函数。我的代码编辑器使用可视化语言,每个动作都添加到图形列表中。还有IF和我建议的其他人,我想作为动作实现,但现在他们在循环中操纵堆栈。观察者/模式可用于代码的HID部分:读取gmpad、kbord、toch的部分
<!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()