我正在制作蛇游戏但是当我尝试实例化我的蛇对象时,我得到“未捕获的TypeError:undefined不是函数”。
function draw(){
var canvas = document.getElementById("canvas");
if (canvas.getContext){
var ctx = canvas.getContext('2d');
}
drawSnake();
}
这是我实例化蛇对象并绘制它的地方,我更明确地得到错误的第13行。
function drawSnake(){
var Snake = new Snake(250,250,-1,0);
Snake.create();
ctx.fillStyle = "white";
for(i=Snake.snakeBlock.length(); i>=0;i--){
var s = Snake.snakeBlock[i].block;
ctx.fillRect(s.xPos,s.xPos,s.height,s.width);
}
}
function Block(x,y,w,h){
var xPos = x;
var yPos = y;
var width = w;
var height = h;
}
这是我定义蛇对象的地方,但我仍然遇到错误。
function Snake(x,y,dY,dX){
var snakeBlock = [];
var length = 20;
var xPos = x;
var yPos = y;
var dirX = dX;
var dirX = dY;
Snake.prototype.create = function(){
for (var i = 0; i <= length; i++) {
snakeBlock.push(new Block((xPos-(i*10))*dirX, (yPos-(i*10))*dirY,10,10));
};
}
}
在创建对象时是否有一些我无视的东西,因为我无法弄清楚代码有什么问题。
答案 0 :(得分:2)
您粘贴的代码存在很多问题。我已经创建了一个非常快速的小提琴,并调整了您的代码,以便它不会出错(尽管它可能不是编写它的最佳方式)。
我发现的一些事情与不使用this
有关。尝试将变量名Snake
与名为Snake
的对象同时使用。当没有snakeBlock[i].block
组件时,引用block
之类的内容。使用length()
时,只需使用.length
。将prototype
函数放在construtor中。
如果您需要更多帮助,可能需要详细说明。
答案 1 :(得分:1)
var Snake = new Snake(250,250,-1,0);
您是否尝试在此处覆盖Snake
构造函数?无论如何,declaration of the local variable是阴影全局Snake
构造函数引用,Snake
是undefined
当您尝试调用它时。使用不同的变量名称 - 通常实例名称是小写的:
var snake = new Snake(250, 250, -1, 0);
for(i=Snake.snakeBlock.length(); i>=0;i--){
var i
.length
确实不是一个功能:it is a plain, numeric property。snakeBlock
是Snake
构造函数中的局部变量,而不是属性。var s = Snake.snakeBlock[i].block;
snakeBlock[i]
已经引用了你放在那里的Block
个实例。它没有.block
属性。
var snakeBlock = [];
如前所述,这确实声明了一个局部变量。但是,您希望从外部访问它(在原型方法中,在drawSnake
调用中),因此您应该创建一个属性:
this.snakeBlock = [];
详细了解Javascript: Do I need to put this.var for every variable in an object?中的差异。
Snake.prototype.create = function(){
永远不要在构造函数中对原型进行赋值!你的缩进也搞砸了。
snakeBlock.push(…)
现在,将其作为属性访问:
this.snakeBlock.push(…)
另请参阅@MattWay's fiddle了解固定版本: - )