{"id":806,"date":"2025-04-12T19:43:57","date_gmt":"2025-04-12T22:43:57","guid":{"rendered":"https:\/\/urutaudev.com.br\/?p=806"},"modified":"2025-04-12T21:21:57","modified_gmt":"2025-04-13T00:21:57","slug":"matrix-invaders-em-javascript","status":"publish","type":"post","link":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/","title":{"rendered":"Matrix invaders em Javascript"},"content":{"rendered":"<h1><\/h1>\n<figure id=\"attachment_810\" aria-describedby=\"caption-attachment-810\" style=\"width: 417px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-810 \" title=\"Como fazer Arkanoid Game em Javascript\" src=\"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197-300x195.png\" alt=\"matrix-invaders\" width=\"417\" height=\"271\" srcset=\"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197-300x195.png 300w, https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197-768x500.png 768w, https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png 868w\" sizes=\"auto, (max-width: 417px) 100vw, 417px\" \/><figcaption id=\"caption-attachment-810\" class=\"wp-caption-text\">matrix-invaders<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-family: arial, helvetica, sans-serif;\">Introdu\u00e7\u00e3o<\/span><\/h2>\n<div><span style=\"font-family: arial, helvetica, sans-serif; font-size: 14pt;\">Embarque nesta jornada de desenvolvimento de jogos web! Neste post vamos recriar o cl\u00e1ssico &#8220;Space Invaders&#8221; utilizando apenas Javascript , html e Css. No post mostrarei como dar vida a gr\u00e1ficos, implementar os controles e construir a l\u00f3gica do jogo que roda diretamente no seu navegador. Prepare-se para transformar c\u00f3digo em divers\u00e3o interativa!<\/span><\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\">Primeiro passo voc\u00ea dever\u00e1 criar a estrutura da p\u00e1gina, para isso crie um arquivo html contendo\u00a0 o c\u00f3digo conforme mostrado abaixo:<\/span><\/strong><\/span><\/p>\n<p>&nbsp;<\/p>\n<div>\n<div>\n<div>\n<div><code>&lt;!DOCTYPE html&gt;<\/code><\/div>\n<div><code>&lt;html&gt;<\/code><\/div>\n<div><code>&lt;head&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;title&gt;Space Invaders - Matrix Style&lt;\/title&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;link rel=\"stylesheet\" href=\"style.css\"&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;style&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;\/style&gt;<\/code><\/div>\n<div><code>&lt;\/head&gt;<\/code><\/div>\n<div><code>&lt;body&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;div id=\"matrixRainContainer\"&gt;&lt;\/div&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;h1 class=\"title\"&gt;Matr1x 1nvaders&lt;\/h1&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;canvas id=\"gameCanvas\"&gt;&lt;\/canvas&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;div id=\"overlay\"&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;div id=\"message\"&gt;&lt;\/div&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;div id=\"highScores\"&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;h2&gt;Top Players&lt;\/h2&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;ul id=\"highScoreList\"&gt;&lt;\/ul&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;button id=\"playAgainButton\"&gt;Play Again&lt;\/button&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;\/div&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;button id=\"restartButton\"&gt;Back to the Game&lt;\/button&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;\/div&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;audio id=\"shootSound\" src=\"sounds\/bounce.wav\"&gt;&lt;\/audio&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;audio id=\"explosionSound\" src=\"sounds\/brick.wav\"&gt;&lt;\/audio&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;audio id=\"winSound\" src=\"sounds\/levelup.wav\"&gt;&lt;\/audio&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;audio id=\"loseSound\" src=\"sounds\/gameover.wav\"&gt;&lt;\/audio&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;audio id=\"levelUpSound\" src=\"sounds\/levelup.wav\"&gt;&lt;\/audio&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;audio id=\"backgroundSound\" src=\"sounds\/background.mp3\"&gt;&lt;\/audio&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;script src=\"matrix-effect.js\"&gt;&lt;\/script&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;script src=\"game.js\"&gt;&lt;\/script&gt;<\/code><\/div>\n<div><code>&lt;\/body&gt;<\/code><\/div>\n<div><code>&lt;\/html&gt;<\/code><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\">Depois adiciono o css respons\u00e1vel pela estiliza\u00e7\u00e3o da p\u00e1gina :<\/span><\/strong><\/span><\/p>\n<div>\n<div><code>* {<\/code><\/div>\n<div><code>\u00a0 box-sizing: border-box;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>:root {<\/code><\/div>\n<div><code>\u00a0 --matrix-green: #00ff00;<\/code><\/div>\n<div><code>\u00a0 --matrix-black: #000000;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>body {<\/code><\/div>\n<div><code>\u00a0 font-family: monospace;<\/code><\/div>\n<div><code>\u00a0 background-color: var(--matrix-black);<\/code><\/div>\n<div><code>\u00a0 background-image: url(\"matrix-digital-rain.png\");<\/code><\/div>\n<div><code>\u00a0 background-size: cover;<\/code><\/div>\n<div><code>\u00a0 background-repeat: repeat;<\/code><\/div>\n<div><code>\u00a0 margin: 0;<\/code><\/div>\n<div><code>\u00a0 overflow: hidden;<\/code><\/div>\n<div><code>\u00a0 display: flex;<\/code><\/div>\n<div><code>\u00a0 flex-direction: column;<\/code><\/div>\n<div><code>\u00a0 justify-content: center;<\/code><\/div>\n<div><code>\u00a0 align-items: center;<\/code><\/div>\n<div><code>\u00a0 min-height: 100vh;<\/code><\/div>\n<div><code>\u00a0 position: relative;<\/code><\/div>\n<div><code>\u00a0 overflow: hidden;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>#matrixRainContainer {<\/code><\/div>\n<div><code>\u00a0 position: fixed;<\/code><\/div>\n<div><code>\u00a0 top: 0;<\/code><\/div>\n<div><code>\u00a0 left: 0;<\/code><\/div>\n<div><code>\u00a0 width: 100%;<\/code><\/div>\n<div><code>\u00a0 height: 100%;<\/code><\/div>\n<div><code>\u00a0 pointer-events: none;<\/code><\/div>\n<div><code>\u00a0 z-index: -1;<\/code><\/div>\n<div><code>\u00a0 color: var(--matrix-green);<\/code><\/div>\n<div><code>\u00a0 font-family: monospace;<\/code><\/div>\n<div><code>\u00a0 font-size: 1rem;<\/code><\/div>\n<div><code>\u00a0 line-height: 1.2;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>.matrixChar {<\/code><\/div>\n<div><code>\u00a0 position: absolute;<\/code><\/div>\n<div><code>\u00a0 opacity: 0;<\/code><\/div>\n<div><code>\u00a0 animation: matrixRain 1s linear infinite;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>@keyframes matrixRain {<\/code><\/div>\n<div><code>\u00a0 to {<\/code><\/div>\n<div><code>\u00a0 \u00a0 transform: translateY(100vh);<\/code><\/div>\n<div><code>\u00a0 \u00a0 opacity: 1;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>.title {<\/code><\/div>\n<div><code>\u00a0 color: var(--matrix-green);<\/code><\/div>\n<div><code>\u00a0 font-size: 2.5rem;<\/code><\/div>\n<div><code>\u00a0 padding: 1rem;<\/code><\/div>\n<div><code>\u00a0 text-align: center;<\/code><\/div>\n<div><code>\u00a0 margin-bottom: 1rem;<\/code><\/div>\n<div><code>\u00a0 background-color: rgba(0, 0, 0, 0.5);<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>#gameCanvas {<\/code><\/div>\n<div><code>\u00a0 background-color: transparent;<\/code><\/div>\n<div><code>\u00a0 border: 1px solid var(--matrix-green);<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>#overlay {<\/code><\/div>\n<div><code>\u00a0 position: absolute;<\/code><\/div>\n<div><code>\u00a0 top: 0;<\/code><\/div>\n<div><code>\u00a0 left: 0;<\/code><\/div>\n<div><code>\u00a0 width: 100%;<\/code><\/div>\n<div><code>\u00a0 height: 100%;<\/code><\/div>\n<div><code>\u00a0 display: none;<\/code><\/div>\n<div><code>\u00a0 flex-direction: column;<\/code><\/div>\n<div><code>\u00a0 justify-content: center;<\/code><\/div>\n<div><code>\u00a0 align-items: center;<\/code><\/div>\n<div><code>\u00a0 background-color: rgba(0, 0, 0, 0.8);<\/code><\/div>\n<div><code>\u00a0 color: var(--matrix-green);<\/code><\/div>\n<div><code>\u00a0 font-size: 1.2rem;<\/code><\/div>\n<div><code>\u00a0 text-align: center;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>#overlay button {<\/code><\/div>\n<div><code>\u00a0 background-color: #000;<\/code><\/div>\n<div><code>\u00a0 color: var(--matrix-green);<\/code><\/div>\n<div><code>\u00a0 border: 1px solid var(--matrix-green);<\/code><\/div>\n<div><code>\u00a0 padding: 1rem;<\/code><\/div>\n<div><code>\u00a0 font-family: monospace;<\/code><\/div>\n<div><code>\u00a0 font-size: 1rem;<\/code><\/div>\n<div><code>\u00a0 cursor: pointer;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>#highScores {<\/code><\/div>\n<div><code>\u00a0 display: flex;<\/code><\/div>\n<div><code>\u00a0 flex-direction: column;<\/code><\/div>\n<div><code>\u00a0 justify-content: center;<\/code><\/div>\n<div><code>\u00a0 align-items: center;<\/code><\/div>\n<div><code>\u00a0 margin-top: 1rem;<\/code><\/div>\n<div><code>\u00a0 font-size: 1rem;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>#highScores li {<\/code><\/div>\n<div><code>\u00a0 margin-bottom: 0.2rem;<\/code><\/div>\n<div><code>}<\/code><\/div>\n<\/div>\n<div><\/div>\n<div><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\">Em seguida adiciona o script respons\u00e1vel pelo efeito matrix do background:<\/span><\/strong><\/span><\/div>\n<div><\/div>\n<div><\/div>\n<div>\n<div>\n<div><code>class MatrixRain {<\/code><\/div>\n<div><code>\u00a0 constructor(containerId, chars, numChars) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.container = document.getElementById(containerId);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.chars = chars;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.numChars = numChars;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 create() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 for (let i = 0; i &lt; this.numChars; i++) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 const charSpan = document.createElement(\"span\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 charSpan.className = \"matrixChar\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 charSpan.textContent = this.chars.charAt(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 Math.floor(Math.random() * this.chars.length)<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 charSpan.style.left = `${Math.random() * 100}vw`;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 charSpan.style.top = `${Math.random() * 100}vh - 100vh`;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 charSpan.style.animationDelay = `${Math.random() * 2}s`;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 charSpan.style.fontSize = `${0.8 + Math.random() * 0.6}rem`;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.container.appendChild(charSpan);<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>const matrixRain = new MatrixRain(<\/code><\/div>\n<div><code>\u00a0 \"matrixRainContainer\",<\/code><\/div>\n<div><code>\u00a0 \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",<\/code><\/div>\n<div><code>\u00a0 300<\/code><\/div>\n<div><code>);<\/code><\/div>\n<div><code>matrixRain.create();<\/code><\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div><\/div>\n<p><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\">Por ultimo adiciono o script respons\u00e1vel por adicionar a l\u00f3gica do <a href=\"https:\/\/urutaudev.com.br\/games\/\">jogo<\/a>:<\/span><\/strong><\/span><\/p>\n<p>&nbsp;<\/p>\n<div><\/div>\n<div>\n<div><code>class GameObject {<\/code><\/div>\n<div><code>\u00a0 constructor(x, y, width, height, color) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.x = x;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.y = y;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.width = width;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.height = height;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.color = color;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 draw(ctx) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 ctx.fillStyle = this.color;<\/code><\/div>\n<div><code>\u00a0 \u00a0 ctx.fillRect(this.x, this.y, this.width, this.height);<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>class MatrixTextObject extends GameObject {<\/code><\/div>\n<div><code>\u00a0 constructor(x, y, width, height, color, chars, fontStyle) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 super(x, y, width, height, color);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.chars = chars;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.fontStyle = fontStyle;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 draw(ctx) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 const charWidth = this.width \/ this.chars.length;<\/code><\/div>\n<div><code>\u00a0 \u00a0 const charHeight = this.height;<\/code><\/div>\n<div><code>\u00a0 \u00a0 ctx.font = `${charHeight}px ${this.fontStyle}`;<\/code><\/div>\n<div><code>\u00a0 \u00a0 ctx.textAlign = \"center\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.chars.forEach((char, index) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 ctx.fillStyle = this.color;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 ctx.fillText(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 char,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.x + (index + 0.5) * charWidth,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.y + charHeight * 0.8<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>class Player extends MatrixTextObject {<\/code><\/div>\n<div><code>\u00a0 constructor(<\/code><\/div>\n<div><code>\u00a0 \u00a0 x,<\/code><\/div>\n<div><code>\u00a0 \u00a0 y,<\/code><\/div>\n<div><code>\u00a0 \u00a0 width,<\/code><\/div>\n<div><code>\u00a0 \u00a0 height,<\/code><\/div>\n<div><code>\u00a0 \u00a0 color,<\/code><\/div>\n<div><code>\u00a0 \u00a0 chars,<\/code><\/div>\n<div><code>\u00a0 \u00a0 fontStyle,<\/code><\/div>\n<div><code>\u00a0 \u00a0 speed,<\/code><\/div>\n<div><code>\u00a0 \u00a0 canvasWidth<\/code><\/div>\n<div><code>\u00a0 ) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 super(x, y, width, height, color, chars, fontStyle);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.speed = speed;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.canvasWidth = canvasWidth;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 moveLeft() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.x &gt; 0) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.x -= this.speed;<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 moveRight() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.x &lt; this.canvasWidth - this.width) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.x += this.speed;<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>class Bullet extends MatrixTextObject {<\/code><\/div>\n<div><code>\u00a0 constructor(x, y, width, height, color, char, fontStyle, speed) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 super(x, y, width, height, color, [char], fontStyle);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.speed = speed;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 update() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.y -= this.speed;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>class Alien extends MatrixTextObject {<\/code><\/div>\n<div><code>\u00a0 constructor(x, y, width, height, color, chars, fontStyle, speedX) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 super(x, y, width, height, color, chars, fontStyle);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.speedX = speedX;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.alive = true;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 move(direction, speedY) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.x += this.speedX * direction;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.y += speedY;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>class Game {<\/code><\/div>\n<div><code>\u00a0 constructor(config) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.canvas = document.getElementById(\"gameCanvas\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx = this.canvas.getContext(\"2d\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.overlay = document.getElementById(\"overlay\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.messageDisplay = document.getElementById(\"message\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.restartButton = document.getElementById(\"restartButton\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.playAgainButton = document.getElementById(\"playAgainButton\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScoresDiv = document.getElementById(\"highScores\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScoreList = document.getElementById(\"highScoreList\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.shootSound = document.getElementById(\"shootSound\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.explosionSound = document.getElementById(\"explosionSound\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.winSound = document.getElementById(\"winSound\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.loseSound = document.getElementById(\"loseSound\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.levelUpSound = document.getElementById(\"levelUpSound\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.backgroundSound = document.getElementById(\"backgroundSound\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.config = { ...config }; \/\/ Create a copy to avoid direct modification<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.canvas.width = this.config.canvasWidth;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.canvas.height = this.config.canvasHeight;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.alienDirection = 1;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.score = 0;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.gameActive = true;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.level = 1;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.player = this.createPlayer();<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets = [];<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.aliens = [];<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScores = this.loadHighScores();<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.keys = {};<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.shootSound.volume = 0.3;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.explosionSound.volume = 0.2;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.winSound.volume = 0.3;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.loseSound.volume = 0.3;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.levelUpSound.volume = 0.3;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.backgroundSound.volume = 0.3;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.backgroundSound.play();<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.setupEventListeners();<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.resetLevel();<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.update();<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 createPlayer() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 return new Player(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.canvasWidth \/ 2 - 20,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.canvasHeight - 30,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 40,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 20,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.matrixColor,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.playerChars,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.fontStyle,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.playerSpeed,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.canvasWidth<\/code><\/div>\n<div><code>\u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 createAlien(x, y) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 return new Alien(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 x,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 y,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 30,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 20,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.matrixColor,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.alienChars,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.fontStyle,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.alienSpeedX<\/code><\/div>\n<div><code>\u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 createAliens() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.aliens.length = 0;<\/code><\/div>\n<div><code>\u00a0 \u00a0 const rows =<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.initialAlienRows + Math.floor((this.level - 1) * 0.5);<\/code><\/div>\n<div><code>\u00a0 \u00a0 const cols = this.config.aliensPerRow + Math.floor((this.level - 1) * 0.2);<\/code><\/div>\n<div><code>\u00a0 \u00a0 for (let row = 0; row &lt; rows; row++) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 for (let col = 0; col &lt; cols; col++) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.aliens.push(this.createAlien(30 + col * 50, 30 + row * 40));<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.alienDirection = 1;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 resetLevel() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets = [];<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.createAliens();<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 loadHighScores() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 const scoresString = localStorage.getItem(this.config.highScoreStorageKey);<\/code><\/div>\n<div><code>\u00a0 \u00a0 return scoresString ? JSON.parse(scoresString) : [];<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 saveHighScores() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScores.sort((a, b) =&gt; b - a);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScores = this.highScores.slice(0, this.config.maxHighScores);<\/code><\/div>\n<div><code>\u00a0 \u00a0 localStorage.setItem(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.config.highScoreStorageKey,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 JSON.stringify(this.highScores)<\/code><\/div>\n<div><code>\u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 getTopFiveHighScores() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 return this.highScores.slice(0, 5);<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 displayHighScores() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScoreList.innerHTML = \"\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 const topFiveScores = this.getTopFiveHighScores();<\/code><\/div>\n<div><code>\u00a0 \u00a0 topFiveScores.forEach((score, index) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 const listItem = document.createElement(\"li\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 listItem.textContent = `${index + 1}. ${score}`;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.highScoreList.appendChild(listItem);<\/code><\/div>\n<div><code>\u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.messageDisplay.style.display = \"none\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScoresDiv.style.display = \"flex\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.restartButton.style.display = \"none\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.playAgainButton.style.display = \"block\";<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 getRank() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 for (const threshold in this.config.rankThresholds) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 if (this.score &lt; parseInt(threshold)) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 return this.config.rankThresholds[<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 threshold === \"Infinity\"<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ? Object.keys(this.config.rankThresholds)[<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Object.keys(this.config.rankThresholds).length - 2<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 : threshold<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 ];<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 return this.config.rankThresholds.Infinity;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 createBullet() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.gameActive) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.bullets.push(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 new Bullet(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.player.x + this.player.width \/ 2 - 5,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.player.y - 10,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 10,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 15,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.config.matrixColor,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.config.bulletChar,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.config.fontStyle,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.config.bulletSpeed<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 )<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.playSound(this.shootSound);<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 showMessage(message, sound) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.gameActive = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.messageDisplay.textContent = message;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.messageDisplay.style.display = \"block\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.highScoresDiv.style.display = \"none\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.restartButton.style.display = \"block\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.playAgainButton.style.display = \"none\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.overlay.style.display = \"flex\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (sound) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.playSound(sound);<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 nextLevel() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.level++;<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.level &gt; this.config.maxLevels) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.gameActive = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.highScores.push(this.score);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.saveHighScores();<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.messageDisplay.textContent = this.config.gameWonMessage;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.displayHighScores();<\/code><\/div>\n<div><code>\u00a0 \u00a0 } else {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.showMessage(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 `${this.config.levelText} ${this.level}`,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.levelUpSound<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 setTimeout(() =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.overlay.style.display = \"none\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.gameActive = true;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.resetLevel();<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 }, 2000);<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 resetGame() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.score = 0;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.level = 1;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.resetLevel();<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.gameActive = true;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.overlay.style.display = \"none\";<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 playSound(audio) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (audio) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 audio.currentTime = 0;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 audio.play();<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 setupEventListeners() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 document.addEventListener(\"keydown\", (e) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.keys[e.key] = true;<\/code><\/div>\n<div><code>\u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 document.addEventListener(\"keyup\", (e) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.keys[e.key] = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.restartButton.addEventListener(\"click\", () =&gt; this.resetGame());<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.playAgainButton.addEventListener(\"click\", () =&gt; this.resetGame());<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.restartButton.textContent = this.config.restartButtonText;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.playAgainButton.textContent = this.config.playAgainButtonText;<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 update() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (!this.gameActive) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 requestAnimationFrame(() =&gt; this.update());<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 return;<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \/\/ Player Movement<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.keys[\"ArrowLeft\"]) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.player.moveLeft();<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.keys[\"ArrowRight\"]) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.player.moveRight();<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.keys[\" \"] || this.keys[\"Spacebar\"]) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.createBullet();<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.keys[\" \"] = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.keys[\"Spacebar\"] = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \/\/ Bullets Movement and Removal<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets.forEach((bullet) =&gt; bullet.update());<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets = this.bullets.filter((bullet) =&gt; bullet.y &gt; 0);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \/\/ Aliens Movement<\/code><\/div>\n<div><code>\u00a0 \u00a0 let moveDown = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.aliens.forEach((alien) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 if (alien.alive) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 alien.move(this.alienDirection * this.level, 0);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 if (alien.x + alien.width &gt; this.config.canvasWidth || alien.x &lt; 0) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.alienDirection *= -1;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 moveDown = true;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (moveDown) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.aliens.forEach((alien) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 if (alien.alive) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 alien.move(0, this.config.alienSpeedY);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \/\/ Collision Detection<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets.forEach((bullet) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.aliens.forEach((alien) =&gt; {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 if (<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 alien.alive &amp;&amp;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 bullet.x &lt; alien.x + alien.width &amp;&amp;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 bullet.x + bullet.width &gt; alien.x &amp;&amp;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 bullet.y &lt; alien.y + alien.height &amp;&amp;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 bullet.y + bullet.height &gt; alien.y<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 ) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 alien.alive = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 bullet.y = -bullet.height;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.score += 10 * this.level;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 this.playSound(this.explosionSound);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 });<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.aliens = this.aliens.filter((alien) =&gt; alien.alive);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets = this.bullets.filter((bullet) =&gt; bullet.y &gt; 0);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \/\/ Check for Level Completion<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.aliens.length === 0) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.gameActive = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 setTimeout(() =&gt; this.nextLevel(), 1000);<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \/\/ Check for Game Over<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (this.aliens.some((alien) =&gt; alien.y + alien.height &gt; this.player.y)) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.gameActive = false;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.highScores.push(this.score);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.saveHighScores();<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.showMessage(this.config.gameOverMessage, this.loseSound);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 this.displayHighScores();<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.draw();<\/code><\/div>\n<div><code>\u00a0 \u00a0 requestAnimationFrame(() =&gt; this.update());<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>\u00a0 draw() {<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.fillStyle = this.config.backgroundColor;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.fillRect(0, 0, this.config.canvasWidth, this.config.canvasHeight);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.player.draw(this.ctx);<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.bullets.forEach((bullet) =&gt; bullet.draw(this.ctx));<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.aliens.forEach((alien) =&gt; alien.draw(this.ctx));<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.fillStyle = this.config.matrixColor;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.font = \"1rem \" + this.config.fontStyle;<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.textAlign = \"left\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.fillText(<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 `${this.config.scoreText}: ${this.score} | ${this.config.levelText}: ${<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 this.level<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 } | ${this.config.rankText}: ${this.getRank()}`,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 10,<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 20<\/code><\/div>\n<div><code>\u00a0 \u00a0 );<\/code><\/div>\n<div><code>\u00a0 \u00a0 this.ctx.fillText(``, 10, 40);<\/code><\/div>\n<div><code>\u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>\/\/ Game Configuration<\/code><\/div>\n<div><code>const gameConfig = {<\/code><\/div>\n<div><code>\u00a0 canvasWidth: 480,<\/code><\/div>\n<div><code>\u00a0 canvasHeight: 320,<\/code><\/div>\n<div><code>\u00a0 playerSpeed: 5,<\/code><\/div>\n<div><code>\u00a0 bulletSpeed: 10,<\/code><\/div>\n<div><code>\u00a0 initialAlienRows: 3,<\/code><\/div>\n<div><code>\u00a0 aliensPerRow: 8,<\/code><\/div>\n<div><code>\u00a0 alienSpeedX: 1,<\/code><\/div>\n<div><code>\u00a0 alienSpeedY: 20,<\/code><\/div>\n<div><code>\u00a0 maxLevels: 5,<\/code><\/div>\n<div><code>\u00a0 matrixColor: \"#00ff00\", \/\/ Matrix Green<\/code><\/div>\n<div><code>\u00a0 backgroundColor: \"#000\",<\/code><\/div>\n<div><code>\u00a0 bulletChar: \"0\",<\/code><\/div>\n<div><code>\u00a0 playerChars: [\"01\", \"11\", \"11\", \"10\"],<\/code><\/div>\n<div><code>\u00a0 alienChars: [\"0\", \"1\", \"0\"],<\/code><\/div>\n<div><code>\u00a0 fontStyle: \"monospace\",<\/code><\/div>\n<div><code>\u00a0 scoreText: \"SCORE\",<\/code><\/div>\n<div><code>\u00a0 levelText: \"LEVEL\",<\/code><\/div>\n<div><code>\u00a0 rankText: \"RANK\",<\/code><\/div>\n<div><code>\u00a0 gameOverMessage: \"Game Over!\",<\/code><\/div>\n<div><code>\u00a0 gameWonMessage: \"You won the game!\",<\/code><\/div>\n<div><code>\u00a0 restartButtonText: \"Back to the Game\",<\/code><\/div>\n<div><code>\u00a0 playAgainButtonText: \"Play Again\",<\/code><\/div>\n<div><code>\u00a0 highScoresTitle: \"Top Players\",<\/code><\/div>\n<div><code>\u00a0 rankThresholds: {<\/code><\/div>\n<div><code>\u00a0 \u00a0 500: \"Recruit\",<\/code><\/div>\n<div><code>\u00a0 \u00a0 1500: \"Soldier\",<\/code><\/div>\n<div><code>\u00a0 \u00a0 3000: \"Veteran\",<\/code><\/div>\n<div><code>\u00a0 \u00a0 5000: \"Elite\",<\/code><\/div>\n<div><code>\u00a0 \u00a0 Infinity: \"Legend\",<\/code><\/div>\n<div><code>\u00a0 },<\/code><\/div>\n<div><code>\u00a0 highScoreStorageKey: \"spaceInvadersHighScores\",<\/code><\/div>\n<div><code>\u00a0 maxHighScores: 10,<\/code><\/div>\n<div><code>};<\/code><\/div>\n<div><code>const game = new Game(gameConfig);<\/code><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\">Deixo aqui um v\u00eddeo curto de como ficou o Jogo:<\/span><\/strong><\/span><\/p>\n<p>&nbsp;<\/p>\n<p><iframe loading=\"lazy\" title=\"Matrix invaders em Javascript #javascript #coding #javascriptdeveloper\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/3juun-7tOMU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<h2><\/h2>\n<p><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\">Caso queira conferir o jogo, voc\u00ea pode joga-lo no link abaixo:<\/span><\/strong><\/span><\/p>\n<p><span style=\"font-size: 14pt; font-family: arial, helvetica, sans-serif;\"><a href=\"https:\/\/urutaudev.com.br\/games\/matrix-invaders\/\">Jogar Matrix Invaders Game<\/a><\/span><\/p>\n<h2><span style=\"font-family: arial, helvetica, sans-serif;\">Conclus\u00e3o<\/span><\/h2>\n<div>\n<div><span style=\"font-size: 14pt; font-family: arial, helvetica, sans-serif;\">Neste post voc\u00ea pode acompanhar como criar uma vers\u00e3o do jogo Matrix invaders em <a href=\"https:\/\/urutaudev.com.br\/index.php\/category\/tutorias\/javascript\/\">JavaScript<\/a>! Ao seguir os passos deste tutorial, voc\u00ea tem uma compreens\u00e3o de como construir um jogo do zero, implementando funcionalidades essenciais como o movimento da bola, a colis\u00e3o com os blocos e a pontua\u00e7\u00e3o.<\/span><\/div>\n<div><span style=\"font-size: 14pt; font-family: arial, helvetica, sans-serif;\">A constru\u00e7\u00e3o de jogos simples \u00a0como esse ajuda aprimorar nossas habilidades em JavaScript, caso queira adicione mais funcionalidades e refinamento ao jogo e compartilhe na descri\u00e7\u00e3o, gostaria de ver formas melhores de construir este jogo.<\/span><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-family: arial, helvetica, sans-serif;\">C\u00f3digo fonte do Game Matrix Invaders em Javascript:<\/span><\/h2>\n<p><span style=\"font-family: arial, helvetica, sans-serif;\"><strong><span style=\"font-size: 14pt;\"><a href=\"https:\/\/github.com\/JrDevCJ\/javascript-games\/tree\/main\/matrix-invaders\" target=\"_blank\" rel=\"noopener\">C\u00f3digo Fonte<\/a><\/span><\/strong><\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; &nbsp; &nbsp; Introdu\u00e7\u00e3o Embarque nesta jornada de desenvolvimento de jogos web! Neste post vamos recriar o cl\u00e1ssico &#8220;Space Invaders&#8221;<\/p>\n","protected":false},"author":1,"featured_media":810,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[1,14],"tags":[29,113,81,82,27,26,151,18],"class_list":["post-806","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-javascript","tag-css","tag-gamer","tag-games","tag-games-javascript","tag-html","tag-javascript","tag-matrix","tag-tutorias"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Matrix invaders em Javascript - UrutauDev<\/title>\n<meta name=\"description\" content=\"Criando Matrix invaders em Javascript! Neste post vamos recriar o cl\u00e1ssico &quot;Space Invaders&quot; utilizando apenas Javascript\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Matrix invaders em Javascript - UrutauDev\" \/>\n<meta property=\"og:description\" content=\"Criando Matrix invaders em Javascript! Neste post vamos recriar o cl\u00e1ssico &quot;Space Invaders&quot; utilizando apenas Javascript\" \/>\n<meta property=\"og:url\" content=\"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"UrutauDev\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-12T22:43:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-13T00:21:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png\" \/>\n\t<meta property=\"og:image:width\" content=\"868\" \/>\n\t<meta property=\"og:image:height\" content=\"565\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"C. Junior\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"C. Junior\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/\"},\"author\":{\"name\":\"C. Junior\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#\\\/schema\\\/person\\\/7e321618d23a158d5a42d5cfbdd99dd6\"},\"headline\":\"Matrix invaders em Javascript\",\"datePublished\":\"2025-04-12T22:43:57+00:00\",\"dateModified\":\"2025-04-13T00:21:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/\"},\"wordCount\":279,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/urutaudev.com.br\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/matrix-digital-invaders2-e1744499587197.png\",\"keywords\":[\"css\",\"gamer\",\"games\",\"games javascript\",\"html\",\"javascript\",\"matrix\",\"tutorias\"],\"articleSection\":[\"Blog\",\"Javascript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/\",\"url\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/\",\"name\":\"Matrix invaders em Javascript - UrutauDev\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/urutaudev.com.br\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/matrix-digital-invaders2-e1744499587197.png\",\"datePublished\":\"2025-04-12T22:43:57+00:00\",\"dateModified\":\"2025-04-13T00:21:57+00:00\",\"description\":\"Criando Matrix invaders em Javascript! Neste post vamos recriar o cl\u00e1ssico \\\"Space Invaders\\\" utilizando apenas Javascript\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#primaryimage\",\"url\":\"https:\\\/\\\/urutaudev.com.br\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/matrix-digital-invaders2-e1744499587197.png\",\"contentUrl\":\"https:\\\/\\\/urutaudev.com.br\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/matrix-digital-invaders2-e1744499587197.png\",\"width\":868,\"height\":565,\"caption\":\"matrix-invaders\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/2025\\\/04\\\/12\\\/matrix-invaders-em-javascript\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/urutaudev.com.br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Matrix invaders em Javascript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#website\",\"url\":\"https:\\\/\\\/urutaudev.com.br\\\/\",\"name\":\"UrutauDev\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/urutaudev.com.br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#organization\",\"name\":\"UrutauDev\",\"url\":\"https:\\\/\\\/urutaudev.com.br\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/urutaudev.com.br\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/cropped-urutau-dev-logo.png\",\"contentUrl\":\"https:\\\/\\\/urutaudev.com.br\\\/wp-content\\\/uploads\\\/2023\\\/08\\\/cropped-urutau-dev-logo.png\",\"width\":100,\"height\":84,\"caption\":\"UrutauDev\"},\"image\":{\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/urutaudev.com.br\\\/#\\\/schema\\\/person\\\/7e321618d23a158d5a42d5cfbdd99dd6\",\"name\":\"C. Junior\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e7df4c63012e2f6991311d4037bdc57752b996058cf1396747a7ab74e8ac032e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e7df4c63012e2f6991311d4037bdc57752b996058cf1396747a7ab74e8ac032e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e7df4c63012e2f6991311d4037bdc57752b996058cf1396747a7ab74e8ac032e?s=96&d=mm&r=g\",\"caption\":\"C. Junior\"},\"sameAs\":[\"http:\\\/\\\/urutaudev.com.br\",\"instagram.com\\\/urutautec\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC8pDLb5GaYBAoWwQkIzrhRw\"],\"url\":\"https:\\\/\\\/urutaudev.com.br\\\/index.php\\\/author\\\/urutaudev-com-br\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Matrix invaders em Javascript - UrutauDev","description":"Criando Matrix invaders em Javascript! Neste post vamos recriar o cl\u00e1ssico \"Space Invaders\" utilizando apenas Javascript","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/","og_locale":"en_US","og_type":"article","og_title":"Matrix invaders em Javascript - UrutauDev","og_description":"Criando Matrix invaders em Javascript! Neste post vamos recriar o cl\u00e1ssico \"Space Invaders\" utilizando apenas Javascript","og_url":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/","og_site_name":"UrutauDev","article_published_time":"2025-04-12T22:43:57+00:00","article_modified_time":"2025-04-13T00:21:57+00:00","og_image":[{"width":868,"height":565,"url":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png","type":"image\/png"}],"author":"C. Junior","twitter_card":"summary_large_image","twitter_misc":{"Written by":"C. Junior","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#article","isPartOf":{"@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/"},"author":{"name":"C. Junior","@id":"https:\/\/urutaudev.com.br\/#\/schema\/person\/7e321618d23a158d5a42d5cfbdd99dd6"},"headline":"Matrix invaders em Javascript","datePublished":"2025-04-12T22:43:57+00:00","dateModified":"2025-04-13T00:21:57+00:00","mainEntityOfPage":{"@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/"},"wordCount":279,"commentCount":0,"publisher":{"@id":"https:\/\/urutaudev.com.br\/#organization"},"image":{"@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png","keywords":["css","gamer","games","games javascript","html","javascript","matrix","tutorias"],"articleSection":["Blog","Javascript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/","url":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/","name":"Matrix invaders em Javascript - UrutauDev","isPartOf":{"@id":"https:\/\/urutaudev.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#primaryimage"},"image":{"@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png","datePublished":"2025-04-12T22:43:57+00:00","dateModified":"2025-04-13T00:21:57+00:00","description":"Criando Matrix invaders em Javascript! Neste post vamos recriar o cl\u00e1ssico \"Space Invaders\" utilizando apenas Javascript","breadcrumb":{"@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#primaryimage","url":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png","contentUrl":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2025\/04\/matrix-digital-invaders2-e1744499587197.png","width":868,"height":565,"caption":"matrix-invaders"},{"@type":"BreadcrumbList","@id":"https:\/\/urutaudev.com.br\/index.php\/2025\/04\/12\/matrix-invaders-em-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/urutaudev.com.br\/"},{"@type":"ListItem","position":2,"name":"Matrix invaders em Javascript"}]},{"@type":"WebSite","@id":"https:\/\/urutaudev.com.br\/#website","url":"https:\/\/urutaudev.com.br\/","name":"UrutauDev","description":"","publisher":{"@id":"https:\/\/urutaudev.com.br\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/urutaudev.com.br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/urutaudev.com.br\/#organization","name":"UrutauDev","url":"https:\/\/urutaudev.com.br\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/urutaudev.com.br\/#\/schema\/logo\/image\/","url":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2023\/08\/cropped-urutau-dev-logo.png","contentUrl":"https:\/\/urutaudev.com.br\/wp-content\/uploads\/2023\/08\/cropped-urutau-dev-logo.png","width":100,"height":84,"caption":"UrutauDev"},"image":{"@id":"https:\/\/urutaudev.com.br\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/urutaudev.com.br\/#\/schema\/person\/7e321618d23a158d5a42d5cfbdd99dd6","name":"C. Junior","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e7df4c63012e2f6991311d4037bdc57752b996058cf1396747a7ab74e8ac032e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e7df4c63012e2f6991311d4037bdc57752b996058cf1396747a7ab74e8ac032e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e7df4c63012e2f6991311d4037bdc57752b996058cf1396747a7ab74e8ac032e?s=96&d=mm&r=g","caption":"C. Junior"},"sameAs":["http:\/\/urutaudev.com.br","instagram.com\/urutautec","https:\/\/www.youtube.com\/channel\/UC8pDLb5GaYBAoWwQkIzrhRw"],"url":"https:\/\/urutaudev.com.br\/index.php\/author\/urutaudev-com-br\/"}]}},"_links":{"self":[{"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/posts\/806","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=806"}],"version-history":[{"count":6,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/posts\/806\/revisions"}],"predecessor-version":[{"id":813,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/posts\/806\/revisions\/813"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/media\/810"}],"wp:attachment":[{"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=806"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=806"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/urutaudev.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}