Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.10.2022, 23:13
Новичок на форуме
Отправить личное сообщение для The Boy Посмотреть профиль Найти все сообщения от The Boy
 
Регистрация: 11.10.2022
Сообщений: 1

В canvas объект выходит за границы
Всем привет, нашел гайд по созданию игры, а там дополнительные упражнения на которых нет ответа.
В общем paddle при управлении мышкой с левого края выходит на половину за границы, с правой стороны все в порядке. Подскажите, как пофиксить проблему, пожалуйста.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Gamedev Canvas Workshop</title>
<style>
* { padding: 0; margin: 0; }
canvas { background: #eee; display: block; margin: 0 auto; }
</style>
</head>
<body>

<canvas id="myCanvas" width="480" height="320"></canvas>

<script>
let canvas = document.getElementById('myCanvas'),
ctx = canvas.getContext('2d'),
x = canvas.width/2,
y = canvas.height-30,
dx = 2,
dy = -2,
ballRadius = 10,
color = 'red',
paddleHeight = 15,
paddleWidth = 90,
paddleX = (canvas.width - paddleWidth)/2,
rightPressed = false,
leftPressed = false,
brickRowCount = 3,
brickColumnCount = 5,
brickWidth = 75,
brickHeight = 20,
brickPadding = 10,
brickOffetTop = 30,
brickOffsetLeft = 30,
score = 0;
let bricks = [];
for (let c = 0; c < brickColumnCount; c++) {
bricks[c] = [];
for (let r = 0; r < brickRowCount; r++) {
bricks[c][r] = {x: 0, y: 0, status: 1};
}
}

document,addEventListener('keydown', keyDownHandler, false);
document.addEventListener('keyup', keyUpHandler, false);
document.addEventListener('mousemove', mouseMoveHandler, false);

function mouseMoveHandler(e) {
let relativeX = e.clientX - canvas.offsetLeft;
if (relativeX > 0 && relativeX < canvas.width - paddleWidth/2) {
paddleX = relativeX - paddleWidth/2;
}
}


function keyDownHandler(e) {
if (e.keyCode == 39) {
rightPressed = true;
} else if (e.keyCode == 37) {
leftPressed = true;
}
}


function keyUpHandler(e) {
if (e.keyCode == 39) {
rightPressed = false;
} else if (e.keyCode == 37) {
leftPressed = false;
}
}

function collisionDetection() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
let b = bricks[c][r];
if (b.status == 1) {
if (x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) {
dy = -dy;
b.status = 0;
score += 5;
if (score == (brickRowCount*brickColumnCount) * 5) {
alert(`YOU WIN, CONGRATULATIONS!\nYour scores:${score}`);
document.location.reload();
}
// color = randColor();
}
}

}
}
}

function drawScore() {
ctx.font = '16px Arial';
ctx.fillStyle = 'red';
ctx.fillText('Score: ' + score, 8, 20);
}

function randColor() {
let rgb = `rgb(${Math.floor(Math.random() * 256)}, ${Math.floor(Math.random() * 256)}, ${Math.floor(Math.random() * 256)})`;
return rgb;
}


function drawBall() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI*2);
ctx.fillStyle = color;
ctx.fill();
ctx.closePath();
}

function drawPaddle() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = 'red';
ctx.fill();
ctx.strokeStyle = 'black';
ctx.stroke();
ctx.closePath();
}


function drawBricks() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
if (bricks[c][r].status == 1) {
let brickX = (c * (brickWidth + brickPadding)) + brickOffsetLeft;
let brickY = (r * (brickHeight + brickPadding)) + brickOffetTop;
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHeight);
ctx.fillStyle = 'brown';
ctx.fill();
ctx.strokeStyle = 'black';
ctx.stroke();
ctx.closePath();
}

}
}
}

function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawPaddle();
drawScore();
collisionDetection();
drawBricks();
drawBall();
x += dx;
y += dy;
if (y + dy < ballRadius) {
dy = -dy;
// color = randColor();
} else if (y + dy > canvas.height - ballRadius) {
if (x > paddleX && x < paddleX + paddleWidth) {
dy = -dy;
} else {
alert('GAME OVER');
document.location.reload();
clearInterval(interval);
}
}



if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
dx = -dx;
// color = randColor();
}


if (rightPressed && paddleX < canvas.width - paddleWidth) {
paddleX += 3;
} else if (leftPressed && paddleX > 0) {
paddleX -= 3;
}
}



let interval = setInterval(draw, 10);
</script>

</body>
</html>

Последний раз редактировалось The Boy, 11.10.2022 в 23:16.
Ответить с цитированием
  #2 (permalink)  
Старый 12.10.2022, 00:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

The Boy,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 12.10.2022, 00:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

The Boy,
Сообщение от The Boy
if (relativeX > 0 && relativeX < canvas.width - paddleWidth/2) {
if (relativeX > paddleWidth/2 && relativeX < canvas.width - paddleWidth/2)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas объект выходит за пределы поля Martyna Элементы интерфейса 9 28.09.2016 04:48
Не выходит получить объект из функции barsix Общие вопросы Javascript 3 07.08.2014 14:32
Ищу функцию для canvas, которая будет перемещать мой объект на позицию х,у eko24 Events/DOM/Window 0 12.10.2013 00:33
Функция при наведении на Canvas объект max0n Общие вопросы Javascript 0 07.05.2013 17:56
Событие JS, объект выходит из области видимости браузера Z@R@ Events/DOM/Window 1 28.01.2013 07:02