commit
ef4f0e8127
16 changed files with 1121 additions and 0 deletions
@ -0,0 +1,2 @@ |
||||
.idea |
||||
|
@ -0,0 +1,6 @@ |
||||
{ |
||||
"display_name": "Rubiks Cube", |
||||
"info_text": "The 3x3 Rubiks Cube in 3D", |
||||
"visible": true, |
||||
"tags": ["Tool", "Game"] |
||||
} |
After Width: | Height: | Size: 318 B |
@ -0,0 +1,272 @@ |
||||
"use strict" |
||||
|
||||
class Cube{ |
||||
|
||||
constructor(){ |
||||
this.bricks = []; |
||||
for (let x = -1; x < 2; x++){ |
||||
for (let y = -1; y < 2; y++){ |
||||
for (let z = -1; z < 2; z++){ |
||||
this.bricks.push(new Brick(x, y, z)); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
show(){ |
||||
push(); |
||||
if (this.rotation){ |
||||
|
||||
for (let i = -1; i < 2; i++){ |
||||
if (i === this.rotation.index){ |
||||
push(); |
||||
eval("rotate" + this.rotation.axis.toUpperCase() + "(this.rotation.angle);"); |
||||
for (let b of this.getLayer(this.rotation.axis, i)) b.show(); |
||||
pop(); |
||||
} |
||||
else { |
||||
for (let b of this.getLayer(this.rotation.axis, i)) b.show(); |
||||
} |
||||
} |
||||
} |
||||
else { |
||||
for (let b of this.bricks) b.show(); |
||||
} |
||||
pop(); |
||||
} |
||||
|
||||
update(){ |
||||
if (this.rotation) this.rotation.update(); |
||||
} |
||||
|
||||
updatePos(){ |
||||
let m = new Matrix(); |
||||
m.rotate(this.rotation.angle); |
||||
let o = other(this.rotation.axis), |
||||
bricks = [], |
||||
fields = [], |
||||
resultBricks = [], iBricks = 0, pBricks, |
||||
resultFields = [], iFields = 0, pFields; |
||||
|
||||
for (let b of this.getLayer(this.rotation.axis, this.rotation.index)){ |
||||
eval("bricks.push({x: b.pos." + o[0] + ", y: b.pos." + o[1] + "});"); |
||||
for (let f of b.fields){ |
||||
for (let p of f.points){ |
||||
eval("fields.push({x: p." + o[0] + ", y: p." + o[1] + "});"); |
||||
} |
||||
} |
||||
} |
||||
// transform points
|
||||
while(pBricks = bricks[iBricks++]) resultBricks.push(m.applyToPoint(pBricks)); |
||||
while(pFields = fields[iFields++]) resultFields.push(m.applyToPoint(pFields)); |
||||
|
||||
iBricks = 0, iFields = 0; |
||||
|
||||
for (let b of this.getLayer(this.rotation.axis, this.rotation.index)){ |
||||
let p = resultBricks[iBricks]; |
||||
eval("b.pos." + o[0] + " = p.x;"); |
||||
eval("b.pos." + o[1] + " = p.y;"); |
||||
iBricks++; |
||||
for (let f of b.fields){ |
||||
for (let pt of f.points){ |
||||
let pf = resultFields[iFields]; |
||||
eval("pt." + o[0] + " = pf.x;"); |
||||
eval("pt." + o[1] + " = pf.y;"); |
||||
iFields++; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
getLayer(axis, index){ |
||||
let bricks = []; |
||||
for (let b of this.bricks){ |
||||
if (eval("b.pos." + axis) === index){ |
||||
bricks.push(b); |
||||
} |
||||
} |
||||
return bricks; |
||||
} |
||||
|
||||
rotate(axis, index, dir, v){ |
||||
if (!this.rotation) |
||||
this.rotation = new Rotation(axis, index, dir, v, () => { |
||||
cube.updatePos(); |
||||
cube.rotation = null; |
||||
}); |
||||
} |
||||
|
||||
scramble(count){ |
||||
let cube = this; |
||||
if (count === 0) |
||||
this.rotation = null; |
||||
else |
||||
this.rotation = new Rotation(random(["x", "y", "z"]), random([-1, 1]), random([-1, 1]), PI / 32, () => { |
||||
cube.updatePos(); |
||||
cube.scramble(count - 1); |
||||
}); |
||||
} |
||||
|
||||
} |
||||
|
||||
function other(axis){ |
||||
switch(axis){ |
||||
case "x": |
||||
return ["y", "z"]; |
||||
case "y": |
||||
return ["z", "x"]; |
||||
case "z": |
||||
return ["x", "y"]; |
||||
} |
||||
} |
||||
|
||||
class Brick{ |
||||
|
||||
constructor(x, y, z){ |
||||
this.pos = createVector(x, y, z); |
||||
this.size = 85; |
||||
this.createFields(); |
||||
} |
||||
|
||||
show(){ |
||||
this.pos.mult(this.size); |
||||
push(); |
||||
translate(this.pos.x, this.pos.y, this.pos.z); |
||||
for (let f of this.fields) f.show(); |
||||
pop(); |
||||
this.pos.div(this.size); |
||||
} |
||||
|
||||
createFields(){ |
||||
this.fields = []; |
||||
|
||||
let sides = [[],[],[],[],[],[]]; |
||||
let c = [ |
||||
"#F00", |
||||
"#F90", |
||||
"#FFF", |
||||
"#FF0", |
||||
"#00F", |
||||
"#0F0", |
||||
"#000" |
||||
]; |
||||
for (let x = -1; x < 2; x++){ |
||||
for (let y = -1; y < 2; y++){ |
||||
for (let z = -1; z < 2; z++){ |
||||
let arr = []; |
||||
if (x > 0 && y && z){ |
||||
if (this.pos.x > 0) arr.push({i: 0, colored: true}); |
||||
else arr.push({i: 0}); |
||||
} |
||||
if (x < 0 && y && z){ |
||||
if (this.pos.x < 0) arr.push({i: 1, colored: true}); |
||||
else arr.push({i: 1}); |
||||
} |
||||
if (y > 0 && x && z){ |
||||
if (this.pos.y > 0) arr.push({i: 2, colored: true}); |
||||
else arr.push({i: 2}); |
||||
} |
||||
if (y < 0 && x && z){ |
||||
if (this.pos.y < 0) arr.push({i: 3, colored: true}); |
||||
else arr.push({i: 3}); |
||||
} |
||||
if (z > 0 && x && y){ |
||||
if (this.pos.z > 0) arr.push({i: 4, colored: true}); |
||||
else arr.push({i: 4}); |
||||
} |
||||
if (z < 0 && x && y){ |
||||
if (this.pos.z < 0) arr.push({i: 5, colored: true}); |
||||
else arr.push({i: 5}); |
||||
} |
||||
for (let a of arr){ |
||||
sides[a.i].push({p: createVector(x, y, z), colored: a.colored}); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
for (let s of sides){ |
||||
let points = []; |
||||
for (let a of s) points.push(a.p); |
||||
let color = s[0].colored ? c[sides.indexOf(s)] : c[6]; |
||||
this.fields.push(new Field(points, color, this.size)); |
||||
} |
||||
} |
||||
|
||||
hasColor(c){ |
||||
for (let f of this.fields){ |
||||
if (f.colorEquals(c)){ |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
get isEdge(){ |
||||
return this.coloredCount === 2; |
||||
} |
||||
|
||||
get isCorner(){ |
||||
return this.coloredCount === 3; |
||||
} |
||||
|
||||
get isFlat(){ |
||||
return this.coloredCount === 1; |
||||
} |
||||
|
||||
get coloredCount(){ |
||||
let count = 0; |
||||
for (let f of this.fields){ |
||||
if (!f.colorEquals("#000")) { |
||||
count++; |
||||
} |
||||
} |
||||
return count; |
||||
} |
||||
} |
||||
|
||||
class Field{ |
||||
|
||||
constructor(points, c, size){ |
||||
//relative to brick
|
||||
this.color = { |
||||
light: color(c), |
||||
dark: dark(color(c), 0.4) |
||||
}; |
||||
this.bSize = size; |
||||
this.size = size * 0.95; |
||||
this.points = points; |
||||
} |
||||
|
||||
show(){ |
||||
for (let p of this.points) p.mult(this.size / 2); |
||||
let p = this.points; |
||||
|
||||
if (this.dark) fill(this.color.dark); |
||||
else fill(this.color.light); |
||||
strokeWeight(8); |
||||
stroke(0); |
||||
beginShape(); |
||||
vertex(p[0].x, p[0].y, p[0].z); |
||||
vertex(p[2].x, p[2].y, p[2].z); |
||||
vertex(p[3].x, p[3].y, p[3].z); |
||||
vertex(p[1].x, p[1].y, p[1].z); |
||||
endShape(CLOSE); |
||||
|
||||
for (let p of this.points) p.div(this.size / 2); |
||||
} |
||||
|
||||
colorEquals(c){ |
||||
let equal = true; |
||||
for (let i = 0; i < 3; i++){ |
||||
if (this.color.light.levels[i] !== color(c).levels[i]){ |
||||
equal = false; |
||||
} |
||||
} |
||||
return equal; |
||||
} |
||||
|
||||
} |
||||
|
||||
function dark(c, val){ |
||||
return color(red(c) * val, green(c) * val, blue(c) * val); |
||||
} |
@ -0,0 +1,62 @@ |
||||
class Matrix{ |
||||
|
||||
constructor(){ |
||||
this.a = 1; |
||||
this.b = 0; |
||||
this.c = 0; |
||||
this.d = 1; |
||||
this.e = 0; |
||||
this.f = 0; |
||||
} |
||||
|
||||
applyToPoint(p){ |
||||
return { |
||||
x: round(p.x * this.a + p.y * this.c + this.e), |
||||
y: round(p.x * this.b + p.y * this.d + this.f) |
||||
} |
||||
} |
||||
|
||||
transform(a2, b2, c2, d2, e2, f2){ |
||||
var a1 = this.a, |
||||
b1 = this.b, |
||||
c1 = this.c, |
||||
d1 = this.d, |
||||
e1 = this.e, |
||||
f1 = this.f; |
||||
|
||||
this.a = a1 * a2 + c1 * b2; |
||||
this.b = b1 * a2 + d1 * b2; |
||||
this.c = a1 * c2 + c1 * d2; |
||||
this.d = b1 * c2 + d1 * d2; |
||||
this.e = a1 * e2 + c1 * f2 + e1; |
||||
this.f = b1 * e2 + d1 * f2 + f1; |
||||
} |
||||
|
||||
rotate(angle){ |
||||
var cs = cos(angle), |
||||
sn = sin(angle); |
||||
this.transform(cs, sn, -sn, cs, 0, 0); |
||||
} |
||||
} |
||||
|
||||
class Rotation{ |
||||
|
||||
constructor(axis, index, dir, v, finishedCallback){ |
||||
this.axis = axis; |
||||
this.index = index; |
||||
this.dir = dir; |
||||
this.angle = 0; |
||||
this.v = v; |
||||
this.finished = function(){ |
||||
finishedCallback(); |
||||
} |
||||
} |
||||
|
||||
update(){ |
||||
if (abs(this.angle) > PI / 2){ |
||||
this.finished(); |
||||
} |
||||
this.angle += this.v * this.dir; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,35 @@ |
||||
"use strict" |
||||
|
||||
function keyPressed(){ |
||||
|
||||
} |
||||
|
||||
function keyReleased(){ |
||||
|
||||
} |
||||
|
||||
function mouseMoved(){ |
||||
|
||||
} |
||||
|
||||
function mouseDragged(){ |
||||
|
||||
} |
||||
|
||||
function mousePressed(){ |
||||
|
||||
} |
||||
|
||||
function mouseReleased(){ |
||||
|
||||
} |
||||
|
||||
window.onresize = function(){ |
||||
let i = 0; |
||||
function resize(){ |
||||
resizeCanvas($("#canvasHolder").outerWidth(), $("#canvasHolder").outerHeight(), true); |
||||
i++; |
||||
if (i < 5) window.setTimeout(resize, 0); |
||||
} |
||||
resize(); |
||||
} |
@ -0,0 +1,91 @@ |
||||
"use strict" |
||||
|
||||
let debug = false, |
||||
viewPort = {x: 0, y: 0}, |
||||
font; |
||||
|
||||
let cube, |
||||
mode = true; |
||||
|
||||
let oldMouse = {x: 0, y: 0}, |
||||
rotation = {x: -Math.PI / 8, y: -Math.PI / 4}; |
||||
|
||||
function preload(){ |
||||
font = loadFont("data/styles/font.ttf"); |
||||
} |
||||
|
||||
function setup(){ |
||||
canvasSetup(); |
||||
interfaceSetup(); |
||||
cube = new Cube(); |
||||
} |
||||
|
||||
function draw(){ |
||||
myOrbitControl(); |
||||
|
||||
background(65); |
||||
cube.update(); |
||||
cube.show(); |
||||
} |
||||
|
||||
function myOrbitControl(){ |
||||
if (mouseIsPressed){ |
||||
let x = map(mouseY - oldMouse.y, 0, height, 0, TWO_PI), |
||||
y = map(mouseX - oldMouse.x, 0, width, 0, TWO_PI); |
||||
rotation.x -= x; |
||||
rotation.y += y; |
||||
if (abs(rotation.x) > PI / 2){ |
||||
rotation.x += x; |
||||
} |
||||
} |
||||
rotateX(rotation.x); |
||||
rotateY(rotation.y); |
||||
oldMouse.x = mouseX; |
||||
oldMouse.y = mouseY; |
||||
} |
||||
|
||||
function canvasSetup(){ |
||||
setFrameRate(60); |
||||
setAttributes('antialias', true); |
||||
let canvas = createCanvas($("#canvasHolder").width(), $("#canvasHolder").height(), WEBGL); |
||||
canvas.parent("canvasHolder"); |
||||
textFont(font); |
||||
|
||||
} |
||||
|
||||
function interfaceSetup(){ |
||||
|
||||
let buttons = Object.values($("button:not(.actions)")).slice(0, 18); |
||||
|
||||
for (let b of buttons){ |
||||
let axis = $(b).parent().attr("class"); |
||||
let index = (floor(buttons.indexOf(b) / 2) % 3) - 1; |
||||
let dir = int($(b).attr("id")); |
||||
$(b).click(function(){ |
||||
cube.rotate(axis, index, dir, PI / 32); |
||||
}); |
||||
$($("." + axis)[index + 1].children).mouseover(function(){ |
||||
outer: |
||||
for (let b of cube.bricks){ |
||||
for (let lb of cube.getLayer(axis, index)){ |
||||
if (b == lb) continue outer; |
||||
} |
||||
for (let f of b.fields){ |
||||
f.dark = true; |
||||
} |
||||
} |
||||
$($("." + axis)[index + 1].children).css("background-color", "rgb(30, 30, 30)"); |
||||
}); |
||||
$($("." + axis)[index + 1].children).mouseleave(function(){ |
||||
for (let b of cube.bricks){ |
||||
for (let f of b.fields){ |
||||
f.dark = false; |
||||
} |
||||
} |
||||
$($("." + axis)[index + 1].children).css("background-color", "rgb(50, 50, 50)"); |
||||
}); |
||||
} |
||||
|
||||
$($(".actions")[0]).click(function(){cube.scramble(20);}); |
||||
$($(".actions")[1]).click(() => solve()); |
||||
} |
@ -0,0 +1,16 @@ |
||||
function solve(){ |
||||
cross(); |
||||
|
||||
cube = new Cube(); |
||||
} |
||||
|
||||
function cross(){ |
||||
let whiteBricks = cube.bricks.filter(b => b.hasColor("#FFF")); |
||||
let main = whiteBricks.find(b => b.isFlat); |
||||
|
||||
function doByColor(c){ |
||||
|
||||
} |
||||
|
||||
doByColor("#00F"); |
||||
} |
@ -0,0 +1,86 @@ |
||||
{ |
||||
"credits": [ |
||||
{ |
||||
"title": "Electrical Sweep", |
||||
"artist": "Sweeper", |
||||
"link": "https://soundbible.com/1795-Electrical-Sweep.html", |
||||
"license": "Public Domain" |
||||
}, |
||||
{ |
||||
"title": "Jump", |
||||
"artist": "snottyboy", |
||||
"link": "https://soundbible.com/1343-Jump.html", |
||||
"license": "Attribution 3.0" |
||||
}, |
||||
{ |
||||
"title": "boo 01", |
||||
"artist": "tim.kahn", |
||||
"link": "https://freesound.org/people/tim.kahn/sounds/336997/", |
||||
"license": "Attribution 3.0" |
||||
}, |
||||
{ |
||||
"title": "Cheer crowd", |
||||
"artist": "Johanneskristjansson", |
||||
"link": "https://freesound.org/people/Johanneskristjansson/sounds/371339/", |
||||
"license": "Attribution 3.0" |
||||
}, |
||||
{ |
||||
"title": "cheer 01", |
||||
"artist": "tim.kahn", |
||||
"link": "https://freesound.org/people/tim.kahn/sounds/337000/", |
||||
"license": "Attribution 3.0" |
||||
}, |
||||
{ |
||||
"title": "awww 01", |
||||
"artist": "tim.kahn", |
||||
"link": "https://freesound.org/people/tim.kahn/sounds/336998/", |
||||
"license": "Attribution 3.0" |
||||
}, |
||||
{ |
||||
"title": "Evolution", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://www.youtube.com/watch?v=RA6XneJGwfQ", |
||||
"license": "Creative Commons - Attribution" |
||||
}, |
||||
{ |
||||
"title": "Home Improvement", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://youtu.be/NMi9Nrm1Mfs?t=2359", |
||||
"license": "Creative Commons - Attribution" |
||||
}, |
||||
{ |
||||
"title": "Incoherent", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://www.youtube.com/watch?v=bxgzIOS-lSs", |
||||
"license": "Creative Commons - Attribution" |
||||
}, |
||||
{ |
||||
"title": "Cherubs", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://www.youtube.com/watch?v=pzUkoJonpro", |
||||
"license": "Creative Commons - Attribution" |
||||
}, |
||||
{ |
||||
"title": "Let it in", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://www.youtube.com/watch?v=M-GylSik2h8", |
||||
"license": "Creative Commons - Attribution" |
||||
}, |
||||
{ |
||||
"title": "California Lullabye", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://www.youtube.com/watch?v=WmWHcyLsqHQ", |
||||
"license": "Creative Commons - Attribution" |
||||
}, |
||||
{ |
||||
"title": "Memorized", |
||||
"artist": "Josh Woodward", |
||||
"link": "https://www.youtube.com/watch?v=2eFKOxfUYwE", |
||||
"license": "Creative Commons - Attribution" |
||||
} |
||||
] |
||||
} |
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,200 @@ |
||||
{ |
||||
"colors": { |
||||
"background": { |
||||
"mountains": { |
||||
"stroke": "rgb(0, 0, 0)", |
||||
"fill": "rgb(60, 60, 60)" |
||||
}, |
||||
"ground": "rgb(40, 100, 30)", |
||||
"sky":"rgb(110, 130, 230)" |
||||
}, |
||||
"map": { |
||||
"background": { |
||||
"stroke": "rgb(0, 0, 0)", |
||||
"fill": "rgb(90, 110, 210)" |
||||
} |
||||
}, |
||||
"player": { |
||||
"body": "hsb(0, 100%, 100%)", |
||||
"eyes": { |
||||
"inner": "rgb(0, 0, 0)" , |
||||
"outer": "rgb(255, 255, 255)" |
||||
} |
||||
}, |
||||
"goal": { |
||||
"main": "#473115", |
||||
"roof": "#32210b", |
||||
"hole": "#14100b" |
||||
}, |
||||
"brick": { |
||||
"earth": "rgb(81, 54, 37)", |
||||
"ground": "rgb(40, 150, 20)", |
||||
"grass": "#2c8300", |
||||
"flower": { |
||||
"center": "hsb(0, 100%, 100%)", |
||||
"petal": "hsb(0, 100%, 100%)", |
||||
"haulm": "#2c8300" |
||||
}, |
||||
"tree": { |
||||
"leaf": "hsb(110, 100%, 50%)", |
||||
"wood": "hsb(32, 100%, 25%)" |
||||
}, |
||||
"coin": { |
||||
"fill": "hsb(0, 100%, 100%)", |
||||
"stroke": "hsb(0, 100%, 100%)" |
||||
} |
||||
}, |
||||
"loader": { |
||||
"background": "#3c598d", |
||||
"start": "hsb(120, 100%, 30%)", |
||||
"finished": "#00d3db", |
||||
"spinner": "#00d3db", |
||||
"text": { |
||||
"fill": "rgb(0, 0, 0)", |
||||
"stroke": "#00d3db" |
||||
} |
||||
} |
||||
}, |
||||
|
||||
"messages": { |
||||
"won": { |
||||
"html": "<p>You won the game! :D Wanna start another?</p>", |
||||
"styles": { |
||||
"border-color": "rgb(30, 120, 30)", |
||||
"height": "auto" |
||||
}, |
||||
"buttons": [ |
||||
{ |
||||
"text": "Restart", |
||||
"styles": { |
||||
"background-color": "rgb(60, 160, 60)" |
||||
}, |
||||
"onclick": "game.restart();" |
||||
}, |
||||
{ |
||||
"text": "New Game", |
||||
"styles": { |
||||
"background-color": "rgb(60, 160, 60)" |
||||
}, |
||||
"onclick": "loadNewGame();" |
||||
}, |
||||
{ |
||||
"text": "Continue", |
||||
"styles": { |
||||
"background-color": "rgb(60, 160, 60)" |
||||
}, |
||||
"onclick": "game.resume()" |
||||
} |
||||
] |
||||
}, |
||||
"lost": { |
||||
"html": "<p>Oh no, you fell out of the world!</p>", |
||||
"styles": { |
||||
"border-color": "rgb(160, 30, 30)", |
||||
"height": "auto" |
||||
}, |
||||
"buttons": [ |
||||
{ |
||||
"text": "Restart", |
||||
"styles": { |
||||
"background-color": "rgb(160, 60, 60)" |
||||
}, |
||||
"onclick": "game.restart();" |
||||
} |
||||
] |
||||
|
||||
}, |
||||
"newGame": { |
||||
"html": "<p>Are you sure you wanna start a new one?</p>", |
||||
"styles": { |
||||
"border-color": "rgb(70, 70, 20)", |
||||
"height": "auto" |
||||
}, |
||||
"buttons": [ |
||||
{ |
||||
"text": "New Game", |
||||
"styles": { |
||||
"background-color": "rgb(60, 160, 60)" |
||||
}, |
||||
"onclick": "loadNewGame();" |
||||
}, |
||||
{ |
||||
"text": "Cancel", |
||||
"styles": { |
||||
"background-color": "rgb(160, 60, 60)" |
||||
}, |
||||
"onclick": "game.resume();" |
||||
} |
||||
] |
||||
}, |
||||
"credits": { |
||||
"html": "", |
||||
"styles": { |
||||
"border-color": "rgb(0, 37, 160)", |
||||
"background-color": "rgb(83, 61, 255)", |
||||
"height": "auto" |
||||
}, |
||||
"buttons": [ |
||||
{ |
||||
"text": "Continue", |
||||
"styles": { |
||||
"background-color": "rgb(60, 160, 60)" |
||||
}, |
||||
"onclick": "game.resume()" |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
|
||||
"audio": { |
||||
"sound": { |
||||
"won": [ |
||||
"data/audio/sound/cheer0.mp3", |
||||
"data/audio/sound/cheer1.wav", |
||||
"data/audio/sound/cheer2.wav", |
||||
"data/audio/sound/cheer3.wav" |
||||
], |
||||
"lost": [ |
||||
"data/audio/sound/boo0.wav", |
||||
"data/audio/sound/aww0.wav", |
||||
"data/audio/sound/aww1.wav" |
||||
], |
||||
"jump": [ |
||||
"data/audio/sound/jump.mp3" |
||||
], |
||||
"coin": [ |
||||
"data/audio/sound/electrical_sweep.mp3" |
||||
] |
||||
}, |
||||
"music":{ |
||||
"game": [ |
||||
"data/audio/music/background0.mp3", |
||||
"data/audio/music/background1.mp3", |
||||
"data/audio/music/background2.mp3", |
||||
"data/audio/music/background3.mp3", |
||||
"data/audio/music/background4.mp3", |
||||
"data/audio/music/background5.mp3", |
||||
"data/audio/music/background6.mp3", |
||||
"data/audio/music/background7.mp3", |
||||
"data/audio/music/background8.mp3" |
||||
] |
||||
} |
||||
}, |
||||
|
||||
"values": { |
||||
"minBrickWidth": "200", |
||||
"maxBrickWidth": "800", |
||||
"backgroundMoveScale": "500", |
||||
"minWorldSize": "30000", |
||||
"maxWorldSize": "35000", |
||||
"maxMapSize": "300", |
||||
"coinSize": "50", |
||||
"coinRarity": "20", |
||||
"coinDispoY": "10", |
||||
"loadedWaitTime": "1000", |
||||
"cursorTimeLimit": "1000", |
||||
"menuAnimationTime": "200", |
||||
"openerAnimationTime": "200" |
||||
} |
||||
} |
||||
|
@ -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; |
||||
} |
Binary file not shown.
@ -0,0 +1,88 @@ |
||||
input[type=range] { |
||||
-webkit-appearance: none; |
||||
margin: 18px 0; |
||||
width: 100%; |
||||
} |
||||
input[type=range]:focus { |
||||
outline: none; |
||||
} |
||||
input[type=range]::-webkit-slider-runnable-track { |
||||
width: 100%; |
||||
height: 8.4px; |
||||
cursor: pointer; |
||||
animate: 0.2s; |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
background: #3071a9; |
||||
border-radius: 1.3px; |
||||
border: 0.2px solid #010101; |
||||
} |
||||
input[type=range]::-webkit-slider-thumb { |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
border: 1px solid #000000; |
||||
height: 36px; |
||||
width: 16px; |
||||
border-radius: 3px; |
||||
background: #ffffff; |
||||
cursor: pointer; |
||||
-webkit-appearance: none; |
||||
margin-top: -14px; |
||||
} |
||||
input[type=range]:focus::-webkit-slider-runnable-track { |
||||
background: #367ebd; |
||||
} |
||||
input[type=range]::-moz-range-track { |
||||
width: 100%; |
||||
height: 8.4px; |
||||
cursor: pointer; |
||||
animate: 0.2s; |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
background: #3071a9; |
||||
border-radius: 1.3px; |
||||
border: 0.2px solid #010101; |
||||
} |
||||
input[type=range]::-moz-range-thumb { |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
border: 1px solid #000000; |
||||
height: 36px; |
||||
width: 16px; |
||||
border-radius: 3px; |
||||
background: #ffffff; |
||||
cursor: pointer; |
||||
} |
||||
input[type=range]::-ms-track { |
||||
width: 100%; |
||||
height: 8.4px; |
||||
cursor: pointer; |
||||
animate: 0.2s; |
||||
background: transparent; |
||||
border-color: transparent; |
||||
border-width: 16px 0; |
||||
color: transparent; |
||||
} |
||||
input[type=range]::-ms-fill-lower { |
||||
background: #2a6495; |
||||
border: 0.2px solid #010101; |
||||
border-radius: 2.6px; |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
} |
||||
input[type=range]::-ms-fill-upper { |
||||
background: #3071a9; |
||||
border: 0.2px solid #010101; |
||||
border-radius: 2.6px; |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
} |
||||
input[type=range]::-ms-thumb { |
||||
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; |
||||
border: 1px solid #000000; |
||||
height: 36px; |
||||
width: 16px; |
||||
border-radius: 3px; |
||||
background: #ffffff; |
||||
cursor: pointer; |
||||
} |
||||
input[type=range]:focus::-ms-fill-lower { |
||||
background: #3071a9; |
||||
} |
||||
input[type=range]:focus::-ms-fill-upper { |
||||
background: #367ebd; |
||||
} |
@ -0,0 +1,73 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.min.js" type="text/javascript"></script> |
||||
<script src="https://code.jquery.com/jquery-3.6.4.min.js" type="text/javascript"></script> |
||||
<script src="data/scripts/events.js" type="text/javascript"></script> |
||||
<script src="data/scripts/sketch.js" type="text/javascript"></script> |
||||
<script src="data/scripts/Cube.js" type="text/javascript"></script> |
||||
<script src="data/scripts/Matrix.js" type="text/javascript"></script> |
||||
<script src="data/scripts/solve.js" type="text/javascript"></script> |
||||
<link href="styles.css" rel="stylesheet"> |
||||
<link href="data/styles/color_picker.css" rel="stylesheet"> |
||||
<link href="data/styles/range_input.css" rel="stylesheet"> |
||||
<link href="data/images/favicon.ico" rel="icon" type="image/x-icon"> |
||||
<title>Rubiks Cube</title> |
||||
</head> |
||||
<body> |
||||
<div id="p5_loading"></div> |
||||
<div id="content"> |
||||
<div id="interface"> |
||||
<div class="x"> |
||||
<button id="-1">L</button> |
||||
<div class="label">X-1</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="x"> |
||||
<button id="-1">L</button> |
||||
<div class="label">X-2</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="x"> |
||||
<button id="-1">L</button> |
||||
<div class="label">X-3</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="y"> |
||||
<button id="-1">L</button> |
||||
<div class="label">Y-1</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="y"> |
||||
<button id="-1">L</button> |
||||
<div class="label">Y-2</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="y"> |
||||
<button id="-1">L</button> |
||||
<div class="label">Y-3</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="z"> |
||||
<button id="-1">L</button> |
||||
<div class="label">Z-1</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="z"> |
||||
<button id="-1">L</button> |
||||
<div class="label">Z-2</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
<div class="z"> |
||||
<button id="-1">L</button> |
||||
<div class="label">Z-3</div> |
||||
<button id="1">R</button> |
||||
</div> |
||||
</div> |
||||
<div id="canvasHolder"></div> |
||||
</div> |
||||
<button class="actions">Scramble</button> |
||||
<button class="actions">Solve</button> |
||||
</body> |
||||
</html> |
@ -0,0 +1,102 @@ |
||||
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: #888; |
||||
font-size: 25px; |
||||
} |
||||
|
||||
:root{ |
||||
--iw: 200px; |
||||
--cw: 750px; |
||||
} |
||||
|
||||
body{ |
||||
background-color: rgb(40, 40, 40); |
||||
text-align: center; |
||||
} |
||||
|
||||
#content{ |
||||
width: calc(var(--iw) + var(--cw)); |
||||
height: 750px; |
||||
position: absolute; |
||||
top: 0; |
||||
bottom: 0; |
||||
left: 0; |
||||
right: 0; |
||||
margin: auto; |
||||
} |
||||
|
||||
#interface{ |
||||
float: left; |
||||
width: var(--iw); |
||||
height: 750px; |
||||
text-align: center; |
||||
} |
||||
|
||||
#canvasHolder{ |
||||
float: left; |
||||
width: 750px; |
||||
height: 750px; |
||||
|
||||
} |
||||
|
||||
#canvasHolder canvas{ |
||||
border-radius: 30px; |
||||
box-shadow: 10px 10px 15px #000; |
||||
border: 5px solid #000; |
||||
} |
||||
|
||||
.x, .y, .z{ |
||||
height: 60px; |
||||
margin-top: calc((750px - 9 * 60px) / 10); |
||||
} |
||||
|
||||
button:not(.actions){ |
||||
float: left; |
||||
width: 30%; |
||||
height: 100%; |
||||
background-color: rgb(50, 50, 50); |
||||
border-color: rgb(50, 50, 50); |
||||
border: 3px solid #000; |
||||
} |
||||
|
||||
button:first-child:not(.actions){ |
||||
margin-left: 4%; |
||||
border-radius: calc(var(--iw) / 20) 0px 0px calc(var(--iw) / 20); |
||||
border-right: none; |
||||
} |
||||
|
||||
button:last-child:not(.actions){ |
||||
margin-right: 4%; |
||||
border-radius: 0px calc(var(--iw) / 20) calc(var(--iw) / 20) 0px; |
||||
border-left: none; |
||||
} |
||||
|
||||
.label{ |
||||
float: left; |
||||
width: 30%; |
||||
height: 90%; |
||||
background-color: rgb(50, 50, 50); |
||||
border-bottom: 3px solid #000; |
||||
border-top: 3px solid #000; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.actions{ |
||||
margin: 30px; |
||||
background-color: rgb(30, 30, 30); |
||||
border-radius: 10px; |
||||
border: 3px solid #000; |
||||
} |
After Width: | Height: | Size: 104 KiB |
Loading…
Reference in new issue