HTML基本弹球游戏

时间:2017-05-15 23:02:15

标签: javascript html

我是计算机科学的新手,我现在开始制作一个基本的弹球游戏。我的让脚蹼移动的计划是通过按左箭头键将图像从向上位置中的一个更改为向下位置中的一个。

这是我的代码(代码的一部分是从以前的游戏中删除的,目前尚未使用)



var flipper = new flipperClass(0, 400, 200, 200, "paddleL.png");

// This class is for the user-controlled flipper object
function flipperClass(flipperX, flipperY, flipperWidth, flipperHeight, flipperImg) {
  // Constructor
  this.x = flipperX;
  this.y = flipperY;
  this.width = flipperWidth;
  this.height = flipperHeight;

  this.img = new Image();
  this.img.src = flipperImg;


  // Movement methods - don't let flipper move off the screen

  this.moveLeft = function() {
    if (this.x > 5) {
      this.x -= 5;
    }
  }


  // Draw method
  this.draw = function() {
    c.drawImage(this.img, this.x, this.y, this.width, this.height);
  }
}


// This class is for the ball object
function ballClass() {
  // Constructor
  this.x = 50;
  this.y = 100;
  this.width = 40;
  this.height = 40;

  // dx and dy represent the ball object's speed in
  // the x- and y-direction respectively
  this.dx = 7;
  this.dy = 7;

  this.img = new Image();
  this.img.src = "ball.png";


  // This function returns true if this ball intersects "obj", where "obj" is
  // either a bumper object or a flipper object. Returns false otherwise.
  this.intersects = function(obj) {
    if (this.x < obj.x + obj.width &&
      this.x + this.width > obj.x &&
      this.y < obj.y + obj.height &&
      this.y + this.height > obj.y) {
      return true;
    } else {
      return false;
    }
  }


  // Main update function for ball, takes care of:
  //		1. ball movement
  //		2. edge logic (bounce off of edges, die at the bottom edge)
  //		3. bounce off of flipper
  //		4. eliminate bumper that we hit
  this.update = function() {
    // Move
    this.x += this.dx;
    this.y += this.dy;


    // Bounce off of left wall
    if (this.x < 0 && this.dx < 0) {
      this.dx *= -1;
    }

    // Bounce off of right wall
    if (this.x + this.width > cWidth && this.dx > 0) {
      this.dx *= -1;
    }

    // Bounce off of top
    if (this.y < 0 && this.dy < 0) {
      this.dy *= -1;
    }

    // Bottom edge: ball dies, start new ball
    if (this.y + this.height > cHeight && this.dy > 0) {
      lives -= 1;
      if (lives == 0) {
        gameState = "gameover";
      }
      ball.x = 50;
      ball.y = 100;

      sndKick.currentTime = 0;
      sndKick.play();

    }

    // bounce off of flipper
    if (this.intersects(flipper)) {
      this.dy *= -1
      sndTop.currentTime = 0;
      sndTop.play();
    }


    // eliminate bumper that we hit
    for (i = 0; i < 16; i++) {
      if (tomatoArray[i].bVisible == true &&
        this.intersects(tomatoArray[i])) {
        score += 10;
        tomatoArray[i].bVisible = false;
        if (this.dy < 0) {
          this.dy *= -1;
        }
        sndSnare.currentTime = 0;
        sndSnare.play();

      }
    }
  }

  // Draw method
  this.draw = function() {
    c.drawImage(this.img, this.x, this.y, this.width, this.height);
  }
}



// This class is for the on-screen bumper objects
function tomatoClass(x, y) {
  // Constructor
  this.x = x;
  this.y = y;
  this.width = 40;
  this.height = 40;
  this.bVisible = true; // tomatoes start off being visible

  this.img = new Image();
  this.img.src = "hitBall.png";

  // Draw method
  this.draw = function() {
    if (this.bVisible) {
      c.drawImage(this.img, this.x, this.y, this.width, this.height);
    }
  }
}




// Canvas context; used to call Canvas methods
var c;

// Canvas width and height.
var cWidth, cHeight;

// Stores the current keyboard state
var curkeys = [];

// Stores keys that have been newly pressed since last update
var newkeys = [];



// Our global variables (flipper, ball, tomatoes)
var flipper, ball;
var tomatoArray = [];

// The current game state, can be one of: "play", "gameover"
var gameState = "instructions";
var score = 0;
var lives = 3;

var sndCymbal = new Audio('cymbal.wav');
var sndKick = new Audio('buzzer.wav');
var sndSnare = new Audio('hit.mp3');
var sndTop = new Audio('jump.mp3');

var flipperDirection = "down";





// Initializes entire game framework. This method should only be called
// once, by the body onload event handler.
function gameFrameworkInit()

{
  // Initialize key arrays
  for (i = 0; i < 256; i++) {
    curkeys[i] = false;
    newkeys[i] = false;
  }

  // Initialize global variables for canvas
  c = myCanvas.getContext('2d');
  cWidth = myCanvas.width;
  cHeight = myCanvas.height;


  // Initialize global variables for our game
  flipper = new flipperClass();
  ball = new ballClass();

  // Populate tomatoArray[] with 16 tomatoes spread out near the top of the canvas
  for (i = 0; i < 16; i++) {
    tomatoArray[i] = new tomatoClass(50 * i, 20);
  }



  // Start listeners for getting keyboard state
  window.addEventListener('keydown',
    function(e) {
      if (!curkeys[e.keyCode]) {
        curkeys[e.keyCode] = true;
        newkeys[e.keyCode] = true;
      }
    }
  );

  window.addEventListener('keyup',
    function(e) {
      curkeys[e.keyCode] = false;
    }
  );

  // Schedule the update function to be called right before the next repaint.
  // (At the end of the update function, it will schedule itself to be called
  // again before the NEXT repaint, and so on.
  window.requestAnimationFrame(gameUpdate);
}



// Main update loop for the entire game
function gameUpdate() {
  if (gameState == "play") {
    ball.update();

    flipper.update();

    if (curkeys[37] == true) {
      flipperPosition = "up";
      flipper.img.src = "ball.png";
    }

    if (curkeys[37] == false) {
      flipperPosition = "down";
      flipper.img.src = "paddleL.png";
    }




    if (curkeys[39] == true) {
      flipper.x += 5;
    }

    if (curkeys[40] == true) {
      flipper.y += 5;
    }

    if (curkeys[38] == true) {
      flipper.y -= 5;
    }


  }

  if (gameState == "gameover") {
    if (newkeys[13]) {
      location.reload();
    }

  }

  if (gameState == "instructions") {
    if (newkeys[13]) {
      gameState = "play"
    }

  }

  // Reset newkeys
  for (i = 0; i < 256; i++) {
    newkeys[i] = false;
  }

  // At the end of the update function, repaint the screen
  gameDraw();

  // Last thing the update function does is to schedule itself to be called
  // again before the next repaint
  window.requestAnimationFrame(gameUpdate);
}


// Main draw loop for the entire game
function gameDraw() {
  // Clear the canvas before we draw the current frame
  c.clearRect(0, 0, cWidth, cHeight);

  // Draw flipper/ball/bumper
  if (gameState == "play") {
    flipper.draw();
    ball.draw();
    for (i = 0; i < 16; i++) {
      tomatoArray[i].draw();
    }

    c.font = "14px Arial";
    c.fillText("Your Score is: " + score, 680, 10);
    c.fillText("Lives: " + lives, 600, 10);
  }

  if (gameState == "instructions") {
    c.font = "20px orbitron";
    c.fillText("Welcome To Virtual Pinball", 250, 300);
    c.fillText("Use The Arrow Keys to Move The Flippers", 250, 325);
    c.fillText("Move the Flippers to hit ball", 250, 350);
    c.fillText("Try to hit the ball around the playfield!", 250, 375);


  }

  if (gameState == "gameover") {
    c.font = "17px Arial";
    c.fillText("Game Over", 250, 300);
    c.fillText("Your Score is: " + score, 250, 400);
    c.fillText("Press Enter to Play Again", 250, 425)

  }

}
&#13;
<html>

<head>

  <style>
    canvas {
      background-image: url("wood.png");
    }
  </style>

</head>

<body onload="gameFrameworkInit()">

  <canvas id="myCanvas" width="800" height="600"></canvas>

</body>

</html>
&#13;
&#13;
&#13;

<html>
<head>

    <style>
        canvas{
             background-image: url("wood.png");
        }
    </style>

    <script>

        var flipper = new flipperClass(0, 400, 200, 200, "paddleup.png");

        // This class is for the user-controlled flipper object
        function flipperClass(flipperX, flipperY, flipperWidth, flipperHeight, flipperImg)
        {
            // Constructor
            this.x = flipperX;
            this.y = flipperY;
            this.width = flipperWidth;
            this.height = flipperHeight;

            this.img = new Image();
            this.img.src = flipperImg;


            // Movement methods - don't let flipper move off the screen

            this.moveLeft = function()
            {
                if (this.x > 5)
                {
                    this.x -= 5;
                }
            }


            // Draw method
            this.draw = function()
            {
                c.drawImage(this.img, this.x, this.y, this.width, this.height);
            }
        }


        // This class is for the ball object
        function ballClass()
        {
            // Constructor
            this.x = 50;
            this.y = 100;
            this.width = 40;
            this.height = 40;

            // dx and dy represent the ball object's speed in
            // the x- and y-direction respectively
            this.dx = 7;
            this.dy = 7;

            this.img = new Image();
            this.img.src = "ball.png";


            // This function returns true if this ball intersects "obj", where "obj" is
            // either a bumper object or a flipper object. Returns false otherwise.
            this.intersects = function(obj)
            {
                if (this.x < obj.x + obj.width &&
                    this.x + this.width > obj.x &&
                    this.y < obj.y + obj.height &&
                    this.y + this.height > obj.y)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }


            // Main update function for ball, takes care of:
            //      1. ball movement
            //      2. edge logic (bounce off of edges, die at the bottom edge)
            //      3. bounce off of flipper
            //      4. eliminate bumper that we hit
            this.update = function()
            {
                // Move
                this.x += this.dx;
                this.y += this.dy;


                // Bounce off of left wall
                if (this.x < 0 && this.dx < 0)
                {
                    this.dx *= -1;
                }

                // Bounce off of right wall
                if (this.x + this.width > cWidth && this.dx > 0)
                {
                    this.dx *= -1;
                }

                // Bounce off of top
                if (this.y < 0 && this.dy < 0)
                {
                    this.dy *= -1;
                }

                // Bottom edge: ball dies, start new ball
                if (this.y + this.height > cHeight && this.dy > 0)
                {
                    lives -= 1;
                    if (lives == 0)
                    {
                        gameState = "gameover";
                    }
                    ball.x = 50;
                    ball.y = 100;

                    sndKick.currentTime = 0;
                    sndKick.play();

                }

                // bounce off of flipper
                if (this.intersects(flipper))
                {
                    this.dy *= -1
                    sndTop.currentTime = 0;
                    sndTop.play();
            }


                // eliminate bumper that we hit
                for (i = 0; i < 16; i++)
                {
                    if (tomatoArray[i].bVisible == true &&
                        this.intersects(tomatoArray[i]))
                    {
                        score += 10;
                        tomatoArray[i].bVisible = false;
                        if (this.dy < 0)
                        {
                            this.dy *= -1;
                        }
                        sndSnare.currentTime = 0;
                        sndSnare.play();

                    }
                }
            }

            // Draw method
            this.draw = function()
            {
                c.drawImage(this.img, this.x, this.y, this.width, this.height);
            }
        }



        // This class is for the on-screen bumper objects
        function tomatoClass(x, y)
        {
            // Constructor
            this.x = x;
            this.y = y;
            this.width = 40;
            this.height = 40;
            this.bVisible = true;   // tomatoes start off being visible

            this.img = new Image();
            this.img.src = "hitBall.png";

            // Draw method
            this.draw = function()
            {
                if (this.bVisible)
                {
                    c.drawImage(this.img, this.x, this.y, this.width, this.height);
                }
            }
        }




        // Canvas context; used to call Canvas methods
        var c;

        // Canvas width and height.
        var cWidth, cHeight;

        // Stores the current keyboard state
        var curkeys = [];

        // Stores keys that have been newly pressed since last update
        var newkeys = [];



        // Our global variables (flipper, ball, tomatoes)
        var flipper, ball;
        var tomatoArray = [];

        // The current game state, can be one of: "play", "gameover"
        var gameState = "instructions";
        var score = 0;
        var lives = 3;

        var sndCymbal = new Audio('cymbal.wav');
        var sndKick = new Audio('buzzer.wav');
        var sndSnare = new Audio('hit.mp3');
        var sndTop = new Audio('jump.mp3');

        var flipperDirection = "down";





        // Initializes entire game framework. This method should only be called
        // once, by the body onload event handler.
        function gameFrameworkInit()

        {
            // Initialize key arrays
            for (i = 0; i < 256; i++){
                curkeys[i] = false;
                newkeys[i] = false;
            }

            // Initialize global variables for canvas
            c = myCanvas.getContext('2d');
            cWidth = myCanvas.width;
            cHeight = myCanvas.height;


            // Initialize global variables for our game
            flipper = new flipperClass();
            ball = new ballClass();

            // Populate tomatoArray[] with 16 tomatoes spread out near the top of the canvas
            for (i = 0; i < 16; i++){
                tomatoArray[i] = new tomatoClass(50*i, 20);
            }



            // Start listeners for getting keyboard state
            window.addEventListener('keydown',
                                     function(e){
                                        if (!curkeys[e.keyCode]){
                                            curkeys[e.keyCode] = true;
                                            newkeys[e.keyCode] = true;
                                        }
                                     }
                                   );

            window.addEventListener('keyup',
                                     function(e){ curkeys[e.keyCode] = false; }
                                   );

            // Schedule the update function to be called right before the next repaint.
            // (At the end of the update function, it will schedule itself to be called
            // again before the NEXT repaint, and so on.
            window.requestAnimationFrame(gameUpdate);
        }



        // Main update loop for the entire game
        function gameUpdate()
        {
            if (gameState == "play")
            {
                ball.update();

                flipper.update();

                if(curkeys[37]== true)
                {
                    flipperPosition = "up";
                    flipper.img.src = "paddleup.png";
                }

                if(curkeys[37]== false)
                {
                    flipperPosition = "down";
                    flipper.img.src = "paddledown.png";
                }




                if(curkeys[39]== true)
                {
                    flipper.x += 5;
                }

                if(curkeys[40]== true)
                {
                    flipper.y += 5;
                }

                if(curkeys[38]== true)
                {
                    flipper.y -= 5;
                }


            }

            if (gameState == "gameover")
            {
                if (newkeys[13])
                {
                    location.reload();
                }

            }

            if (gameState == "instructions")
            {
                if (newkeys[13])
                {
                    gameState = "play"
                }

            }

            // Reset newkeys
            for (i = 0; i < 256; i++)
            {
                newkeys[i] = false;
            }

            // At the end of the update function, repaint the screen
            gameDraw();

            // Last thing the update function does is to schedule itself to be called
            // again before the next repaint
            window.requestAnimationFrame(gameUpdate);
        }


        // Main draw loop for the entire game
        function gameDraw()
        {
            // Clear the canvas before we draw the current frame
            c.clearRect(0, 0, cWidth, cHeight);

            // Draw flipper/ball/bumper
            if (gameState == "play" )
            {
                flipper.draw();
                ball.draw();
                for (i = 0; i < 16; i++)
                {
                    tomatoArray[i].draw();
                }

                c.font = "14px Arial";
                c.fillText("Your Score is: " + score, 680, 10);
                c.fillText("Lives: " + lives, 600, 10);
            }

            if (gameState == "instructions")
            {
                c.font = "20px orbitron";
                c.fillText("Welcome To Virtual Pinball", 250, 300 );
                c.fillText("Use The Arrow Keys to Move The Flippers", 250, 325);
                c.fillText("Move the Flippers to hit ball", 250, 350);
                c.fillText("Try to hit the ball around the playfield!", 250, 375);


            }

            if (gameState == "gameover")
            {
                c.font = "17px Arial";
                c.fillText("Game Over", 250, 300);
                c.fillText("Your Score is: " + score, 250, 400);
                c.fillText("Press Enter to Play Again", 250, 425)

            }

        }
    </script>


</head>
<body onload="gameFrameworkInit()">

    <canvas id="myCanvas" width="800" height="600"></canvas>

</body>
</html>

2 个答案:

答案 0 :(得分:1)

这是我第一眼看到的问题:

  • 您需要声明myCanvas

    var myCanvas = document.getElementById("myCanvas");
    
  • 您需要在某个地方拨打gameFrameworkInit();,否则您的游戏将无法初始化且无法启动。

  • 您应该将<script>块移动到<body>标记下方<canvas>的末尾,或使用任何其他方法延迟JavaScript执行,直到<canvas> DOM元素可以可以从脚本中访问。

答案 1 :(得分:0)

此代码是我的同学在我们的项目中使用的代码(lol),并将其发布到了某个地方,虽然还需要进行一些调整,但非常有用。上部是一个javascript btw,您继续使用自己的html


// This class is for the user-controlled flipper object 
function flipperClass(flipperX, flipperY, flipperWidth, flipperHeight, flipperImg) { 
  // Constructor 
  this.x = flipperX; 
  this.y = flipperY; 
  this.width = flipperWidth; 
  this.height = flipperHeight; 

  this.img = new Image(); 
  this.img.src = flipperImg; 


  // Movement methods - don't let flipper move off the screen 

  this.moveLeft = function() { 
    if (this.x > 5) { 
      this.x -= 5; 
    } 
  } 


  // Draw method 
  this.draw = function() { 
    c.drawImage(this.img, this.x, this.y, this.width, this.height); 
  } 
} 


// This class is for the ball object 
function ballClass() { 
  // Constructor 
  this.x = 50; 
  this.y = 100; 
  this.width = 40; 
  this.height = 40; 

  // dx and dy represent the ball object's speed in 
  // the x- and y-direction respectively 
  this.dx = 7; 
  this.dy = 7; 

  this.img = new Image(); 
  this.img.src = "ball.png"; 


  // This function returns true if this ball intersects "obj", where "obj" is 
  // either a bumper object or a flipper object. Returns false otherwise. 
  this.intersects = function(obj) { 
    if (this.x < obj.x + obj.width && 
      this.x + this.width > obj.x && 
      this.y < obj.y + obj.height && 
      this.y + this.height > obj.y) { 
      return true; 
    } else { 
      return false; 
    } 
  } 


  // Main update function for ball, takes care of: 
  //        1. ball movement 
  //        2. edge logic (bounce off of edges, die at the bottom edge) 
  //        3. bounce off of flipper 
  //        4. eliminate bumper that we hit 
  this.update = function() { 
    // Move 
    this.x += this.dx; 
    this.y += this.dy; 


    // Bounce off of left wall 
    if (this.x < 0 && this.dx < 0) { 
      this.dx *= -1; 
    } 

    // Bounce off of right wall 
    if (this.x + this.width > cWidth && this.dx > 0) { 
      this.dx *= -1; 
    } 

    // Bounce off of top 
    if (this.y < 0 && this.dy < 0) { 
      this.dy *= -1; 
    } 

    // Bottom edge: ball dies, start new ball 
    if (this.y + this.height > cHeight && this.dy > 0) { 
      lives -= 1; 
      if (lives == 0) { 
        gameState = "gameover"; 
      } 
      ball.x = 50; 
      ball.y = 100; 

      sndKick.currentTime = 0; 
      sndKick.play(); 

    } 

    // bounce off of flipper 
    if (this.intersects(flipper)) { 
      this.dy *= -1 
      sndTop.currentTime = 0; 
      sndTop.play(); 
    } 


    // eliminate bumper that we hit 
    for (i = 0; i < 16; i++) { 
      if (tomatoArray[i].bVisible == true && 
        this.intersects(tomatoArray[i])) { 
        score += 10; 
        tomatoArray[i].bVisible = false; 
        if (this.dy < 0) { 
          this.dy *= -1; 
        } 
        sndSnare.currentTime = 0; 
        sndSnare.play(); 

      } 
    } 
  } 

  // Draw method 
  this.draw = function() { 
    c.drawImage(this.img, this.x, this.y, this.width, this.height); 
  } 
} 



// This class is for the on-screen bumper objects 
function tomatoClass(x, y) { 
  // Constructor 
  this.x = x; 
  this.y = y; 
  this.width = 40; 
  this.height = 40; 
  this.bVisible = true; // tomatoes start off being visible 

  this.img = new Image(); 
  this.img.src = "hitBall.png"; 

  // Draw method 
  this.draw = function() { 
    if (this.bVisible) { 
      c.drawImage(this.img, this.x, this.y, this.width, this.height); 
    } 
  } 
} 




// Canvas context; used to call Canvas methods 
var c; 

// Canvas width and height. 
var cWidth, cHeight; 

// Stores the current keyboard state 
var curkeys = []; 

// Stores keys that have been newly pressed since last update 
var newkeys = []; 



// Our global variables (flipper, ball, tomatoes) 
var flipper, ball; 
var tomatoArray = []; 

// The current game state, can be one of: "play", "gameover" 
var gameState = "instructions"; 
var score = 0; 
var lives = 3; 

var sndCymbal = new Audio('cymbal.wav'); 
var sndKick = new Audio('buzzer.wav'); 
var sndSnare = new Audio('hit.mp3'); 
var sndTop = new Audio('jump.mp3'); 

var flipperDirection = "down"; 





// Initializes entire game framework. This method should only be called 
// once, by the body onload event handler. 
function gameFrameworkInit() 

{ 
  // Initialize key arrays 
  for (i = 0; i < 256; i++) { 
    curkeys[i] = false; 
    newkeys[i] = false; 
  } 

  // Initialize global variables for canvas 
  c = myCanvas.getContext('2d'); 
  cWidth = myCanvas.width; 
  cHeight = myCanvas.height; 


  // Initialize global variables for our game 
  flipper = new flipperClass(); 
  ball = new ballClass(); 

  // Populate tomatoArray[] with 16 tomatoes spread out near the top of the canvas 
  for (i = 0; i < 16; i++) { 
    tomatoArray[i] = new tomatoClass(50 * i, 20); 
  } 



  // Start listeners for getting keyboard state 
  window.addEventListener('keydown', 
    function(e) { 
      if (!curkeys[e.keyCode]) { 
        curkeys[e.keyCode] = true; 
        newkeys[e.keyCode] = true; 
      } 
    } 
  ); 

  window.addEventListener('keyup', 
    function(e) { 
      curkeys[e.keyCode] = false; 
    } 
  ); 

  // Schedule the update function to be called right before the next repaint. 
  // (At the end of the update function, it will schedule itself to be called 
  // again before the NEXT repaint, and so on. 
  window.requestAnimationFrame(gameUpdate); 
} 



// Main update loop for the entire game 
function gameUpdate() { 
  if (gameState == "play") { 
    ball.update(); 

    flipper.update(); 

    if (curkeys[37] == true) { 
      flipperPosition = "up"; 
      flipper.img.src = "ball.png"; 
    } 

    if (curkeys[37] == false) { 
      flipperPosition = "down"; 
      flipper.img.src = "paddleL.png"; 
    } 




    if (curkeys[39] == true) { 
      flipper.x += 5; 
    } 

    if (curkeys[40] == true) { 
      flipper.y += 5; 
    } 

    if (curkeys[38] == true) { 
      flipper.y -= 5; 
    } 


  } 

  if (gameState == "gameover") { 
    if (newkeys[13]) { 
      location.reload(); 
    } 

  } 

  if (gameState == "instructions") { 
    if (newkeys[13]) { 
      gameState = "play" 
    } 

  } 

  // Reset newkeys 
  for (i = 0; i < 256; i++) { 
    newkeys[i] = false; 
  } 

  // At the end of the update function, repaint the screen 
  gameDraw(); 

  // Last thing the update function does is to schedule itself to be called 
  // again before the next repaint 
  window.requestAnimationFrame(gameUpdate); 
} 


// Main draw loop for the entire game 
function gameDraw() { 
  // Clear the canvas before we draw the current frame 
  c.clearRect(0, 0, cWidth, cHeight); 

  // Draw flipper/ball/bumper 
  if (gameState == "play") { 
    flipper.draw(); 
    ball.draw(); 
    for (i = 0; i < 16; i++) { 
      tomatoArray[i].draw(); 
    } 

    c.font = "14px Arial"; 
    c.fillText("Your Score is: " + score, 680, 10); 
    c.fillText("Lives: " + lives, 600, 10); 
  } 

  if (gameState == "instructions") { 
    c.font = "20px orbitron"; 
    c.fillText("Welcome To Virtual Pinball", 250, 300); 
    c.fillText("Use The Arrow Keys to Move The Flippers", 250, 325); 
    c.fillText("Move the Flippers to hit ball", 250, 350); 
    c.fillText("Try to hit the ball around the playfield!", 250, 375); 


  } 

  if (gameState == "gameover") { 
    c.font = "17px Arial"; 
    c.fillText("Game Over", 250, 300); 
    c.fillText("Your Score is: " + score, 250, 400); 
    c.fillText("Press Enter to Play Again", 250, 425) 

  } 

}
<html> 

<head> 

  <style> 
    canvas { 
      background-image: url("wood.png"); 
    } 
  </style> 

</head> 

<body onload="gameFrameworkInit()"> 

  <canvas id="myCanvas" width="800" height="600"></canvas> 

</body> 

</html>