Compare commits
No commits in common. "c34177b21653c170b78f0aec9b9d2dcca39f163f" and "265bde56b403a374449fdc8ba4db2351acaffda1" have entirely different histories.
c34177b216
...
265bde56b4
5 changed files with 26 additions and 59 deletions
11
index.html
11
index.html
|
|
@ -1,5 +1,5 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="hu">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
<meta name="theme-color" content="#A5402D" />
|
<meta name="theme-color" content="#A5402D" />
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Raleway&display=swap"
|
href="https://fonts.googleapis.com/css?family=Raleway"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
/>
|
/>
|
||||||
<link rel="stylesheet" href="css/main.css" />
|
<link rel="stylesheet" href="css/main.css" />
|
||||||
|
|
@ -21,10 +21,9 @@
|
||||||
<div id="startText">
|
<div id="startText">
|
||||||
<h1>Avoid</h1>
|
<h1>Avoid</h1>
|
||||||
<p>
|
<p>
|
||||||
A relentless swarm is closing in on you. Guide your light across
|
the red balls by moving your cursor (or finger) on the screen. Try
|
||||||
the screen with your cursor (or finger), stay out of reach, and
|
eliminating the enemy balls by getting them to collide with each
|
||||||
outsmart your pursuers by luring them into crashing into one
|
other. Good luck!
|
||||||
another. How long can you survive?
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div id="endText">
|
<div id="endText">
|
||||||
|
|
|
||||||
|
|
@ -38,14 +38,6 @@ class CanvasHandler {
|
||||||
return unit * Math.sqrt(this.width * this.height);
|
return unit * Math.sqrt(this.width * this.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
clientToCanvas(clientX, clientY) {
|
|
||||||
const rect = this.canvas.getBoundingClientRect();
|
|
||||||
return [
|
|
||||||
((clientX - rect.left) / rect.width) * this.width,
|
|
||||||
((clientY - rect.top) / rect.height) * this.height,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
get width() {
|
get width() {
|
||||||
return this.canvas.width / window.devicePixelRatio;
|
return this.canvas.width / window.devicePixelRatio;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,14 @@
|
||||||
class InputHandler {
|
class InputHandler {
|
||||||
constructor(canvasHandler) {
|
constructor(idOfWatchedArea) {
|
||||||
const elem = canvasHandler.canvas;
|
const elem = document.getElementById(idOfWatchedArea);
|
||||||
|
|
||||||
const handleMouse = ({ clientX, clientY }) =>
|
const handleMouse = ({ offsetX, offsetY }) =>
|
||||||
this.setPointerPosition(canvasHandler.clientToCanvas(clientX, clientY));
|
this.setPointerPosition([offsetX, offsetY]);
|
||||||
|
const handleTouch = ({ touches }) =>
|
||||||
const handleTouch = (event) => {
|
this.setPointerPosition([touches[0].clientX, touches[0].clientY]);
|
||||||
event.preventDefault();
|
|
||||||
const { clientX, clientY } = event.touches[0];
|
|
||||||
this.setPointerPosition(canvasHandler.clientToCanvas(clientX, clientY));
|
|
||||||
};
|
|
||||||
|
|
||||||
elem.addEventListener("mousemove", handleMouse);
|
elem.addEventListener("mousemove", handleMouse);
|
||||||
elem.addEventListener("touchmove", handleTouch, { passive: false });
|
elem.addEventListener("touchmove", handleTouch);
|
||||||
|
|
||||||
this.pointerPosition = [0, 0];
|
this.pointerPosition = [0, 0];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
44
js/main.js
44
js/main.js
|
|
@ -1,8 +1,7 @@
|
||||||
const enemySpawnFrequencyPerSecond = 4.5;
|
const enemySpawnFrequency = 4.5;
|
||||||
const maxDeltaTimeInMs = 50;
|
|
||||||
|
|
||||||
const canvasHandler = new CanvasHandler("canvas");
|
const canvasHandler = new CanvasHandler("canvas");
|
||||||
const inputHandler = new InputHandler(canvasHandler);
|
const inputHandler = new InputHandler("canvas");
|
||||||
|
|
||||||
let game;
|
let game;
|
||||||
function newGame() {
|
function newGame() {
|
||||||
|
|
@ -28,16 +27,11 @@ class Circle {
|
||||||
this.position = add(this.position, limit(deltaPosition, maxDistance));
|
this.position = add(this.position, limit(deltaPosition, maxDistance));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
draw(canvasHandler) {
|
draw(canvasHandler) {
|
||||||
canvasHandler.drawCircle(this.position, this.size, this.color);
|
canvasHandler.drawCircle(this.position, this.size, this.color);
|
||||||
}
|
}
|
||||||
|
|
||||||
isTouching(other) {
|
isTouching(other) {
|
||||||
return (
|
return magnitude(subtract(this.position, other.position)) < 2 * this.size;
|
||||||
magnitude(subtract(this.position, other.position)) <
|
|
||||||
this.size + other.size
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,8 +46,8 @@ class Game {
|
||||||
);
|
);
|
||||||
|
|
||||||
this.circleHolder = [this.player];
|
this.circleHolder = [this.player];
|
||||||
this.spawnInterval = 1000 / enemySpawnFrequencyPerSecond;
|
this.spawnInterval = 1000 / enemySpawnFrequency;
|
||||||
this.previousSpawn = this.previousTime = 0;
|
this.previousSpawn = this.previousTimestamp = 0;
|
||||||
this.score = 0;
|
this.score = 0;
|
||||||
|
|
||||||
this.menuBox = document.getElementById("menuBox").style;
|
this.menuBox = document.getElementById("menuBox").style;
|
||||||
|
|
@ -61,19 +55,16 @@ class Game {
|
||||||
"none";
|
"none";
|
||||||
|
|
||||||
this.isActive = true;
|
this.isActive = true;
|
||||||
this.boundNextFrame = this.nextFrame.bind(this);
|
window.requestAnimationFrame(this.nextFrame.bind(this));
|
||||||
window.requestAnimationFrame(this.boundNextFrame);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nextFrame(timestamp) {
|
nextFrame(timestamp) {
|
||||||
if (this.isActive) {
|
if (this.isActive) {
|
||||||
canvasHandler.fillCanvas("rgba(165, 64, 45, 0.1)");
|
canvasHandler.fillCanvas("rgba(165, 64, 45, 0.1)");
|
||||||
this.spawnEnemyIfNeeded(timestamp);
|
this.spawnEnemyIfNeeded(timestamp);
|
||||||
this.moveCircles(timestamp);
|
this.moveCircles(timestamp);
|
||||||
window.requestAnimationFrame(this.boundNextFrame);
|
window.requestAnimationFrame(this.nextFrame.bind(this));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
spawnEnemyIfNeeded(timestamp) {
|
spawnEnemyIfNeeded(timestamp) {
|
||||||
if (timestamp - this.previousSpawn > this.spawnInterval) {
|
if (timestamp - this.previousSpawn > this.spawnInterval) {
|
||||||
this.circleHolder.push(
|
this.circleHolder.push(
|
||||||
|
|
@ -93,42 +84,31 @@ class Game {
|
||||||
this.score++;
|
this.score++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
moveCircles(timestamp) {
|
moveCircles(timestamp) {
|
||||||
const deltaTime = this.getDeltaTime(timestamp);
|
const deltaTime = this.getDeltaTime(timestamp);
|
||||||
const collided = new Set();
|
|
||||||
for (let i = 0; i < this.circleHolder.length; i++) {
|
for (let i = 0; i < this.circleHolder.length; i++) {
|
||||||
this.circleHolder[i].move(deltaTime);
|
this.circleHolder[i].move(deltaTime);
|
||||||
this.circleHolder[i].draw(canvasHandler);
|
this.circleHolder[i].draw(canvasHandler);
|
||||||
|
|
||||||
for (let j = i + 1; j < this.circleHolder.length; j++) {
|
for (let j = i + 1; j < this.circleHolder.length; j++) {
|
||||||
if (this.circleHolder[i].isTouching(this.circleHolder[j])) {
|
if (this.circleHolder[i].isTouching(this.circleHolder[j])) {
|
||||||
if (this.circleHolder[i] === this.player) {
|
if (this.circleHolder[i] == this.player) this.showEndScreen();
|
||||||
this.showEndScreen();
|
else {
|
||||||
return;
|
this.circleHolder.splice(i, 1);
|
||||||
}
|
this.circleHolder.splice(j - 1, 1);
|
||||||
collided.add(i).add(j);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (collided.size > 0) {
|
|
||||||
this.circleHolder = this.circleHolder.filter(
|
|
||||||
(_, index) => !collided.has(index)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getDeltaTime(timestamp) {
|
getDeltaTime(timestamp) {
|
||||||
const tempPreviousTime = this.previousTime;
|
const tempPreviousTime = this.previousTime;
|
||||||
this.previousTime = timestamp;
|
this.previousTime = timestamp;
|
||||||
return Math.min(timestamp - tempPreviousTime, maxDeltaTimeInMs);
|
return timestamp - tempPreviousTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
showEndScreen() {
|
showEndScreen() {
|
||||||
document.getElementById("endText").style.display = "block";
|
document.getElementById("endText").style.display = "block";
|
||||||
document.getElementById("endScore").innerHTML = `Your score: ${this.score}`;
|
document.getElementById("endScore").innerHTML = `Your score: ${this.score}`;
|
||||||
document.getElementById("startButton").textContent = "Play again";
|
|
||||||
this.menuBox.display = "flex";
|
this.menuBox.display = "flex";
|
||||||
this.isActive = false;
|
this.isActive = false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue