变量不会进入本地存储,也不会出现在其他页面上。 (JavaScript / HTML)

时间:2018-12-03 19:18:29

标签: javascript html html5 html5-canvas local-storage

我正在尝试通过在用户完成游戏后使用本地存储来转移得分变量来为我的游戏创建记分板。但是,由于某些原因,这是行不通的。我是编码的新手,因此我对本地存储进行了一些研究,但无法使代码正常工作。有人可以帮我这个代码谢谢。

第1页:

    <html>
    <title>Level Selector</title>
    <canvas id="myCanvas" width="750" height="400"></canvas>

    <style type="text/css">
        canvas { background: #eee; }
    </style>

    <script>
    document.addEventListener('load', draw);
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    var x = canvas.width/2;
    var y = canvas.height-30;
    var dx = 2;//Ball is moving in x direction at a constant rate
    var dy = -2;//Ball is moving in y direction at a constant rate
    var ballRadius = 10;//To see if ball is colliding with brick/canvas
    var paddleHeight = 10;
    var paddleWidth = 75;
    var paddleX = (canvas.width-paddleWidth)/2;
    var rightPressed = false;//This variable is false because the 'right arrow' key is not pressed.
    var leftPressed = false;//This variable is false because the 'left arrow' key is not pressed.
    var brickRowCount = 5;
    var brickColumnCount = 8;
    var brickWidth = 75;
    var brickHeight = 20;
    var brickPadding = 10;
    var brickOffsetTop = 30;
    var brickOffsetLeft = 30;
    var score = 0;
    var lives = 3;
    var paused = false;

    var bricks = [];//this is an array holding all the bricks
    for(var c=0; c<brickColumnCount; c++) {
    bricks[c] = [];
    for(var r=0; r<brickRowCount; r++) {
    bricks[c][r] = { x: 0, y: 0, status: 1 };//If status is '1' then draw it. However, is status is '0', fill in with background
    }
    }

    document.addEventListener("keydown", keyDownHandler, false);//Functions only when key is pressed
    document.addEventListener("keyup", keyUpHandler, false);//Functions only when key is not pressed
    document.addEventListener("mousemove", mouseMoveHandler, false);//Functions only when mouse curcor moves


    //keyCode(39) is the code for the 'right arrow' key and keyCode(37) is the code for the 'left arrow' key
    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;//This represents the hoizontal mouse movement.
    if(relativeX > 0 && relativeX < canvas.width) {
    paddleX = relativeX - paddleWidth/2;
    }
    }

    window.addEventListener('keydown', pauseGameKeyHandler, false);

    function pauseGameKeyHandler(e) {
    var keyCode = e.keyCode;
    switch(keyCode){
    case 80: //p
      togglePause();
      break;
    }

    }

    function togglePause() {
    paused = !paused;
    draw();
    }

    /*************************************************************/




    // NEW
    const ballPowerupHalfWidth = 30;
    const paddlePowerupHalfWidth = 30;

    let ballPowerups = [];
    let paddlePowerups = [];

    // This function adds powerup to random position
    function addPowerups() {
    // I check only if none exist, you could
    // add more than 1 powerup if you want
    if (ballPowerups.length < 1) {
    // otherwise half the triangle could be outside canvas
    const padding = 50;
    const xMin = 0 + padding;
    const xMax = canvas.width - padding;
    const yMin = 0 + padding;
    const yMax = canvas.height - padding;

    ballPowerups.push({
        x: Math.floor(Math.random()*(xMax-xMin+1)+xMin),
      y: Math.floor(Math.random()*(yMax-yMin+1)+yMin),
    });
    }

    // I check only if none exist, you could
    // add more than 1 powerup if you want
    if (paddlePowerups.length < 1) {
    // otherwise half the triangle could be outside canvas
    const padding = 50;
    const xMin = 0 + padding;
    const xMax = canvas.width - padding;
    const yMin = 0 + padding;
    const yMax = canvas.height - padding;

    paddlePowerups.push({
      x: Math.floor(Math.random()*(xMax-xMin+1)+xMin),
      y: Math.floor(Math.random()*(yMax-yMin+1)+yMin),
    });
    }
    }


    // NEW: do all collision detections
    function doCollisionDetection() {
    // ball powerups
    ballPowerups.forEach((powerup, i) => {
    rectangleCollisionDetection(
        {x: powerup.x, y: powerup.y}, 
      {w: ballPowerupHalfWidth, h: ballPowerupHalfWidth}, 
      () => {
        console.log('BALL POWERUP COLLISION');
        // remove powerup
        ballPowerups.splice(i, 1);
         dy = dy/2
         setTimeout(() => { dy=2 }, 5000)

        // to make effect last 10 seconds:
        // 1. add effect
        // 2. and setTimeout(() => { /* code that removes effect */ }, 10000);
    });
    });

    // paddle powerups
    paddlePowerups.forEach((powerup, i) => {
    rectangleCollisionDetection(
        {x: powerup.x, y: powerup.y}, 
      {w: ballPowerupHalfWidth, h: ballPowerupHalfWidth}, 
      () => {
        console.log('PADDLE POWERUP COLLISION');
        // remove powerup
        paddlePowerups.splice(i, 1);
        paddleHeight = paddleHeight*1.5
        paddleWidth = paddleWidth*1.5
        setTimeout(() => { paddleHeight=10; }, 10000)
    });
    });

    // bricks
    for(var c=0; c<brickColumnCount; c++) {
    for(var r=0; r<brickRowCount; r++) {
      var b = bricks[c][r];
      if(b.status == 1) {
        rectangleCollisionDetection(b, {w: brickWidth, h: brickHeight}, () => {
            console.log('BRICK COLLISION');
            dy = -dy;
          b.status = 0;
          score++;
          if(score == brickRowCount*brickColumnCount) {
            alert("YOU WIN, CONGRATULATIONS!");
            window.location = "Intro Screen.html";
          }
        });
      }
    }
}


    // NEW: collision detection between ball and rectangle shaped
    // collision boundary (only need center(x, y) and half width)
    function rectangleCollisionDetection(center, size, callback) {
    if(
    x > center.x && 
    x < center.x+size.w && 
    y > center.y && 
    y < center.y+size.h
    ) {
    callback && callback();
    }
    }



    function drawBallpowerup() {
    ballPowerups.forEach(powerup => {
    ctx.beginPath();
    ctx.moveTo(powerup.x, powerup.y);
    ctx.lineTo(powerup.x+ballPowerupHalfWidth, powerup.y+ballPowerupHalfWidth);
    ctx.lineTo(powerup.x+ballPowerupHalfWidth*2, powerup.y);
    ctx.fillStyle = "#42f445";
    ctx.fill();
    ctx.closePath();
    });
    }

    function drawPaddlepowerup() {
    paddlePowerups.forEach(powerup => {
    ctx.beginPath();
    ctx.moveTo(powerup.x, powerup.y);
    ctx.lineTo(powerup.x+paddlePowerupHalfWidth, powerup.y+paddlePowerupHalfWidth);
    ctx.lineTo(powerup.x+paddlePowerupHalfWidth*2, powerup.y);
    ctx.fillStyle = "#ce6210";
    ctx.fill();
    ctx.closePath();
    });
    }


    // my big changes end here

    /*************************************************************/

    //this is the score variable of the game
    function drawScore() {
    ctx.font = "16px Arial";
    ctx.fillStyle = "#0095DD";
    ctx.fillText("Score: "+score, 8, 20);
    }

    //this is the lives variable of the game
    function drawLives() {
    ctx.font = "16px Arial";
    ctx.fillStyle = "#0095DD";
    ctx.fillText("Lives: "+lives, canvas.width-65, 20);
    }

    //this creates the ball
    function drawBall() {
    ctx.beginPath();
    ctx.arc(x, y, ballRadius, 0, Math.PI*2);
    ctx.fillStyle = "#0095DD";
    ctx.fill();
    ctx.closePath();
    }

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

    //this creates the bricks
    function drawBricks() {
    for(var c=0; c<brickColumnCount; c++) {
    for(var r=0; r<brickRowCount; r++) {
      if(bricks[c][r].status == 1) {
        var brickX = (c*(brickWidth+brickPadding))+brickOffsetLeft;
        var brickY = (r*(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 draw() {
    // clears canvas content from previous frame
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    drawBall();//this code draws the ball onto the canvas
    drawPaddle();//this code draws the paddle onto the canvas
    drawBricks();//this code draws the bricks onto the canvas

    addPowerups();
    doCollisionDetection();

    drawScore();//this code draws the score variable onto the canvas
    drawLives();//this code draws the lives variable onto the canvas

    drawBallpowerup();
    drawPaddlepowerup();

    //Reverse Ball movement when the ball collides with wall in 'x' direction (Left/Right wall)
    if(x + dx > canvas.width-ballRadius || x + dx < ballRadius) {
    dx = -dx;
    }

    //Reverse Ball movement when the ball collides with wall in 'y' direction (Top/Bottom wall)
    if(y + dy < ballRadius) {
    dy = -dy;
    }   else if(y + dy > canvas.height-ballRadius) {
    if(x > paddleX && x < paddleX + paddleWidth) {
      dy = -dy;//If the ball collides with the paddle,  the ball is rebounded in the opposite direction.
    }
    else {
      lives--;
      if(!lives) {
        alert("GAME OVER");
        localStorage.setItem("score", score);
    }
        window.location = "Intro Screen.html";
      }
      else {
        x = canvas.width/2;
        y = canvas.height-30;
        dx = 2;
        dy = -2;
        paddleX = (canvas.width-paddleWidth)/2;
      }
    }
    }

    if(rightPressed && paddleX < canvas.width-paddleWidth) {//limits paddle movement in between the canvas width
    paddleX += 7;//Paddle shifts 7 pixels in the positive x direction
    }
    else if(leftPressed && paddleX > 0) {//limits paddle movement in between the canvas width
    paddleX -= 7;//Paddle shifts 7 pixels in the negative x direction
    }

    x += dx;//Ball is updated by painting it over each position it moves in
    y += dy;//Ball is updated by painting it over each position it moves in

    if(!paused) {
    requestAnimationFrame(draw);
    }
    }

    draw();
    </script>

    <body onload="draw();>


    </body>

</html>

第2页:

        if (typeof(Storage) !== "undefined") {
// Retrieve
document.getElementById("result").innerHTML = localStorage.getItem("score"));

}

当我运行它并在玩完游戏后,应按降序(最高到最低)将分数添加到记分板上。我无法带来变量。

1 个答案:

答案 0 :(得分:1)

虽然没有标准规范,但大多数浏览器会将 file:// 协议提供的不同页面视为差异来源

这意味着您的两个页面将被视为 different-origin ,因此将拥有它们自己的存储区域,它们将无法共享,就像您将无法访问一样来自 www.yyyyy.com www.xxxxx.com 的存储区域。

要克服此限制,最简单的方法是run a local web-server on your machine。许多操作系统都预装了这样的服务器,它所需要的只是激活它,而对于不使用它的服务器,有许多免费和简单的解决方案。

如果您打算使用Web标准,无论如何都必须有它。