From ab9579bf9eafff71cea06cf59b7376e61841cceb Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:19:29 -0400 Subject: [PATCH 1/9] Update README.md --- README.md | 57 +++---------------------------------------------------- 1 file changed, 3 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 3ae10a92..2d36a5ce 100644 --- a/README.md +++ b/README.md @@ -3,59 +3,8 @@ Assignment 4 - Creative Coding: Interactive Multimedia Experiences Due: October 4th, by 11:59 AM. -For this assignment we will focus on client-side development using popular audio/graphics/visualization technologies. The goal of this assignment is to refine our JavaScript knowledge while exploring the multimedia capabilities of the browser. +## Goat Cheese -[WebAudio / Canvas / Three Tutorial](https://github.com/cs4241-21a/cs4241-21a.github.io/blob/main/webaudio_canvas_three.md) -[SVG + D3 tutorial](https://github.com/cs4241-21a/cs4241-21a.github.io/blob/main/using_svg_and_d3.md) +Link: https://a4-joseph-scheufele.glitch.me -Baseline Requirements ---- - -Your application is required to implement the following functionalities: - -- A server created using Express. This server can be as simple as needed. -- A client-side interactive experience using at least one of the following web technologies frameworks. - - [Three.js](https://threejs.org/): A library for 3D graphics / VR experiences - - [D3.js](https://d3js.org): A library that is primarily used for interactive data visualizations - - [Canvas](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API): A 2D raster drawing API included in all modern browsers - - [SVG](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API): A 2D vector drawing framework that enables shapes to be defined via XML. - - [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API): An API for audio synthesis, analysis, processing, and file playback. -- A user interface for interaction with your project, which must expose at least four parameters for user control. [tweakpane](https://cocopon.github.io/tweakpane/) is highly recommended for this, but you can also use regular HTML `` tags (the `range` type is useful to create sliders). You might also explore interaction by tracking mouse movement via the `window.onmousemove` event handler in tandem with the `event.clientX` and `event.clientY` properties. Consider using the [Pointer Events API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events) to ensure that that both mouse and touch events will both be supported in your app. -- Your application should display basic documentation for the user interface when the application first loads. - -The interactive experience should possess a reasonable level of complexity. Some examples: -### Three.js -- A generative algorithm creates simple agents that move through a virtual world. Your interface controls the behavior / appearance of these agents. -- A simple 3D game... you really want this to be a simple as possible or it will be outside the scope of this assignment. -- An 3D audio visualization of a song of your choosing. User interaction should control aspects of the visualization. -### Canvas -- Implement a generative algorithm such as [Conway's Game of Life](https://bitstorm.org/gameoflife/) (or 1D cellular automata) and provide interactive controls. Note that the Game of Life has been created by 100s of people using ; we'll be checking to ensure that your implementation is not a copy of these. -- Design a 2D audio visualizer of a song of your choosing. User interaction should control visual aspects of the experience. -### Web Audio API -- Create a screen-based musical instrument using the Web Audio API. You can use projects such as [Interface.js](http://charlie-roberts.com/interface/) or [Nexus UI](https://nexus-js.github.io/ui/api/#Piano) to provide common musical interface elements, or use dat.GUI in combination with mouse/touch events (use the Pointer Events API). Your GUI should enable users to control aspects of sound synthesis. If you want to use higher-level instruments instead of the raw WebAudio API sounds, consider trying the instruments provided by [Tone.js]() or [Gibber](https://github.com/charlieroberts/gibber.audio.lib). -### D3.js -- Create visualizations using the datasets found at [Awesome JSON Datasets](https://github.com/jdorfman/Awesome-JSON-Datasets). Experiment with providing different visualizations of the same data set, and providing users interactive control over visualization parameters and/or data filtering. Alternatively, create a single visualization with using one of the more complicated techniques shown at [d3js.org](d3js.org) and provide meaningful points of interaction for users. - -Deliverables ---- - -Do the following to complete this assignment: - -1. Implement your project with the above requirements. -3. Test your project to make sure that when someone goes to your main page on Glitch/Heroku/etc., it displays correctly. -4. Ensure that your project has the proper naming scheme `a4-firstname-lastname` so we can find it. -5. Fork this repository and modify the README to the specifications below. *NOTE: If you don't use Glitch for hosting (where we can see the files) then you must include all project files that you author in your repo for this assignment*. -6. Create and submit a Pull Request to the original repo. Name the pull request using the following template: `a4-firstname-lastname`. - -Sample Readme (delete the above when you're ready to submit, and modify the below so with your links and descriptions) ---- - -## Your Web Application Title - -your hosting link e.g. http://a4-charlieroberts.glitch.me - -Include a very brief summary of your project here. Images are encouraged when needed, along with concise, high-level text. Be sure to include: - -- the goal of the application -- challenges you faced in realizing the application -- the instructions you present in the website should be clear enough to use the application, but if you feel any need to provide additional instructions please do so here. +This is an implementation of the famous snake game, but with a creative twist in that the snake is replaced with an ever growing line of hungry goats looking for a block of cheese. The arrow keys are used to move the goat herd around the screen. One challenge I faced was rendering the line of goats, I needed to find the correct size to make the images and the correct collision detection. From ecc1022bad2c42ef581259712d7d73d83b445550 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 14:37:21 +0000 Subject: [PATCH 2/9] Add files via upload --- index.html | 32 +++++++++ package.json | 16 +++++ script.js | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++ server.js | 11 +++ styles.css | 35 +++++++++ 5 files changed, 291 insertions(+) create mode 100644 index.html create mode 100644 package.json create mode 100644 script.js create mode 100644 server.js create mode 100644 styles.css diff --git a/index.html b/index.html new file mode 100644 index 00000000..4b7b63ac --- /dev/null +++ b/index.html @@ -0,0 +1,32 @@ + + + + Goat + + + + + + + + + + + + + + + + +

Goat....cheese!

+

Use arrow keys to move Gompei!

+ +
+ +
+ + + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..4fa385fc --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "CS_4241_Assignment_4", + "version": "0.1.0", + "description": "My own interpretation of the game, Space Invaders", + "author": "Joseph Scheufele", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "express": "^4.17.1" + }, + "engines": { + "node": "14.x" + } + } + \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 00000000..4924f9aa --- /dev/null +++ b/script.js @@ -0,0 +1,197 @@ +const gameboard = document.getElementById("gameCanvas") +const gameboardctx = gameboard.getContext("2d") +const board_border = 'black' +const board_background = "white" + +const parent = document.getElementById("gameContainer") +gameboard.width = parent.offsetWidth +gameboard.height = parent.offsetHeight + +const snake_col = 'lightblue' +const snake_border = 'darkblue' + +const INCREMENT = 20 + +let gompei = [ + {x:200, y:200}, + {x:190, y:200}, + {x:180, y:200}, + {x:170, y:200}, + {x:160, y:200}, +] + +const goat = new Image() +goat.src = "https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fgoat.png?v=1633296688197" + +function drawGompeiPart(gompeiPart) { + gameboardctx.drawImage(goat, gompeiPart.x, gompeiPart.y, INCREMENT, INCREMENT) +} + +function drawGompei() { + gompei.forEach(drawGompeiPart) +} + +function clearCanvas() { + gameboardctx.fillStyle = board_background + gameboardctx.strokestyle = board_border + gameboardctx.fillRect(0, 0, gameboard.width, gameboard.height) + gameboardctx.strokeRect(0, 0, gameboard.width, gameboard.height) +} + +let dx = INCREMENT +let dy = 0 +let food_x +let food_y +let score = 0 +let changing_direction = false +let started = false + +const cheese = new Image() +cheese.src = "https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fcheese.png?v=1633321691951" + +const goatsound = new Audio("https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fgoatwav.mp3?v=1633345750329") + +function move_gompei() { + const head = {x: gompei[0].x + dx, y: gompei[0].y + dy} + gompei.unshift(head) + const has_eaten_food = gompei[0].x+(INCREMENT/2) >= food_x && gompei[0].x+(INCREMENT/2) <= food_x+INCREMENT && gompei[0].y+(INCREMENT/2) >= food_y && gompei[0].y+(INCREMENT/2) <= food_y+INCREMENT + if (has_eaten_food) { + goatsound.currentTime = 1 + goatsound.play() + score +=1 + document.getElementById("score").innerText = "Score: "+ score + gen_food() + } else { + gompei.pop() + } +} + +document.addEventListener("keydown", change_direction) + +function change_direction(event) +{ + const LEFT_KEY = 37 + const RIGHT_KEY = 39 + const UP_KEY = 38 + const DOWN_KEY = 40 + + const keyPressed = event.keyCode + const goingUp = dy === -INCREMENT + const goingDown = dy === INCREMENT + const goingRight = dx === INCREMENT + const goingLeft = dx === -INCREMENT + + if (keyPressed === LEFT_KEY && !goingRight) + { + dx = -INCREMENT + dy = 0 + } + + if (keyPressed === UP_KEY && !goingDown) + { + dx = 0 + dy = -INCREMENT + } + + if (keyPressed === RIGHT_KEY && !goingLeft) + { + dx = INCREMENT + dy = 0 + } + + if (keyPressed === DOWN_KEY && !goingUp) + { + dx = 0 + dy = INCREMENT + } +} + +function has_game_ended() +{ + for (let i = 4; i < gompei.length; i++) + { + const has_collided = gompei[i].x === gompei[0].x && gompei[i].y === gompei[0].y + if (has_collided) { + started = false + return true + } + } + const hitLeftWall = gompei[0].x < 0 + const hitRightWall = gompei[0].x > gameboard.width + const hitToptWall = gompei[0].y < 0 + const hitBottomWall = gompei[0].y > gameboard.height + + return hitLeftWall || hitRightWall || hitToptWall || hitBottomWall +} + +function random_food(min, max) +{ + return Math.round((Math.random() * (max-min) + min) / 10) * 10 +} + +function gen_food() +{ + food_x = random_food(0, gameboard.width - INCREMENT) + food_y = random_food(0, gameboard.height - INCREMENT) + gompei.forEach(function has_gompei_eaten_food(part) { + const has_eaten = part.x == food_x && part.y == food_y; + if (has_eaten) gen_food() + }) +} + +function drawFood() { + gameboardctx.drawImage(cheese, food_x, food_y, INCREMENT, INCREMENT) + +} + +const endgame = function() { + gameboard.remove() + document.querySelector("#start").innerText = "Play Again" + const prompt = document.createElement("H1") + prompt.className = "nes-text is-error" + prompt.innerText = "You Lost, Play Again?" + document.getElementById("gameContainer").appendChild(prompt) + +} + +function main() { + if (has_game_ended()){ + clearCanvas() + endgame() + return + } + changing_direction = false + setTimeout(function onTick() { + clearCanvas() + drawFood() + move_gompei() + drawGompei() + main() + }, 100) +} + +const start = function () { + if (!started) { + started = true + window.location.reload() + } +} + +main() +gen_food() + +window.onload = function() { + const start_button = document.querySelector("#start") + start_button.onclick = start +} + +window.onresize = function() { + const gameboard = document.getElementById("gameCanvas") + const gameboardctx = gameboard.getContext("2d") + const board_border = 'black' + const board_background = "white" + + const parent = document.getElementById("gameContainer") + gameboard.width = parent.width + gameboard.height = parent.height +} \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 00000000..35b96d5a --- /dev/null +++ b/server.js @@ -0,0 +1,11 @@ +const express = require("express"), + app = express() + +app.use(express.static(__dirname + '/public')) +app.get("/", (req,res) => res.sendFile(__dirname + "/views/index.html")) + +let port = process.env.PORT; +if (port == null || port == "") { + port = 3000; +} +app.listen(port); \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 00000000..fff18718 --- /dev/null +++ b/styles.css @@ -0,0 +1,35 @@ +* { + font-family: 'Press Start 2P', cursive; + } + + html, body { + padding-top: 1em; + padding-left: 7em; + padding-right: 7em; + padding-bottom: 1em; + height:90%; + } + + #gameCanvas { + height:100%; + width:100% + } + + #gameContainer { + width:95%; + height:95% + } + + #header { + display:grid; + grid-template-rows: 1fr; + grid-template-columns: 1fr 1fr; + } + + #start { + margin: .3em + } + + #score { + margin: .3em + } \ No newline at end of file From 5ef32cdd7a9ead472cc13db21a55b58957ed2c55 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:40:00 -0400 Subject: [PATCH 3/9] Create script.js --- public/js/script.js | 197 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 public/js/script.js diff --git a/public/js/script.js b/public/js/script.js new file mode 100644 index 00000000..f0291d55 --- /dev/null +++ b/public/js/script.js @@ -0,0 +1,197 @@ +const gameboard = document.getElementById("gameCanvas") +const gameboardctx = gameboard.getContext("2d") +const board_border = 'black' +const board_background = "white" + +const parent = document.getElementById("gameContainer") +gameboard.width = parent.offsetWidth +gameboard.height = parent.offsetHeight + +const snake_col = 'lightblue' +const snake_border = 'darkblue' + +const INCREMENT = 20 + +let gompei = [ + {x:200, y:200}, + {x:190, y:200}, + {x:180, y:200}, + {x:170, y:200}, + {x:160, y:200}, +] + +const goat = new Image() +goat.src = "https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fgoat.png?v=1633296688197" + +function drawGompeiPart(gompeiPart) { + gameboardctx.drawImage(goat, gompeiPart.x, gompeiPart.y, INCREMENT, INCREMENT) +} + +function drawGompei() { + gompei.forEach(drawGompeiPart) +} + +function clearCanvas() { + gameboardctx.fillStyle = board_background + gameboardctx.strokestyle = board_border + gameboardctx.fillRect(0, 0, gameboard.width, gameboard.height) + gameboardctx.strokeRect(0, 0, gameboard.width, gameboard.height) +} + +let dx = INCREMENT +let dy = 0 +let food_x +let food_y +let score = 0 +let changing_direction = false +let started = false + +const cheese = new Image() +cheese.src = "https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fcheese.png?v=1633321691951" + +const goatsound = new Audio("https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fgoatwav.mp3?v=1633345750329") + +function move_gompei() { + const head = {x: gompei[0].x + dx, y: gompei[0].y + dy} + gompei.unshift(head) + const has_eaten_food = gompei[0].x+(INCREMENT/2) >= food_x && gompei[0].x+(INCREMENT/2) <= food_x+INCREMENT && gompei[0].y+(INCREMENT/2) >= food_y && gompei[0].y+(INCREMENT/2) <= food_y+INCREMENT + if (has_eaten_food) { + goatsound.currentTime = 1 + goatsound.play() + score +=1 + document.getElementById("score").innerText = "Score: "+ score + gen_food() + } else { + gompei.pop() + } +} + +document.addEventListener("keydown", change_direction) + +function change_direction(event) +{ + const LEFT_KEY = 37 + const RIGHT_KEY = 39 + const UP_KEY = 38 + const DOWN_KEY = 40 + + const keyPressed = event.keyCode + const goingUp = dy === -INCREMENT + const goingDown = dy === INCREMENT + const goingRight = dx === INCREMENT + const goingLeft = dx === -INCREMENT + + if (keyPressed === LEFT_KEY && !goingRight) + { + dx = -INCREMENT + dy = 0 + } + + if (keyPressed === UP_KEY && !goingDown) + { + dx = 0 + dy = -INCREMENT + } + + if (keyPressed === RIGHT_KEY && !goingLeft) + { + dx = INCREMENT + dy = 0 + } + + if (keyPressed === DOWN_KEY && !goingUp) + { + dx = 0 + dy = INCREMENT + } +} + +function has_game_ended() +{ + for (let i = 4; i < gompei.length; i++) + { + const has_collided = gompei[i].x === gompei[0].x && gompei[i].y === gompei[0].y + if (has_collided) { + started = false + return true + } + } + const hitLeftWall = gompei[0].x < 0 + const hitRightWall = gompei[0].x > gameboard.width + const hitToptWall = gompei[0].y < 0 + const hitBottomWall = gompei[0].y > gameboard.height + + return hitLeftWall || hitRightWall || hitToptWall || hitBottomWall +} + +function random_food(min, max) +{ + return Math.round((Math.random() * (max-min) + min) / 10) * 10 +} + +function gen_food() +{ + food_x = random_food(0, gameboard.width - INCREMENT) + food_y = random_food(0, gameboard.height - INCREMENT) + gompei.forEach(function has_gompei_eaten_food(part) { + const has_eaten = part.x == food_x && part.y == food_y; + if (has_eaten) gen_food() + }) +} + +function drawFood() { + gameboardctx.drawImage(cheese, food_x, food_y, INCREMENT, INCREMENT) + +} + +const endgame = function() { + gameboard.remove() + document.querySelector("#start").innerText = "Play Again" + const prompt = document.createElement("H1") + prompt.className = "nes-text is-error" + prompt.innerText = "You Lost, Play Again?" + document.getElementById("gameContainer").appendChild(prompt) + +} + +function main() { + if (has_game_ended()){ + clearCanvas() + endgame() + return + } + changing_direction = false + setTimeout(function onTick() { + clearCanvas() + drawFood() + move_gompei() + drawGompei() + main() + }, 100) +} + +const start = function () { + if (!started) { + started = true + window.location.reload() + } +} + +main() +gen_food() + +window.onload = function() { + const start_button = document.querySelector("#start") + start_button.onclick = start +} + +window.onresize = function() { + const gameboard = document.getElementById("gameCanvas") + const gameboardctx = gameboard.getContext("2d") + const board_border = 'black' + const board_background = "white" + + const parent = document.getElementById("gameContainer") + gameboard.width = parent.width + gameboard.height = parent.height +} From 7fca0b0b4d2db82ba8a2a2d3f520257bc4a8d653 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:40:28 -0400 Subject: [PATCH 4/9] Create styles.css --- public/css/styles.css | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 public/css/styles.css diff --git a/public/css/styles.css b/public/css/styles.css new file mode 100644 index 00000000..a5166735 --- /dev/null +++ b/public/css/styles.css @@ -0,0 +1,35 @@ +* { + font-family: 'Press Start 2P', cursive; + } + + html, body { + padding-top: 1em; + padding-left: 7em; + padding-right: 7em; + padding-bottom: 1em; + height:90%; + } + + #gameCanvas { + height:100%; + width:100% + } + + #gameContainer { + width:95%; + height:95% + } + + #header { + display:grid; + grid-template-rows: 1fr; + grid-template-columns: 1fr 1fr; + } + + #start { + margin: .3em + } + + #score { + margin: .3em + } From ccf63da2cd63a867f229e7a14d3f45e146482245 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:40:57 -0400 Subject: [PATCH 5/9] Create index.html --- views/index.html | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 views/index.html diff --git a/views/index.html b/views/index.html new file mode 100644 index 00000000..908ae5dc --- /dev/null +++ b/views/index.html @@ -0,0 +1,32 @@ + + + + Goat + + + + + + + + + + + + + + + + +

Goat....cheese!

+

Use arrow keys to move Gompei!

+ +
+ +
+ + + From 15a645a56f0b68ee8ba726b415a0e60c766b29c8 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:41:08 -0400 Subject: [PATCH 6/9] Delete script.js --- script.js | 197 ------------------------------------------------------ 1 file changed, 197 deletions(-) delete mode 100644 script.js diff --git a/script.js b/script.js deleted file mode 100644 index 4924f9aa..00000000 --- a/script.js +++ /dev/null @@ -1,197 +0,0 @@ -const gameboard = document.getElementById("gameCanvas") -const gameboardctx = gameboard.getContext("2d") -const board_border = 'black' -const board_background = "white" - -const parent = document.getElementById("gameContainer") -gameboard.width = parent.offsetWidth -gameboard.height = parent.offsetHeight - -const snake_col = 'lightblue' -const snake_border = 'darkblue' - -const INCREMENT = 20 - -let gompei = [ - {x:200, y:200}, - {x:190, y:200}, - {x:180, y:200}, - {x:170, y:200}, - {x:160, y:200}, -] - -const goat = new Image() -goat.src = "https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fgoat.png?v=1633296688197" - -function drawGompeiPart(gompeiPart) { - gameboardctx.drawImage(goat, gompeiPart.x, gompeiPart.y, INCREMENT, INCREMENT) -} - -function drawGompei() { - gompei.forEach(drawGompeiPart) -} - -function clearCanvas() { - gameboardctx.fillStyle = board_background - gameboardctx.strokestyle = board_border - gameboardctx.fillRect(0, 0, gameboard.width, gameboard.height) - gameboardctx.strokeRect(0, 0, gameboard.width, gameboard.height) -} - -let dx = INCREMENT -let dy = 0 -let food_x -let food_y -let score = 0 -let changing_direction = false -let started = false - -const cheese = new Image() -cheese.src = "https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fcheese.png?v=1633321691951" - -const goatsound = new Audio("https://cdn.glitch.com/a7611cfe-7b75-43fc-b92b-b75661f1bb15%2Fgoatwav.mp3?v=1633345750329") - -function move_gompei() { - const head = {x: gompei[0].x + dx, y: gompei[0].y + dy} - gompei.unshift(head) - const has_eaten_food = gompei[0].x+(INCREMENT/2) >= food_x && gompei[0].x+(INCREMENT/2) <= food_x+INCREMENT && gompei[0].y+(INCREMENT/2) >= food_y && gompei[0].y+(INCREMENT/2) <= food_y+INCREMENT - if (has_eaten_food) { - goatsound.currentTime = 1 - goatsound.play() - score +=1 - document.getElementById("score").innerText = "Score: "+ score - gen_food() - } else { - gompei.pop() - } -} - -document.addEventListener("keydown", change_direction) - -function change_direction(event) -{ - const LEFT_KEY = 37 - const RIGHT_KEY = 39 - const UP_KEY = 38 - const DOWN_KEY = 40 - - const keyPressed = event.keyCode - const goingUp = dy === -INCREMENT - const goingDown = dy === INCREMENT - const goingRight = dx === INCREMENT - const goingLeft = dx === -INCREMENT - - if (keyPressed === LEFT_KEY && !goingRight) - { - dx = -INCREMENT - dy = 0 - } - - if (keyPressed === UP_KEY && !goingDown) - { - dx = 0 - dy = -INCREMENT - } - - if (keyPressed === RIGHT_KEY && !goingLeft) - { - dx = INCREMENT - dy = 0 - } - - if (keyPressed === DOWN_KEY && !goingUp) - { - dx = 0 - dy = INCREMENT - } -} - -function has_game_ended() -{ - for (let i = 4; i < gompei.length; i++) - { - const has_collided = gompei[i].x === gompei[0].x && gompei[i].y === gompei[0].y - if (has_collided) { - started = false - return true - } - } - const hitLeftWall = gompei[0].x < 0 - const hitRightWall = gompei[0].x > gameboard.width - const hitToptWall = gompei[0].y < 0 - const hitBottomWall = gompei[0].y > gameboard.height - - return hitLeftWall || hitRightWall || hitToptWall || hitBottomWall -} - -function random_food(min, max) -{ - return Math.round((Math.random() * (max-min) + min) / 10) * 10 -} - -function gen_food() -{ - food_x = random_food(0, gameboard.width - INCREMENT) - food_y = random_food(0, gameboard.height - INCREMENT) - gompei.forEach(function has_gompei_eaten_food(part) { - const has_eaten = part.x == food_x && part.y == food_y; - if (has_eaten) gen_food() - }) -} - -function drawFood() { - gameboardctx.drawImage(cheese, food_x, food_y, INCREMENT, INCREMENT) - -} - -const endgame = function() { - gameboard.remove() - document.querySelector("#start").innerText = "Play Again" - const prompt = document.createElement("H1") - prompt.className = "nes-text is-error" - prompt.innerText = "You Lost, Play Again?" - document.getElementById("gameContainer").appendChild(prompt) - -} - -function main() { - if (has_game_ended()){ - clearCanvas() - endgame() - return - } - changing_direction = false - setTimeout(function onTick() { - clearCanvas() - drawFood() - move_gompei() - drawGompei() - main() - }, 100) -} - -const start = function () { - if (!started) { - started = true - window.location.reload() - } -} - -main() -gen_food() - -window.onload = function() { - const start_button = document.querySelector("#start") - start_button.onclick = start -} - -window.onresize = function() { - const gameboard = document.getElementById("gameCanvas") - const gameboardctx = gameboard.getContext("2d") - const board_border = 'black' - const board_background = "white" - - const parent = document.getElementById("gameContainer") - gameboard.width = parent.width - gameboard.height = parent.height -} \ No newline at end of file From 99f51d6ee4655dba1b3165fe3f02c40a38a745e0 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:41:15 -0400 Subject: [PATCH 7/9] Delete styles.css --- styles.css | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 styles.css diff --git a/styles.css b/styles.css deleted file mode 100644 index fff18718..00000000 --- a/styles.css +++ /dev/null @@ -1,35 +0,0 @@ -* { - font-family: 'Press Start 2P', cursive; - } - - html, body { - padding-top: 1em; - padding-left: 7em; - padding-right: 7em; - padding-bottom: 1em; - height:90%; - } - - #gameCanvas { - height:100%; - width:100% - } - - #gameContainer { - width:95%; - height:95% - } - - #header { - display:grid; - grid-template-rows: 1fr; - grid-template-columns: 1fr 1fr; - } - - #start { - margin: .3em - } - - #score { - margin: .3em - } \ No newline at end of file From f68e66df2edf92b77bd5f9d183d0ec2f33568598 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 10:41:22 -0400 Subject: [PATCH 8/9] Delete index.html --- index.html | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 index.html diff --git a/index.html b/index.html deleted file mode 100644 index 4b7b63ac..00000000 --- a/index.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - Goat - - - - - - - - - - - - - - - - -

Goat....cheese!

-

Use arrow keys to move Gompei!

- -
- -
- - - \ No newline at end of file From 7c6782575e327d92f6dd65050bfdf5702f1bf672 Mon Sep 17 00:00:00 2001 From: Joe Scheufele <57052259+jcscheufele@users.noreply.github.com> Date: Mon, 4 Oct 2021 14:42:20 +0000 Subject: [PATCH 9/9] Add files via upload --- cheese.png | Bin 0 -> 26521 bytes goat.png | Bin 0 -> 19728 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 cheese.png create mode 100644 goat.png diff --git a/cheese.png b/cheese.png new file mode 100644 index 0000000000000000000000000000000000000000..269562d6d6b3c913c2cec25f670f593c6f7fd584 GIT binary patch literal 26521 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 literal 0 HcmV?d00001