From cae09d450ddbfc8eab73b07dd29e062e77d7a8a2 Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Mon, 27 Mar 2023 18:43:53 +0200 Subject: [PATCH] Init --- .gitignore | 2 + project.json | 6 ++ public/data/images/favicon.ico | Bin 0 -> 318 bytes public/data/scripts/events.js | 30 ++++++++++ public/data/scripts/flower.js | 70 ++++++++++++++++++++++ public/data/scripts/heart.js | 42 +++++++++++++ public/data/scripts/init.js | 71 ++++++++++++++++++++++ public/data/scripts/online.js | 48 +++++++++++++++ public/data/settings/libraries.json | 8 +++ public/data/settings/settings.json | 3 + public/data/styles/color_picker.css | 88 ++++++++++++++++++++++++++++ public/data/styles/font.ttf | Bin 0 -> 30420 bytes public/data/styles/range_input.css | 88 ++++++++++++++++++++++++++++ public/index.html | 23 ++++++++ public/styles.css | 49 ++++++++++++++++ public/thumbnail.png | Bin 0 -> 20237 bytes 16 files changed, 528 insertions(+) create mode 100644 .gitignore create mode 100644 project.json create mode 100644 public/data/images/favicon.ico create mode 100644 public/data/scripts/events.js create mode 100644 public/data/scripts/flower.js create mode 100644 public/data/scripts/heart.js create mode 100644 public/data/scripts/init.js create mode 100644 public/data/scripts/online.js create mode 100644 public/data/settings/libraries.json create mode 100644 public/data/settings/settings.json create mode 100644 public/data/styles/color_picker.css create mode 100644 public/data/styles/font.ttf create mode 100644 public/data/styles/range_input.css create mode 100644 public/index.html create mode 100644 public/styles.css create mode 100644 public/thumbnail.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c6ef218 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea + diff --git a/project.json b/project.json new file mode 100644 index 0000000..ea51a50 --- /dev/null +++ b/project.json @@ -0,0 +1,6 @@ +{ + "display_name": "Valentine Present ♥", + "info_text": "For Selina", + "visible": true, + "tags": ["Tool", "Game"] +} \ No newline at end of file diff --git a/public/data/images/favicon.ico b/public/data/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3172667d2925fa58eae7e1b1767b3ef11fd8a37d GIT binary patch literal 318 zcmbtPISzm@408$tW3n(;o%&2Z!e96lGuRxJU_-b{+&XoX0LJ6)%sr|BBY?_qMrKGC zrX!z8wT5*7=B+({UrNd9k;oR|sc?pfNL0=7}mX3RI=dX}Q F-W`Jp3Z(!5 literal 0 HcmV?d00001 diff --git a/public/data/scripts/events.js b/public/data/scripts/events.js new file mode 100644 index 0000000..d55ef3d --- /dev/null +++ b/public/data/scripts/events.js @@ -0,0 +1,30 @@ +'use strict'; + +function keyPressed(){ + +} + +function keyReleased(){ + +} + +function mouseMoved(){ + +} + +function mouseDragged(){ + +} + +function mousePressed(){ + if (ranBool()){ + flowers.push(new Flower(mouseX, mouseY)); + } else { + hearts.push(new Heart(mouseX, mouseY)); + } + +} + +function mouseReleased(){ + +} \ No newline at end of file diff --git a/public/data/scripts/flower.js b/public/data/scripts/flower.js new file mode 100644 index 0000000..fa6c490 --- /dev/null +++ b/public/data/scripts/flower.js @@ -0,0 +1,70 @@ +class Flower{ + + constructor(x, y){ + this.pos = createVector(x, y); + this.rotation = 0; + this.rotateSpeed = random(PI / 1024, PI / 512) * random([-1, 1]); + this.leafCount = 16; + this.leafs = []; + this.radius = random(20, 200); + } + + update(){ + + this.rotation += this.rotateSpeed; + this.newLeaf = frameCount % 5 == 0; + if (this.leafs.length < this.leafCount && this.newLeaf){ + this.leafs.push(new Leaf(this.radius)); + this.newLeaf = false; + } + for (let l of this.leafs){ + l.update(); + } + } + + show(){ + + push(); + translate(this.pos.x, this.pos.y); + rotate(this.rotation); + for (let i = 0; i < this.leafs.length; i++){ + let l = this.leafs[i]; + + let angle = i / this.leafCount * TWO_PI; + l.show(angle); + } + pop(); + } + +} + +class Leaf{ + + constructor(radius){ + this.width = radius; + this.alpha = 0; + } + + update(){ + if (this.alpha < 0.6) this.alpha += 0.01; + } + + show(angle){ + push(); + noStroke(); + rotate(angle); + let hue = int(angle / TWO_PI * 360); + let c = color('hsba(' + hue + ', 100%, 100%, ' + this.alpha + ')'); + fill(c); + beginShape(); + for (let x = 0; x < this.width; x++){ + vertex(x, sin(x * TWO_PI / (this.width * 2)) * this.width / 5); + } + for (let x = this.width; x >= 0; x--){ + vertex(x, sin(x * TWO_PI / (this.width * 2)) * -this.width / 5); + } + endShape(); + pop(); + } + +} \ No newline at end of file diff --git a/public/data/scripts/heart.js b/public/data/scripts/heart.js new file mode 100644 index 0000000..c5ecdb4 --- /dev/null +++ b/public/data/scripts/heart.js @@ -0,0 +1,42 @@ +class Heart{ + + constructor(x, y){ + this.pos = createVector(x, y); + this.pulse = 0; + this.size = random(50, 200); + } + + update(){ + this.pulse += 0.1; + this.pulseValue = 1 + 0.03 * sin(this.pulse); + } + + show(){ + + function heart(x, size){ + return size * sqrt(1 - abs(x) / size); + } + + push(); + translate(this.pos.x, this.pos.y); + scale(this.pulseValue); + fill(255, 0, 0, 80); + noStroke(); + + arc(this.size / 4, 0, this.size / 2, this.size / 2, PI, TWO_PI); + arc(-this.size / 4, 0, this.size / 2, this.size / 2, PI, TWO_PI); + + beginShape(); + vertex(-this.size / 2, 0); + + for (let x = -this.size / 2; x < this.size / 2; x++){ + vertex(x, heart(x, this.size / 2)); + } + + vertex(this.size / 2, 0); + endShape(); + + pop(); + } + +} \ No newline at end of file diff --git a/public/data/scripts/init.js b/public/data/scripts/init.js new file mode 100644 index 0000000..b2dc1f1 --- /dev/null +++ b/public/data/scripts/init.js @@ -0,0 +1,71 @@ +'use strict'; + +let projectName = "project_pattern"; + +let debug = false, + viewPort = {x: 0, y: 0}, + font, + settings, + loader; + +//Only for online games +let socket; + +let flowers = [], + hearts = []; + +function preload(){ + loadJSON('data/settings/libraries.json', json => loadScripts(json)); + loadJSON('data/settings/settings.json', json => settings = json); + loadFont('data/styles/font.ttf', f => font = f); +} + +function setup(){ + canvasSetup(); + interfaceSetup(); +} + +function draw(){ + + background(10); + + for (let flower of flowers){ + flower.update(); + flower.show(); + } + + for (let heart of hearts){ + heart.update(); + heart.show(); + } + + if (loader){ + loader.update(); + loader.display(); + } + + if (debug) debugInformation(); +} + +function canvasSetup(){ + setFrameRate(60); + let w = window.innerWidth, + h = window.innerHeight; + let canvas = createCanvas(w, h); + canvas.parent('canvas-holder'); + textFont(font); +} + +function interfaceSetup(){ + +} + +function loadScripts(libs){ + for (let script in libs){ + if (libs[script]){ + let url = location.protocol + '//' + location.host + '/lib/benjocraeft/' + script + '.js'; + console.log(url); + $.getScript(url); + } + } +} \ No newline at end of file diff --git a/public/data/scripts/online.js b/public/data/scripts/online.js new file mode 100644 index 0000000..581e750 --- /dev/null +++ b/public/data/scripts/online.js @@ -0,0 +1,48 @@ +'use strict'; + +function socketConnect(){ + socket = io("https://" + window.location.hostname + "?game=" + projectName); +} + +function createLobby(dom){ + if (inputIsValid('create')){ + onlineRequestFrontend(dom); + //TODO + } +} + +function joinLobby(dom){ + if (inputIsValid('join')){ + onlineRequestFrontend(dom); + //TODO + } +} + +function onlineRequestFrontend(dom){ + $(dom).blur(); + $(dom).attr('disabled', 'disabled'); + if (loader) loader.destroy(); + loader = new Loader($('#loader').get(0)); +} + +function inputIsValid(type){ + let valid = true; + $('.error-label').html(''); + if (type === 'create'){ + if ($('#player-name > input').val() === ''){ + valid = false; + $('#player-name > .error-label').html('Please enter a name!'); + } + } + if (type === 'join'){ + if ($('#player-name > input').val() === ''){ + valid = false; + $('#player-name > .error-label').html('Please enter a name!'); + } + if ($('#lobby-code > input').val() === ''){ + valid = false; + $('#lobby-code > .error-label').html('Please enter your code!'); + } + } + return valid; +} \ No newline at end of file diff --git a/public/data/settings/libraries.json b/public/data/settings/libraries.json new file mode 100644 index 0000000..1264577 --- /dev/null +++ b/public/data/settings/libraries.json @@ -0,0 +1,8 @@ +{ + "collision": false, + "colorPicker": false, + "cookie": true, + "loader": true, + "prototypes": true, + "technical": true +} \ No newline at end of file diff --git a/public/data/settings/settings.json b/public/data/settings/settings.json new file mode 100644 index 0000000..544b7b4 --- /dev/null +++ b/public/data/settings/settings.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/public/data/styles/color_picker.css b/public/data/styles/color_picker.css new file mode 100644 index 0000000..a5b510e --- /dev/null +++ b/public/data/styles/color_picker.css @@ -0,0 +1,88 @@ +#color_picker{ + width: 300px; + height: 25%; + margin: 20px; + margin-top: 50px; + border: 5px solid #000; + background-color: #000; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + position: relative; +} +#color_picker_numeric{ + width: 80%; + padding: 5%; + margin: 5%; + background-color: #888; + border-radius: 10px; + overflow: hidden; +} +.color_picker_rgb{ + float: left; + width: 22%; + height: 35px; + font-size: 25px; + color: #000; +} +.color_picker_rgb:nth-child(1){ + margin-right: 10%; + margin-left: 3%; + background-color: #F00; + +} +.color_picker_rgb:nth-child(2){ + background-color: #0F0; +} +.color_picker_rgb:nth-child(3){ + margin-left: 10%; + background-color: #00F; + color: #FFF; +} +#color_picker_hex{ + width: 50%; + height: 30px; + font-size: 25px; + margin: 10% 25% 0 25%; +} +#saturation{ + position: relative; + width: calc(100% - 33px); + height: 100%; + background: linear-gradient(to right, #FFF 0%, #F00 100%); + float: left; + margin-right: 6px; +} +#value { + width: 100%; + height: 100%; + background: linear-gradient(to top, #000 0%, rgba(255,255,255,0) 100%); +} +#sb_picker{ + border: 2px solid; + border-color: #FFF; + position: absolute; + width: 14px; + height: 14px; + border-radius: 10px; + bottom: 50px; + left: 50px; + box-sizing: border-box; + z-index: 10; +} +#hue { + width: 27px; + height: 100%; + position: relative; + float: left; + background: linear-gradient(to bottom, #F00 0%, #F0F 17%, #00F 34%, #0FF 50%, #0F0 67%, #FF0 84%, #F00 100%); +} +#hue_picker { + position: absolute; + background: #000; + border-bottom: 1px solid #000; + top: 0; + width: 27px; + height: 2px; +} \ No newline at end of file diff --git a/public/data/styles/font.ttf b/public/data/styles/font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..199cf40be5021f3ef8132d1400e3b7eb4614e511 GIT binary patch literal 30420 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 + + + + + + + + + + + + + + I love you ♥ + + +
+
+
+
+ + \ No newline at end of file diff --git a/public/styles.css b/public/styles.css new file mode 100644 index 0000000..8308fb6 --- /dev/null +++ b/public/styles.css @@ -0,0 +1,49 @@ +a:link, a:hover, a:active, a:visited{color: #000;} + +html, body{margin: 0; padding: 0; height: 100%; width: 100%;} + +canvas{margin: 0; padding: 0; border: none; display: block;} + +button:hover{cursor: pointer;} + +@font-face{ + font-family: "Rametto"; + src: url("data/styles/font.ttf"); +} + +*{ + font-family: "Rametto"; + color: #000; + font-size: 17px; +} + +:root{ + --width: 100vw; + --height: 100vh; +} + +body{ + overflow: hidden; +} + +/** + * Standard styles + */ + +#canvas-holder{ + position: relative; + width: var(--width); + height: var(--height); +} +#canvas-holder canvas{ + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: inherit; +} +#p5_loading{ + display: none; +} + diff --git a/public/thumbnail.png b/public/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a24ae66ef2fdb2ad4f2410beeb4485184861f0aa GIT binary patch literal 20237 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