starwars4057@YAHOO.COM Ответов: 1

Как сделать так, чтобы экран говорил "игра окончена", а не "игра окончена" в диалоговом окне?


var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
var ballRadius = 10;
var x = canvas.width/2;
var y = canvas.height-30;
var dx = 2;
var dy = -2;
var paddleHeight = 10;
var paddleWidth = 75;
var paddleX = (canvas.width-paddleWidth)/2;
var rightPressed = false;
var leftPressed = false;
var brickRowCount = 5;
var brickColumnCount = 5;
var brickWidth = 75;
var brickHeight = 20;
var brickPadding = 10;
var brickOffsetTop = 30;
var brickOffsetLeft = 30;
var score = 0;
var lives = 3;

var bricks = [];
for(c=0; c<brickColumnCount; c++) {
    bricks[c] = [];
    for(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 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 mouseMoveHandler(e) {
    var relativeX = e.clientX - canvas.offsetLeft;
    if(relativeX > 0 && relativeX < canvas.width) {
        paddleX = relativeX - paddleWidth/2;
    }
}
function collisionDetection() {
    for(c=0; c<brickColumnCount; c++) {
        for(r=0; r<brickRowCount; r++) {
            var 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 = score + 10
                    if(score == 5*5) {
                        alert("YOU WIN, CONGRATS!");
                        document.location.reload();
                    }
                }
            }
        }
    }
}

function drawBall() {
    ctx.beginPath();
    ctx.arc(x, y, ballRadius, 0, Math.PI*2);
    ctx.fillStyle = "#0095DD";
    ctx.fill();
    ctx.closePath();
}
function drawPaddle() {
    ctx.beginPath();
    ctx.rect(paddleX, canvas.height-paddleHeight, paddleWidth, paddleHeight);
    ctx.fillStyle = "#0095DD";
    ctx.fill();
    ctx.closePath();
}
function drawBricks() {
    for(c=0; c<brickColumnCount; c++) {
        for(r=0; r<brickRowCount; r++) {
            if(bricks[c][r].status == 1) {
                var brickX = (r*(brickWidth+brickPadding))+brickOffsetLeft;
                var brickY = (c*(brickHeight+brickPadding))+brickOffsetTop;
                bricks[c][r].x = brickX;
                bricks[c][r].y = brickY;
                ctx.beginPath();
                ctx.rect(brickX, brickY, brickWidth, brickHeight);
                ctx.fillStyle = "#0095DD";
                ctx.fill();
                ctx.closePath();
            }
        }
    }
}
function drawScore() {
    ctx.font = "16px Arial";
    ctx.fillStyle = "#0095DD";
    ctx.fillText("Score: "+score, 8, 20);
}
function drawLives() {
    ctx.font = "16px Arial";
    ctx.fillStyle = "#0095DD";
    ctx.fillText("Lives: "+lives, canvas.width-65, 20);
}

function draw() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    drawBricks();
    drawBall();
    drawPaddle();
    drawScore();
    drawLives();
    collisionDetection();
    
    if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) {
        dx = -dx;
    }
    if(y + dy < ballRadius) {
        dy = -dy;
    }
    else if(y + dy > canvas.height-ballRadius) {
        if(x > paddleX && x < paddleX + paddleWidth) {
            dy = -dy;
        }
        else {
            lives--;
            if(!lives) {
                alert("GAME OVER");
                document.location.reload();
            }
            else {
                x = canvas.width/2;
                y = canvas.height-30;
                dx = 3;
                dy = -3;
                paddleX = (canvas.width-paddleWidth)/2;
            }
        }
    }
    
    if(rightPressed && paddleX < canvas.width-paddleWidth) {
        paddleX += 7;
    }
    else if(leftPressed && paddleX > 0) {
        paddleX -= 7;
    }
    
    x += dx;
    y += dy;
    requestAnimationFrame(draw);
}

draw();


Что я уже пробовал:

Мастерская Gamedev Canvas-Урок 10 - JSFiddle[^]

Jochen Arndt

Пожалуйста, прекратите сбрасывать один и тот же неформатированный код в нескольких вопросах.
Публикуйте только те части кода, которые связаны с этим вопросом.

CHill60

Вы действительно пытаетесь сделать что-то из этого для себя? Вы никогда ничего не узнаете, просто разместив вопросы на этом форуме

1 Ответов

Рейтинг:
2

Jochen Arndt

Путем замены alert() вызовите, чтобы показать окно сообщения с рисунком текста на холсте.

Как это можно сделать, уже содержится в опубликованном коде в drawScore и drawLives функции (непроверенные):

ctx.font = "16px Arial";
ctx.fillStyle = "#0095DD";
ctx.fillText("Game Over!", canvas.width, 20);


starwars4057@YAHOO.COM

Спасибо, но не могли бы вы скопировать весь код, который я опубликовал, и показать мне, куда пойдет код, который вы мне только что дали. Спасибо

Jochen Arndt

Почему я должен копировать весь код?

Вы сами напросились:
- вместо того, чтобы сказать "игра окончена" в диалоговом окне?"

Разве вы не знаете, какая часть вашего кода открывает диалоговое окно?

Наконец, я уже сказал вам, куда он идет:
"Заменив вызов alert ()".

starwars4057@YAHOO.COM

Что я сделал не так https://jsfiddle.net/ttarter/ho8pgvsn/
Я заменил предупреждение, что код

Jochen Arndt

Я не знаю, что ты сделал не так.

Но это возможно потому что вы звоните

документ.расположение.перезагрузить();

который немедленно перезагружает страницу и перезаписывает экран. Вот почему окно сообщения было использовано, потому что оно ждет взаимодействия с пользователем.

Поэтому вам придется подождать некоторого взаимодействия с пользователем, прежде чем перезагрузить страницу.

Проблема в том, что вы использовали существующий пример кода и хотите изменить его сейчас, чтобы он соответствовал вашим потребностям. Но это часто невозможно или требует, по крайней мере, некоторых грязных хаков.

Однако в вашем случае у вас уже есть прослушиватели событий клавиатуры. Добавьте переменную, указывающую на то, что игра окончена, которая изначально очищается и устанавливается при отображении сообщения. В вашей клавиатуре обработчики проверяют наличие этого флага и конкретной нажатой клавиши. Если это произойдет, снимите флажок и перезагрузите страницу.