Javascript 设置变量时的游戏代码中断

Javascript 设置变量时的游戏代码中断,javascript,variables,Javascript,Variables,此游戏代码看起来不错,但不起作用: //Get canvas and context var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); //Capture keypresses var keys = []; document.onKeyDown = function (e) {keys[e.keyCode] = true;}; document.onKeyUp = functio

此游戏代码看起来不错,但不起作用:

//Get canvas and context
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');

//Capture keypresses
var keys = [];
document.onKeyDown = function (e) {keys[e.keyCode] = true;};
document.onKeyUp = function (e) {keys[e.keyCode] = false;};

//Set game variables
var characters;
characters.charList = [];
var player = {};

//Character constructor
function Character (Name, Strength, Speed, Intelligence, Reflexes, Age, Height, Weight, Weapon, UsesMagic, MagicType, Armor, Hair, Eyes, Skin, Clothes, Species, Type, Accessories) {
        this.name = Name;
        this.strength = Strength;
    this.speed = Speed;
    this.intelligence = Intelligence;
    this.reflexes = Reflexes;
    this.age = Age;
    this.height = Height;
    this.weight = Weight;
    this.weapon = Weapon;
    this.usesMagic = UsesMagic;
    this.magicType = MagicType;
    this.armor = Armor;
    this.hair = Hair;
    this.eyes = Eyes;
    this.skin = Skin;
    this.clothes = Clothes;
    this.species = Species;
    this.type = Type;
    if (Accessories) {
            this.accessories = Accessories;
    }
    characters.charList[characters.charList.length] = Name;
}

characters.Xantar = new Character('Xantar', 1, 1, 1, 1, 1, 1, 1, 'sword', true, 'derp', [], 'hair is brown\?', 'duh', 'foo', [], 'animale', 'wolf', []);
alert(characters.Xantar.weapon + '   ' + characters[0].type);

//Activate mainloop and get value for pausing purposes
var mainloopInterval = setInterval(mainloop, 5);
//Main game loop
function mainloop(){

}
该计划似乎停止于:

characters.charList = [];
我根本看不出这里有什么问题。以下是相关的HTML:

<canvas id='canvas' style='border:1px solid black;'>Your browser does not support canvas. Please update your browser.</canvas>
注意:我在JSFIDLE上运行这个。 如果有人能在这里帮助我,我将非常感激。
下面是链接:。

需要将其设置为对象var characters={}

需要将其设置为对象var characters={}

变量字符必须是对象。变量字符={}; 不应使用var关键字初始化charList,因为它不是新变量,所以它只是个字符。charList=[]; 第42行不是字符[0]。键入,而是字符.Xantar.type 变量字符必须是对象。变量字符={}; 不应使用var关键字初始化charList,因为它不是新变量,所以它只是个字符。charList=[]; 第42行不是字符[0]。键入,而是字符.Xantar.type
如前所述,在能够访问characters变量中的属性之前,需要将对象分配给characters变量

只是用var字符声明它;将为其分配undefined的值,尝试访问undefined.charList并为其分配空数组将失败

一种更合适、抗故障且可读的声明方式是构建空数据结构,如下所示:

var characters = {
    charList: []
};
此外,使用array.push添加到数组末尾比按array.length索引更安全,即

而不是

characters.charList[characters.charList.length] = Name;

如前所述,在能够访问characters变量中的属性之前,需要将对象分配给characters变量

只是用var字符声明它;将为其分配undefined的值,尝试访问undefined.charList并为其分配空数组将失败

一种更合适、抗故障且可读的声明方式是构建空数据结构,如下所示:

var characters = {
    charList: []
};
此外,使用array.push添加到数组末尾比按array.length索引更安全,即

而不是

characters.charList[characters.charList.length] = Name;

请分享JSFIDLE链接作为旁注,使用大写的第一个字母作为变量是一种反模式,可能会导致与类名冲突类型可能是它自己的类谢谢大家的帮助!你可能还想考虑里面没有字符列表,如果一个名为CARLIST的字符突然出现的话,就可能会中断。正确地将内容放在哪里取决于您打算在charList和Characters中使用什么。请共享JSFIDLE链接作为旁注,在变量中使用大写首字母是一种反模式,可能会导致与类名冲突。类型很可能是它自己的类谢谢大家的帮助!你可能还想考虑里面没有字符列表,如果一个名为CARLIST的字符突然出现的话,就可能会中断。正确地把东西放在哪里取决于你想在charList和Characters中找到什么样的答案!虽然我想到了array.push;。不客气:使用push这样的方法可以更容易地查看代码中的实际情况。谢谢您的回答!虽然我想到了array.push;。不客气:使用push这样的方法可以更容易地查看代码中的实际情况。实际上,我在测试characters.charList数组,所以我想做characters[characters.charList[0]]。键入,我只是用var测试characters.charList,以防万一。那不是永久的。不过还是要谢谢你!实际上,我在测试characters.charList数组,所以我想做characters[characters.charList[0]].type,我只是用var测试characters.charList,以防万一。那不是永久的。不过还是要谢谢你!