【发布时间】:2017-01-05 17:29:08
【问题描述】:
我正在尝试通过将 fillRect 替换为图像来修改 this 画布游戏。
在 spaceinvaders.js 第 529 行更改船舶代码时没有问题:
ship = new Image();
ship.src = "images/ship.svg";
ctx.drawImage(ship, this.ship.x - (this.ship.width / 2), this.ship.y - (this.ship.height / 2), this.ship.width, this.ship.height);
但是入侵者循环有问题:
for(var i=0; i<this.invaders.length; i++) {
var invader = this.invaders[i] = new Image();
this.invaders[i].src = "images/space_invader.png";
//ctx.fillRect(invader.x - invader.width/2, invader.y - invader.height/2, invader.width, invader.height);
this.invaders[i].onload = function(){
var thisX = invader.x * 18;
var thisY = invader.y * 14;
return function() {
ctx.drawImage(invader,invader.x - invader.width/2, invader.y - invader.height/2, invader.width, invader.height);
//ctx.drawImage(this, thisX, thisY, invader.width, invader.height);
};
};
}
当我最终显示入侵者图像时,它会将它们全部堆叠在一起。 - 即使使用 thisX 和 thisY 变量。
编辑:
img = new Image();
img.onload = function(){
for(var i=0; i<this.invaders.length; i++) {
for(var j=0; j<this.invaders.length; j++) {
var invader = this.invaders[i];
ctx.drawImage(img,j*18, i*14, invader.width, invader.height);
}
}
}
img.src = "images/space_invader.png";
给出:无法读取未定义的属性“长度”。
编辑 2:
img = new Image();
img.onload = function(){
for(var i=0; i<5; i++) {
for(var j=0; j<10; j++) {
ctx.drawImage(img,j*22, i*16, 18, 14);
}
}
}
img.src = "images/space_invader.png";
编辑 3:
var invaders=[{x:0,y:0},{x:20,y:0},{x:40,y:0},{x:60,y:0},{x:80,y:0},{x:100,y:0},{x:120,y:0},{x:140,y:0},{x:160,y:0},{x:180,y:0},{x:0,y:16},{x:20,y:16},{x:40,y:16},{x:60,y:16},{x:80,y:16},{x:100,y:16},{x:120,y:16},{x:140,y:16},{x:160,y:16},{x:180,y:16},{x:200,y:16},{x:0,y:32},{x:20,y:32},{x:40,y:32},{x:60,y:32},{x:80,y:32},{x:100,y:32},{x:120,y:32},{x:140,y:32},{x:160,y:32},{x:180,y:32},{x:200,y:32},{x:0,y:48},{x:20,y:48},{x:40,y:48},{x:60,y:48},{x:80,y:48},{x:100,y:48},{x:120,y:48},{x:140,y:48},{x:160,y:48},{x:180,y:48},{x:200,y:48},{x:0,y:64},{x:20,y:64},{x:40,y:64},{x:60,y:64},{x:80,y:64},{x:100,y:64},{x:120,y:64},{x:140,y:64},{x:160,y:64},{x:180,y:64},{x:200,y:64}];
for (var i=0; i<this.invaders.length; i++) {
invaders[i] = new Image();
invaders[i].onload = function() {
ctx.drawImage(this, x, y);
};
invaders[i].src = "images/space_invader.png";
}
给出 x 未定义。
编辑 4:
function createImage(i){
var image = new Image();
image.src = "images/space_invader.png";
image.onload = function(){
ctx.drawImage(image,imagePos[i][0],imagePos[i][1], 20, 16);
}
}
var imagePos=[[0,0],[20,0],[40,0],[60,0],[80,0],[100,0],[120,0],[140,0],[160,0],[180,0],[0,16],[20,16],[40,16],[60,16],[80,16],[100,16],[120,16],[140,16],[160,16],[180,16],[0,32],[20,32],[40,32],[60,32],[80,32],[100,32],[120,32],[140,32],[160,32],[180,32],[0,48],[20,48],[40,48],[60,48],[80,48],[100,48],[120,48],[140,48],[160,48],[180,48],[0,64],[20,64],[40,64],[60,64],[80,64],[100,64],[120,64],[140,64],[160,64],[180,64]];
for(var i = 0; i <this.invaders.length; i += 1){
createImage(i);
}
return
显示入侵者,但他们一直在闪烁。 (主游戏循环?)
【问题讨论】:
-
你用你的 Image 实例覆盖了入侵者。使用
var invader = new Image()之类的局部变量,然后使用invaders[i].x获取坐标。
标签: javascript canvas