Неперехваченная ошибка типа: не удается прочитать свойство ‘show’ неопределенного

#javascript #html #canvas #html5-canvas

#javascript #HTML #холст #html5-canvas

Вопрос:

Я создаю простую игру для взлома кирпичей, используя Java Script, и моя консоль показывает мне ошибку при отображении блоков на холсте, они рисуются на холсте, но все остальные объекты не работают, и консоль показывает

index.js: 173 Неперехваченная ошибка типа: не удается прочитать свойство ‘show’ неопределенного значения при обновлении (index.js: 173) в index.js: 177

если вы закомментируете строки №: 172 и 173, которые являются циклом for, который сообщает canvas нарисовать их на нем, все работает нормально.

еще одна вещь: это canvasRendering …rundedRectangle — это функция, которая рисует прямоугольники с закругленными краями. кто-нибудь, пожалуйста, найдите решение!

 CanvasRenderingContext2D.prototype.roundedRectangle = function(x, y, width, height, rounded) {
    const radiansInCircle = 2 * Math.PI
    const halfRadians = (2 * Math.PI)/2
    const quarterRadians = (2 * Math.PI)/4  
    
    // top left arc
    this.arc(rounded   x, rounded   y, rounded, -quarterRadians, halfRadians, true)
    
    // line from top left to bottom left
    this.lineTo(x, y   height - rounded)
  
    // bottom left arc  
    this.arc(rounded   x, height - rounded   y, rounded, halfRadians, quarterRadians, true)  
    
    // line from bottom left to bottom right
    this.lineTo(x   width - rounded, y   height)
  
    // bottom right arc
    this.arc(x   width - rounded, y   height - rounded, rounded, quarterRadians, 0, true)  
    
    // line from bottom right to top right
    this.lineTo(x   width, y   rounded)  
  
    // top right arc
    this.arc(x   width - rounded, y   rounded, rounded, 0, -quarterRadians, true)  
    
    // line from top right to top left
    this.lineTo(x   rounded, y)  
}

var canvas= document.getElementById("gameCanvas");
var ctx = canvas.getContext("2d");

function Player(x,y,w,h){
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.show = function(){
        ctx.beginPath();
        ctx.rect(this.x, this.y, this.w, this.h);
        ctx.fillStyle = "#ffff";
        ctx.fill();
        ctx.closePath();
    }
    this.move = function(speed){
        this.x  = speed;
    }
}

function Ball(x,y,r){
    this.x = x;
    this.y = y;
    this.r = r;
    this.show = function(){
        ctx.beginPath();
        ctx.arc(this.x,this.y,this.r,0,2* Math.PI);
        ctx.fillStyle = "tomato";
        ctx.fill();
        ctx.closePath();
    }
    this.move= function(speedX,speedY){
        this.show();
        this.speed = 2;
        this.x  = speedX;
        this.y  = speedY;
    }

}

function Block(x,y,w,h){
    this.x = x;
    this.y = y;
    this.w = w;
    this.h = h;
    this.show= function(color){
        ctx.beginPath();
        ctx.roundedRectangle(this.x,this.y,this.w,this.h,7);
        ctx.fillStyle = color;
        ctx.fill();
        ctx.closePath();
    };
};

var player = new Player(canvas.width/2-50,canvas.height*0.95,100,20);
var ball = new Ball(canvas.width/2-5, player.y-20,15);
var rigthPressed = false;
var leftPressed = false;

var blocks = [];
var rowCount = 5;
var columnCount = 6;
var noInRow = 6;
var blockCount = (rowCount*columnCount) 1;
var blockRow = 0;
var blockCol = 0;

var ballSpeedX = 5;
var ballSpeedY = -10;
for(let i = 1; i < blockCount; i  ){
    blocks.push(new Block(blockCol*60 25,blockRow*60 30,50,50)); 
    blockCol  ;
    if(i % noInRow == 0){
        blockRow  ;
        blockCol = 0;
    }
}


window.addEventListener("keydown", function(e){
    if(e.keyCode == 39){
        rigthPressed = true;
    }
    if(e.keyCode == 37){
        leftPressed = true;
    }
});
window.addEventListener("keyup", function(e){
    if(e.keyCode == 39){
        rigthPressed = false;
    }
    if(e.keyCode == 37){
        leftPressed = false;
    }
});

function objMovement(){
    if(rigthPressed){
        player.move(5);
        if (player.x > canvas.width-player.w){
            player.x = canvas.width-player.w;
        }
    }
    if(leftPressed){
        player.move(-5);
        if(player.x < 0){
            player.x = 0;
        }
    }

    if(ball.x > canvas.width-ball.r || ball.x < 0 ball.r){
        ballSpeedX = -ballSpeedX;
    }
    if (ball.y > canvas.height-ball.r || ball.y < 0 ball.r){
        ballSpeedY = -ballSpeedY;
    }
    if(ball.x<player.x player.w amp;amp;ball.x>player.x amp;amp; ball.y>player.y){
        ballSpeedY = -ballSpeedY;
        ballSpeedX= ballSpeedX;
    }
    function Bump(){
        if (ball.x>player.x amp;amp; ball.x<player.x player.w/2){
            if (ball.y >= player.y){
                ballSpeedX = -5;
            }
        }
        if(ball.x>player.x player.w/2 amp;amp; ball.x<player.x player.w){
            if(ball.y >= player.y){
                ballSpeedX = 5;
            }
        }
    }   
    //Bump();
}

function update(){
    ctx.clearRect(0,0,canvas.width,canvas.height);
    ball.show();
    ball.move(ballSpeedX,ballSpeedY);
    player.show();
    objMovement();
    for(let i=0;i<blockCount;i  ){
        blocks[i].show("violet");    
    }
    window.requestAnimationFrame(update);
}
update(); 
 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>🌝🩲🩲🌝</title>
    <style>
        #body{
            background-color: rgb(31, 30, 30);
        }
        #gameCanvas{
            border: 15px solid rgb(44, 44, 44);
            border-radius: 20px;
            background-color:rgb(19, 18, 18);
            margin: 250px;
        }
    </style>
</head>
<body id="body">
    <canvas id="gameCanvas" width=400 height=800></canvas>
    <script type="text/javascript" src="./index.js"></script>
    
</body>
</html> 

Ответ №1:

При создании blocks вы начинаете с 1

 for (let i = 1; i < blockCount; i  ) {
    blocks.push(new Block(blockCol * 60   25, blockRow * 60   30, 50, 50));
    ...
 

поэтому при обновлении вам необходимо учитывать, что

 function update() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ball.show();
    ball.move(ballSpeedX, ballSpeedY);
    player.show();
    objMovement();
    for (let i = 0; i < blockCount -1; i  ) { // or for (let i = 0; i < blocks.length; i  ) {
        blocks[i].show("violet");
    }
    window.requestAnimationFrame(update);
}