#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);
}