2017-07-28 118 views
1

我正在写简单的“蛇”游戏,我面临着这个问题: 每次驯服我的蛇打红圈(苹果),苹果应该移动到一个新的位置画布。现在出现了新的苹果,但旧的苹果不会消失(它应该),并且当画布上有两个以上的苹果时,它们会创建一个填充图形......它看起来像这样:ibb.co/nrYdLQ(也不应该发生)。JavaScript - 将对象移动到新位置

负责移动一个苹果的代码是这样的:

if (!this.objectCollide(myApple)) { 
    this.segments.pop(); 
    } else { 
    myApple = new block(Math.floor(Math.random() * gameField.width),Math.floor(Math.random() * gameField.height)) 
    }; 

,我不知道为什么它的工作就像我上面描述,而不是只移动一个苹果到新的位置,并删除旧的。 请帮忙。

的jsfiddle:https://jsfiddle.net/e1ga0fpm/

完整的JavaScript代码:

var gameField = document.getElementById('gameField'); 
var ctx = gameField.getContext("2d"); 
var blockSize = 10; 
columnCt = gameField.width/blockSize; 
rowsCt = gameField.height/blockSize; 

var block = function(x, y) { 
    this.x = x; 
    this.y = y; 
} 

block.prototype.drawBlock = function() { 
    ctx.fillStyle = "blue"; 
    ctx.fillRect(this.x * blockSize, this.y * blockSize, blockSize, 
    blockSize); 
}; 

block.prototype.drawApple = function() { 
    ctx.fillStyle = "red"; 
    ctx.textBaseline = "bottom"; 
    ctx.arc(this.x, this.y, 6, 2 * Math.PI, false); 
    ctx.fill(); 
} 

var Snake = function() { 
    this.segments = [new block(20, 20), new block(19, 20), new block(18, 20), new block(17, 20), 
    new block(16, 20), new block(15, 20), new block(14, 20), new block(13, 20), new block(12, 20), 
    new block(11, 20), new block(10, 20) 
    ]; 
    this.direction = "right"; 
} 

Snake.prototype.drawSnake = function() { 
    for (i = 0; i < this.segments.length; i++) { 
    this.segments[i].drawBlock(); 
    } 
} 

Snake.prototype.setDirection = function(dir) { 
    if (this.direction == "left" && dir == "right" || this.direction == "right" && dir == "left" || this.direction == "up" && dir == "down" || 
    this.direction == "down" && dir == "up") { 
    return 
    } else { 
    this.direction = dir; 
    }; 
}; 

Snake.prototype.objectCollide = function(obj) { 
    if (this.segments[0].x == Math.round(obj.x/blockSize) && this.segments[0].y == Math.round(obj.y/blockSize)) { 
    return true 
    } else { 
    return false 
    } 
}; 

Snake.prototype.move = function() { 
    var head = this.segments[0]; 
    var newHead; 

    switch (this.direction) { 
    case "right": 
     newHead = new block(head.x + 1, head.y); 
     break; 
    case "left": 
     newHead = new block(head.x - 1, head.y) 
     break; 
    case "down": 
     newHead = new block(head.x, head.y + 1) 
     break; 
    case "up": 
     newHead = new block(head.x, head.y - 1) 
     break; 
    } 

    this.segments.unshift(newHead); 

    if (!this.objectCollide(myApple)) { 
    this.segments.pop(); 
    } else { 
    myApple = new block(Math.floor(Math.random() * gameField.width),Math.floor(Math.random() * gameField.height)) 
    }; 
    var collision = newHead.x >= columnCt || newHead.x <= -1 || 
    newHead.y >= rowsCt || newHead.y <= -1; 

    for (i = 1; i < this.segments.length; i++) { 
    if (this.segments[i].x == newHead.x && this.segments[i].y == newHead.y) { 
     collision = true; 
     break; 
    }; 
    }; 

    if (collision) { 
    clearInterval(myFun); 
    }; 

}; 

var mySnake = new Snake() 
mySnake.drawSnake(); 
var myApple = new block(Math.floor(Math.random() * gameField.width), 
    Math.floor(Math.random() * gameField.height)); 
var myFun = setInterval(function() { 
    ctx.clearRect(0, 0, gameField.width, gameField.height); 
    mySnake.move(); 
    mySnake.drawSnake(); 
    myApple.drawApple(); 
}, 100) 

var directions = { 
    37: "left", 
    38: "up", 
    39: "right", 
    40: "down" 
}; 

document.onkeydown = function(event) { 
    var newDirection = directions[event.keyCode] 
    if (newDirection != undefined) { 
    mySnake.setDirection(newDirection); 
    }; 

回答

1

你在画苹果的时候忘了beginpath。另外,当吃苹果时,你必须添加新的块给蛇。检查下面的编辑代码。

这里更新fiddle

block.prototype.drawApple = function() { 
    ctx.fillStyle = "red"; 
    ctx.textBaseline = "bottom"; 
    ctx.beginPath(); 
    ctx.arc(this.x, this.y, 6, 2 * Math.PI, false); 
    ctx.fill(); 
} 

var gameField = document.getElementById('gameField'); 
 
var ctx = gameField.getContext("2d"); 
 
var blockSize = 10; 
 
columnCt = gameField.width/blockSize; 
 
rowsCt = gameField.height/blockSize; 
 

 
var block = function(x, y) { 
 
    this.x = x; 
 
    this.y = y; 
 
} 
 

 
block.prototype.drawBlock = function() { 
 
    ctx.fillStyle = "blue"; 
 
    ctx.fillRect(this.x * blockSize, this.y * blockSize, blockSize, 
 
    blockSize); 
 
}; 
 

 
block.prototype.drawApple = function() { 
 
    ctx.fillStyle = "red"; 
 
    ctx.textBaseline = "bottom"; 
 
    ctx.beginPath(); 
 
    ctx.arc(this.x, this.y, 6, 2 * Math.PI, false); 
 
    ctx.fill(); 
 

 
} 
 

 
var Snake = function() { 
 
    this.segments = [new block(20, 20), new block(19, 20), new block(18, 20), new block(17, 20), 
 
    new block(16, 20), new block(15, 20) 
 
    ]; 
 
    this.direction = "right"; 
 
} 
 

 
Snake.prototype.drawSnake = function() { 
 
    for (i = 0; i < this.segments.length; i++) { 
 
    this.segments[i].drawBlock(); 
 
    } 
 
} 
 

 
Snake.prototype.setDirection = function(dir) { 
 
    if (this.direction == "left" && dir == "right" || this.direction == "right" && dir == "left" || this.direction == "up" && dir == "down" || 
 
    this.direction == "down" && dir == "up") { 
 
    return 
 
    } else { 
 
    this.direction = dir; 
 
    }; 
 
}; 
 

 
Snake.prototype.objectCollide = function(obj) { 
 
    if (this.segments[0].x == Math.round(obj.x/blockSize) && this.segments[0].y == Math.round(obj.y/blockSize)) { 
 
    return true 
 
    } else { 
 
    return false 
 
    } 
 
}; 
 

 
Snake.prototype.move = function() { 
 
    var head = this.segments[0]; 
 
    var newHead; 
 

 
    switch (this.direction) { 
 
    case "right": 
 
     newHead = new block(head.x + 1, head.y); 
 
     break; 
 
    case "left": 
 
     newHead = new block(head.x - 1, head.y) 
 
     break; 
 
    case "down": 
 
     newHead = new block(head.x, head.y + 1) 
 
     break; 
 
    case "up": 
 
     newHead = new block(head.x, head.y - 1) 
 
     break; 
 
    } 
 

 
    this.segments.unshift(newHead); 
 

 
    if (!this.objectCollide(myApple)) { 
 
    this.segments.pop(); 
 
    } else { 
 
    myApple = new block(Math.floor(Math.random() * gameField.width), Math.floor(Math.random() * gameField.height)); 
 
    this.segments.push(new block(this.segments[0][0], 20)) 
 
    }; 
 
    var collision = newHead.x >= columnCt || newHead.x <= -1 || 
 
    newHead.y >= rowsCt || newHead.y <= -1; 
 

 
    for (i = 1; i < this.segments.length; i++) { 
 
    if (this.segments[i].x == newHead.x && this.segments[i].y == newHead.y) { 
 
     collision = true; 
 
     break; 
 
    }; 
 
    }; 
 

 
    if (collision) { 
 
    clearInterval(myFun); 
 
    }; 
 

 
}; 
 

 
var mySnake = new Snake() 
 
mySnake.drawSnake(); 
 
var myApple = new block(Math.floor(Math.random() * gameField.width), 
 
    Math.floor(Math.random() * gameField.height)); 
 
var myFun = setInterval(function() { 
 
    ctx.clearRect(0, 0, gameField.width, gameField.height); 
 
    mySnake.move(); 
 
    mySnake.drawSnake(); 
 
    myApple.drawApple(); 
 
}, 100) 
 

 
var directions = { 
 
    37: "left", 
 
    38: "up", 
 
    39: "right", 
 
    40: "down" 
 
}; 
 

 
document.onkeydown = function(event) { 
 
    var newDirection = directions[event.keyCode] 
 
    if (newDirection != undefined) { 
 
    mySnake.setDirection(newDirection); 
 
    }; 
 
};
canvas { 
 
    position: absolute; 
 
    top: 0; 
 
    bottom: 0; 
 
    left: 0; 
 
    right: 0; 
 
    margin: auto; 
 
    border: 5px solid grey; 
 
}
<canvas id="gameField" height="500" width="500"> 
 
</canvas>

+0

谢谢!这就像一个魅力!你介意怎么解释一下ctx.beginPath();使它工作?因为它会让我感到困惑。 – Pawel

+0

否则它会从先前的绘制点画出弧线。 –

+0

@Pawel检查更新的代码与苹果吃,蛇的大小也增加。 –

2

林相当unshure为什么苹果不会 “吃掉” 不过,我可能知道为什么它看起来太奇怪了:

如果您画到画布看起来像一支钢笔。所以,每当你画一个新的苹果,笔就移动到那个位置,并画出一条线。在几个苹果之后,如果你调用.fill(),这个(但不可见的)行会被填充。所以你需要在画之前移动笔:

block.prototype.drawApple = function() { 
    ctx.fillStyle = "red"; 
    ctx.textBaseline = "bottom"; 
    ctx.moveTo(this.x,this.y); 
    ctx.arc(this.x, this.y, 6, 2 * Math.PI, false); 
    ctx.fill(); 
} 
+0

谢谢! ,我真的不知道为什么我没有想到......所以1个问题解决了,但为什么苹果没有“吃”? – Pawel

相关问题