Game Dev JS将对象存储到数组

时间:2019-04-26 12:59:09

标签: javascript

我使用多种语言,并且正在扩展我在JS(而非jquery)方面的经验。尽管这适用于我使用的许多工具,但我认为这将是一个简单的程序,但让我为数组/对象问题感到困惑。而且我可能会从错误的方向进行攻击。

简而言之,这是一个简单的游戏(我正在学习JS中的对象和数组,并认为这将是一个很好的挑战)。由15个小怪组成,每个小怪会攻击10次波浪,每个波浪有多达5个不同的标准来赢得该波浪。波浪结束后,它将移至下一个生物,然后重复。

使用其他语言甚至PHP,您可以执行类似于以下伪代码的操作:

aMob = record {
    id: integer,
    name: string
    hp: integer
    etc....
}
mob[15]: aMob 

现在我有15个aMob的阵列

因此您可以使用mobCnt = 0 并获取mob [mobCnt] .name

我可以在JS中做到这一点。很简单的数组,但这对我来说很复杂

我观看并阅读了一些教程,并了解了对象。那似乎是正确的方法,但是我可以创建对象(样板?)但是然后我无法创建多维数组,每个生物都将与10个波关联,并且每个波有5个项目要满足。 3D阵列?

此功能在sorta的下面被删除了。但是非常笨拙的编码。而且,当我单击“攻击”按钮时出现了问题,mobhp不会减少,因此我将该变量设为全局变量。但是更改代码后,它只会变得越来越大。因此,这必须是垃圾。这是我得到的唯一代码,至少可以执行某些操作,但是我觉得对象/数组方法会更好。

function setBattleRoundNFO(currMobCnt, currWaveCnt  ) {
    switch(currMobCnt) {
        case 0:  mobName = "Rodents";
                // mob = 100; 
                switch(currWaveCnt){
                    case 0:  weaponId = 1; armorId = 0; powerMoveId = 3; break; // weapon, armor and powermove skill
                    case 1:  weaponId = 4; armorId = 5; powerMoveId = 6; break;
                }
                break;
        case 1: mobName = "Wolf Pack";
                mobHp *= 1.15;
                switch(currWaveCnt){
                    case 0:  weaponId = 7; armorId = 8; powerMoveId = 9; break; // weapon, armor and powermove skill
                    case 1:  weaponId = 10; armorId = 11; powerMoveId = 12; break;
                }
                break;

    }
}

理想情况下,我想发生的是它显示(通过跟踪变量)显示

mob[1].wave[1].hp,armor,weapon,level... etc..

在这场战斗中获胜之后,请移至下一波

mob[1].wave[2].hp,armor,weapon,level .. etc..

我在pascal,qb64和php上尝试了此方法,效果很好,但我想在JS中使用它,而数组部分让我很沮丧。

谢谢

2 个答案:

答案 0 :(得分:4)

如果我理解正确,则您需要多个小怪。每个都有多个波浪。每个wave具有多个字符。每个字符都有属性。

听起来您想要混合使用数组和对象。

const mob = [
  { wave: [{ weapon: "foo", hp: 10 }, { weapon: "bar", hp: 20 }] },
  { wave: [{ weapon: "baz", hp: 30 }, { weapon: "quux", hp: 40 }] }
];

通过这种结构,您可以按上述方式访问数据:

mob[1].wave[1].hp // 40

mob[0].wave[0].weapon // foo

答案 1 :(得分:1)

只需应用一些OOP原则。一战有10波,每波有15个怪物和5个物品。

因此,您可以为所有这些概念创建类并以这种方式使用它们。

或者您可以将整个战斗建模为包含对象的数组:

const state = {
    active_wave: null,
    monsters: [],
    wave_number: 0
};

const battle_model = [
    {
        id: 14574125754,
        type: "wave",
        criteria: [
            {
                id: 213156421,
                type: "criterium",
                description: "Defeat at least 50% of all monsters.",
                validate: state => state.monsters.length <= state.active_wave.monsters.length / 2
            },
            {
                id: 213156422,
                type: "criterium",
                description: "Kill the boss monster.",
                validate: state => !state.monsters.includes( monster => monster.type === "boss" )
            }
        ],
        monsters: [
            {
                id: 789545,
                type: "monster",
                power: 10,
                health: 15
            },
            {
                id: 789546,
                type: "boss",
                power: 50,
                health: 200
            },
        ]
    },
    {
        id: 14574125755,
        type: "wave",
        criteria: [

        ],
        monsters: [

        ]
    }   
];

const check_criteria = () => state.active_wave.criteria.every( criterium => criterium.validate( state ));

const start_wave = ( state, wave ) => {
    state.active_wave = wave;
    state.monsters = JSON.parse(JSON.stringify( wave.monsters ));
    state.wave_number = state.wave_number + 1;
    return state;
};

通过分开当前的活动波和整个战斗计划,您实际上不需要编写wave[1].monster[3].hp或类似内容,因为激活波只将所有相关的波信息复制到活动状态。

可以在state.monsters数组中进行HP等的任何更改,因此我们既有原始怪物也有副本要处理。