This is Part 2 of the series where I walk through the steps to create a Pong game in the web browser using JavaScript. Part 1 is here:
JavaScript: Intro to Web Game Development – Part 1: canvas element
In this step, I will create the black background for the pong game, but instead of a perfect rectangle, I am going to give the playing space rounded corners. Since I want to see a fresh copy of the game whenever I refresh my browser, I am going to define a function that launches whenever the window loads using:
window.onload = function() {}
Inside this function, I am going to do the following:
- Refer to the canvas object defined in Step 1.
- Create a canvasContext to draw on
- Define canvas_width and canvas_height variables
- Define and call a new function called roundRect which will give the canvasContext rounded corners
Step 1: Refer to the canvas object defined in the HTML
canvas = document.getElementById("gameCanvas")
Step 2: Create a canvasContext
Set the canvasContext using getContext(), with a value of “2d”:
canvasContext = canvas.getContext("2d");
The canvasContext is the drawing context of the canvas. For more info about canvas.getContext, see:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext
“2d” is the contextType. Setting this creates a CanvasRenderingContext2D object representing a 2d rendering context. For more information about CanvasRenderingContext2D, see:
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D
Step 3: Set height and width variables
Set the canvas_width and canvas_height variables with the canvas width and height:
var canvas_width = canvas.width; var canvas_height = canvas.height;
Step 4: Define and call a new function called roundRect
The function roundRect will inherit from the CanvasRenderingContext2D object, which is why this function is defined using .prototype. For example: CanvasRenderingContext2D.prototype.roundRect:
CanvasRenderingContext2D.prototype.roundRect = function(x, y, width, height, radius, fill, stroke) {
“prototype” is used for object inheritance:
http://javascriptissexy.com/javascript-prototype-in-plain-detailed-language/
The roundRect function will use a path to define a rectangle canvas shape with rounded corners. This function will take in the following variables when called:
x, y, width, height, radius, fill, stroke
- x and y locations for where the roundRect will begin
- the width and height of the rectangle to create
- the radius of the circle that defines the rounded curves
- the color of the fill
- the style of the stroke
This function works on a canvasContext, which is derived from an HTML canvas. For example, we can call the roundRect function to give the gameCanvas rounded corners with a radius of 40 and a fill color of black:
canvasContext.roundRect(0, 0, canvas_width, canvas_height, 40, "black");
The roundRect function is necessary because there are no built-in functions for making a canvas with rounded corners. What the roundRect function does is create a path using the HTML5 canvas beginPath(), closePath(), moveTo(), lineTo(), and quadraticCurveTo() methods:
beginPath() // make some connections that define a shape using // .moveTo() // .lineTo() // .quadraticCurveTo() closePath()
For more information about these canvas methods see:
https://www.w3schools.com/tags/canvas_beginpath.asp
https://www.w3schools.com/tags/canvas_closepath.asp
https://www.w3schools.com/tags/canvas_moveto.asp
https://www.w3schools.com/tags/canvas_lineto.asp
https://www.w3schools.com/tags/canvas_quadraticcurveto.asp
Here is the complete JavaScript code so far (placed in the <script> portion of the HTML document), with comments:
var canvas;
window.onload = function() {
canvas = document.getElementById("gameCanvas")
canvasContext = canvas.getContext("2d");
var canvas_width = canvas.width;
var canvas_height = canvas.height;
CanvasRenderingContext2D.prototype.roundRect = function(x, y, width, height, radius, fill, stroke) {
// If stroke argument not provided, provide a stroke by default
if (typeof stroke == "undefined" ) {
stroke = true;
}
// If no radius is defined, then give it a default of 5
if (typeof radius === "undefined") {
radius = 5;
}
// Start of shape definition
this.beginPath();
this.moveTo(x + radius, y);
// Draw the top border line
this.lineTo(x + width - radius, y);
// Draw the top right curve
this.quadraticCurveTo(x + width, y, x + width, y + radius);
// Draw the right border line
this.lineTo(x + width, y + height - radius);
// Draw the bottom right curve
this.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
// Draw the bottom border line
this.lineTo(x + radius, y + height);
// Draw the bottom left curve
this.quadraticCurveTo(x, y + height, x, y + height - radius);
// Draw the left border line
this.lineTo(x, y + radius);
// Draw the final (top left) curve
this.quadraticCurveTo(x, y, x + radius, y);
// End of shape definition
this.closePath();
// Draw the shape with a line
if (stroke) {
this.stroke();
}
// Fill in the shape with color
if (fill) {
this.fill();
}
}
// Now call the function
canvasContext.roundRect(0, 0, canvas_width, canvas_height, 40, "black");
}
Here is what the canvas looks like so far:
