gpt4 book ai didi

javascript - 打砖 block - 砖 block 没有出现

转载 作者:太空宇宙 更新时间:2023-11-04 15:42:05 25 4
gpt4 key购买 nike

我目前正在用 JavaScript 语言编写一个 BrickBreaker 游戏。这是我使用该语言的第一个项目之一,我遇到了一些困难。这是我的代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style>
</style>
</head>
<body>

<canvas id="myCanvas" width="500" height="500"></canvas>

<script>

var canvas=document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
var ballRadius=10;
var a = {
x: canvas.width/2,
y: canvas.height-30};
var x=canvas.width/2;
var y=canvas.height-30;
var speed = [2, -2, 10];
var paddle = {
paddleHeight: 10,
paddleWidth: 75,
};
var paddleX=(canvas.width-paddle.paddleWidth)/2;
var rightPressed= false;
var leftPressed=false;
var score = 0;
var brick = {
brickRowCount: 3,
brickColumnCount: 5,
brickWidth: 75,
brickHeight: 20,
brickPadding: 10,
brickOffsetTop: 30,
brickOffsetLeft: 30};
var amountOfBricks = brick.brickRowCount*brick.brickColumnCount;
document.addEventListener("keydown",keyDownHandler,false);
document.addEventListener("keyup",keyUpHandler,false);
var wall = new Wall(5, 3 , 75, 70, 10, 30, 30);
wall.makeBricks();

function Brick(x, y, width, height, status) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.status = status;

this.display = function() {
if(this.status == 1) {
ctx.beginPath();
ctx.rect(this.x, this.y, this.width, this.height);
ctx.fillStyle = "green";
ctx.fill();
ctx.closePath();
}
}
}

function Wall(numRows, numCols, bricksWidth, bricksHeight, bricksPadding, bricksOffsetTop, bricksOffsetLeft) {
this.numRows = numRows;
this.numCols = numCols;
this.bricksWidth = bricksWidth;
this.bricksHeight = bricksHeight;
this.bricksPadding = bricksPadding;
this.bricksOffsetTop = bricksOffsetTop;
this.bricksOffsetLeft = bricksOffsetLeft;
this.bricks = [];

this.makeBricks = function() {
for(c=0; c < this.numRows; c++) {
this.bricks[c] = [];
for(r=0; r < this.numCols; r++) {
this.bricks[c][r] = new Brick(
(c*(this.bricksWidth + this.bricksPadding)+this.bricksOffsetLeft),
(r*(this.bricksHeight+this.bricksPadding)+this.bricksOffsetTop),
this.bricksHeight,
this.bricksWidth,
1)
}
}
}

this.display = function() {
for(row of this.bricks) {
for(brick of row) {
console.log(brick);
brick.display()
}
}
}
}

function keyDownHandler(e){
if(e.keyCode==39){

rightPressed=true;

}
else if(e.keyCode==37){

leftPressed=true;

}

}


function drawScore() {
ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
ctx.fillText("Score: "+score, 8, 20);
}
function keyUpHandler(e){

if(e.keyCode==39){

rightPressed=false;
}
else if(e.keyCode==37){

leftPressed=false;

}
}

function drawBall(){
ctx.beginPath();
ctx.arc(x,y,ballRadius,0,2*Math.PI);
ctx.fillstyle="#0033FF";
ctx.fillStroke="#0033FF";
ctx.Stroke="10"
ctx.fill();
ctx.closePath();
}

function drawPaddle(){
ctx.beginPath();
ctx.rect(paddleX,canvas.height-paddle.paddleHeight,paddle.paddleWidth,paddle.paddleHeight);
ctx.fillstyle="#0095DD";
ctx.fill();
ctx.closePath();
}

function collisionDetection() {
for(c=0; c<brick.brickColumnCount; c++) {
for(r=0; r<brick.brickRowCount; r++) {
var b = bricks[c][r];
if(b.status == 1) {
if(x > b.x && x < b.x+brick.brickWidth && y > b.y && y < b.y+brick.brickHeight) {
speed[1] = -speed[1];
b.status = 0;
score++;
if(score == amountOfBricks) {
alert("You Win");
document.location.reload()
}
}
}
}
}
}



function draw(){
ctx.clearRect(0,0,canvas.width,canvas.height);
//drawBricks();
drawBall();
drawPaddle();
drawScore();
wall.display();
collisionDetection();
if(x + speed[0] > canvas.width-ballRadius || x + speed[0] < ballRadius) {
speed[0] = -speed[0];
}
if(y + speed[1] < ballRadius) {
speed[1] = -speed[1];
}
else if(y + speed[1] > canvas.height-ballRadius) {
if(x > paddleX && x < paddleX + paddle.paddleWidth) {
if(y= y-paddle.paddleHeight){
speed[1] = -speed[1] ;
}
}
else {
alert("GAME OVER");
document.location.reload();
}
}
if(rightPressed && paddleX<canvas.width-paddle.paddleWidth){

paddleX+=7;
}
else if(leftPressed && paddleX>0 ){
paddleX-=7;

}

x=x+speed[0];
y=y+speed[1];
}

setInterval(draw,10);

</script>
</body>
</html>

不幸的是,这会产生错误类型的砖 block ,因为它们应该是小而平的,而不是大而四四方方的。此外,当球击中砖 block 时,它不会对它们产生影响,而它应该摆脱砖 block 并增加分数。任何人都可以看到我的代码哪里出了问题,并指出需要修复哪些问题才能使游戏正常运行?

谢谢。

最佳答案

使用前声明变量。

该代码具有不声明循环变量的模式,这导致它们被创建为同名 window 对象的全局属性。如果在不同的函数中使用相同的循环变量,它们可能会相互干扰。这适用于标准循环和 for...of 循环用法。

仔细检查代码,发现有四个问题(错误),它们要么阻止发布的代码工作,要么阻止其工作:

  1. rc 在 Wall 对象的 makeBricks 方法中设置为列和行,而不是行和列:

    for(c=0; c < this.numRows; c++) {
    this.bricks[c] = [];
    for(r=0; r < this.numCols; r++) {

    应该将numRowsnumCols互换:

    for(var c=0; c < this.numCols; c++) {
    this.bricks[c] = [];
    for(var r=0; r < this.numRows; r++) {
    //...
  2. 还是在 makeBricks 函数中,调用 new Brick 的倒数第二个参数的顺序是错误的,需要按顺序排列:

    this.bricksWidth,
    this.bricksHeight,
  3. 砖 block 对象属性:brickRowCountbrickColumnCount 不属于那里,并且在构造墙时不会设置。它们在碰撞检测和砖 block 数量计算中的使用应替换为使用 Wall 对象 wallnumRowsnumCols 属性。 p>

    var wall = new Wall(5, 3 , 75, 70, 10, 30, 30);
    var amountOfBricks = wall.numRows*wall.numCols;
  4. collisionDetection 需要定义循环变量、使用 wall 中的墙壁尺寸以及使用 wall.bricks 数组。

    function collisionDetection() {
    for(var c=0; c<wall.numCols; c++) {
    for(var r=0; r<wall.numRows; r++) {
    var b = wall.bricks[c][r];
    // ...

修复这些问题,砖 block 开始呈现分配给它们的尺寸,并在被球击中时消失:D

更新:

另一个错误浮出水面,可能是阻止早期版本代码工作的原始错误。看一下brick的定义:

var brick = {
brickRowCount: 3,
brickColumnCount: 5,
brickWidth: 75,
brickHeight: 20,
brickPadding: 10,
brickOffsetTop: 30,
brickOffsetLeft: 30};

它被 Wall.display 的内部循环变量覆盖并设置为 Brick 对象:

    for(row of this.bricks) {
for(brick of row) { // updates the value of global variable brick

可以编写它来声明变量:

    for(var row of this.bricks) {
for(var brick of row) {

请注意,Brick 对象没有 brickWidthbrickHeight 属性。我的解决方案是删除 brick 变量定义,声明 brick 循环变量,并更改 brick.brickWidthbrick.brickHeight collisionDetection 中的 b.widthb.height

如此循环:声明变量以避免引入微妙的错误。

关于javascript - 打砖 block - 砖 block 没有出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43792781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com