From 24530a037026dca88ab6b3c44be64ec7d646d3d7 Mon Sep 17 00:00:00 2001 From: rsninja722 Date: Fri, 17 Apr 2020 14:13:25 -0400 Subject: [PATCH] setup --- README.md | 4 +- index.html | 25 ++ pixelmix.ttf | Bin 0 -> 22184 bytes scripts/game.js | 1063 ++++++++++++++++++++++++++++++++++++++++++++++ scripts/index.js | 29 ++ 5 files changed, 1120 insertions(+), 1 deletion(-) create mode 100644 index.html create mode 100644 pixelmix.ttf create mode 100644 scripts/game.js create mode 100644 scripts/index.js diff --git a/README.md b/README.md index 2c1ed27..0c2bc89 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -# LudemDare46 \ No newline at end of file +# LudumDare46 + +entry for ludum dare 46 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..09bb064 --- /dev/null +++ b/index.html @@ -0,0 +1,25 @@ + + + + + title + + + + + + + + \ No newline at end of file diff --git a/pixelmix.ttf b/pixelmix.ttf new file mode 100644 index 0000000000000000000000000000000000000000..03e1a25b285de8ea62b46911326b2f4f549c759e GIT binary patch literal 22184 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 literal 0 HcmV?d00001 diff --git a/scripts/game.js b/scripts/game.js new file mode 100644 index 0000000..e9c1394 --- /dev/null +++ b/scripts/game.js @@ -0,0 +1,1063 @@ +function createCanvas(id) { + var tempCanvas = document.createElement("canvas"); + tempCanvas.id = id; + tempCanvas.width = canvases.cvs.width; + tempCanvas.height = canvases.cvs.height; + tempCanvas.style = "image-rendering:pixelated;image-rendering: crisp-edges;display:none";//display:none; + + document.body.appendChild(tempCanvas); + + canvases[`${id}cvs`] = document.getElementById(id); + canvases[`${id}ctx`] = canvases[`${id}cvs`].getContext("2d"); +} + +function startLoops() { + try {draw} catch (err){console.warn(bug+" no draw function found");return null;} + try {update} catch (err){console.warn(bug+" no update function found");return null;} + try {input} catch (err){seperateInputLoop=false;} + onAssetsLoaded(); + + requestAnimationFrame(drawLoop); + setInterval(updateLoop,1000/updateFPS); + + if(seperateInputLoop) { + setInterval(inputLoop,4); + } +} + +function mousePosition() { + if(drawMode===0) { + return {x:(mousePos.x)-camera.x,y:(mousePos.y)-camera.y}; + } else if(drawMode===1) { + var xoff = canvases.cvs.width/2; + var yoff = canvases.cvs.height/2; + return {x:((mousePos.x-xoff)/camera.zoom+xoff)-camera.x,y:((mousePos.y-yoff)/camera.zoom+yoff)-camera.y}; + } else { + var xoff = canvases.cvs.width/2; + var yoff = canvases.cvs.height/2; + var tempPos = {x:((mousePos.x-xoff)/camera.zoom+xoff)-camera.x,y:((mousePos.y-yoff)/camera.zoom+yoff)-camera.y}; + + var center = {x:-camera.x + cw/2, y:-camera.y + ch/2}; + var tempAngle = pointTo(center,tempPos) - camera.angle; + var tempDist = dist(center,tempPos); + + return {x:center.x + (Math.cos(tempAngle) * tempDist),y:center.y + (Math.sin(tempAngle) * tempDist)} + } +} + +function addStyle() { + var tempStyle = document.createElement("style"); + tempStyle.id="gamejsstyle"; + document.head.appendChild(tempStyle); + var tempMeta = document.createElement("meta"); + tempMeta.setAttribute("charset","utf-8"); + document.head.appendChild(tempMeta); +} + +function rand(min,max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +function radToDeg(rad) {return rad / Math.PI * 180;} +function degToRad(deg) {return deg * Math.PI / 180;} + +function velocity(angle) { + return {x:Math.sin(angle),y:Math.cos(angle)}; +} + +function pointTo(point,targetPoint) { + var adjacent = (targetPoint.x - point.x); + var opposite = (targetPoint.y - point.y); + var h = Math.atan2(opposite, adjacent); + return h; +} + +function loadImagesAndSounds() { + var curpath=""; + context = new AudioContext(); + sfxVolumeNode = context.createGain(); + sfxVolumeNode.connect(context.destination); + bmgVolumeNode = context.createGain(); + bmgVolumeNode.connect(context.destination); + deeper(images,"image"); + deeper(audio,"sound"); + function deeper(curpos,type) { + let addedPath=""; + for(let j=0;jcw-32&&mousePos.y<32) { + if(mousePress[0]&&ImTierdMakemenuwork) { + clickSound.play(); + paused=true; + optionsMenu=!optionsMenu; + } + optionsHover = 25; + } else { + optionsHover = 0; + } + if(mousePos.xcw-64&&mousePos.y<32) { + pauseHover = 25; + if(mousePress[0]) { + clickSound.play(); + paused=!paused; + } + } else { + pauseHover = 0; + } + +} +function addFont() { + var tempStyle = document.createElement("style"); + tempStyle.innerHTML = ` + @font-face { + font-family: 'PixelArial11'; + src: url("./pixelmix.ttf") format('truetype'); + font-weight: 900; + font-style: normal; + + } + html {font-family: 'PixelArial11' !important; font-size: 16px;} + `; + document.head.appendChild(tempStyle); + canvases.ctx.textBaseline = "hanging"; + canvases.ctx.textAlign = "left"; +} +var scaleDefault = 1; +function img(img,x,y,angle=0,sx=scaleDefault,sy=scaleDefault) { + var half = img.drawLimitSize; + if((x+half>drawLimitLeft&&x-halfdrawLimitTop&&y-halfmaxWidth) { //if the string is too big, divide up into smaller strings + var tempTxt = txtList[i].split(" "); //split into individual words + var tempStr=""; //string for measuring size + var addAmount=0; //track where in the txtList we are + txtList.splice(i,1); //remove the too long string + for(let j=0;j= rect2.x - rect2.w/2 && + rect1.x - rect1.w/2 <= rect2.x + rect2.w/2 && + rect1.y + rect1.h/2 >= rect2.y - rect2.h/2 && + rect1.y - rect1.h/2 <= rect2.y + rect2.h/2) { + return true; + } else { + return false; + } +} + +function rectpoint(rect,point) { + if(rect.x + rect.w/2 >= point.x && + rect.x - rect.w/2 <= point.x && + rect.y + rect.h/2 >= point.y && + rect.y - rect.h/2 <= point.y ) { + return true; + } else { + return false; + } +} + +function circlerect(circle,rect) { //credit: https://yal.cc/rectangle-circle-intersection-test/ + let rectHalfWidth = rect.w/2; + let rectHalfHeight = rect.h/2; + let deltaX = circle.x - Math.max(rect.x - rectHalfWidth, Math.min(circle.x, rect.x + rectHalfWidth)); + let deltaY = circle.y - Math.max(rect.y - rectHalfHeight, Math.min(circle.y, rect.y + rectHalfHeight)); + return (deltaX * deltaX + deltaY * deltaY) < (circle.r * circle.r); +} + +function circleOnSideRect(circle,rect) { + let rectHalfWidth = rect.w/2; + let rectHalfHeight = rect.h/2; + let left = rect.x - rectHalfWidth; + let right = rect.x + rectHalfWidth; + let top = rect.y - rectHalfHeight; + let bottom = rect.y + rectHalfHeight; + let cx = circle.x; + let cy = circle.y; + if(cy < top && cx > left && cx < right) { // top side + return 0; + } else if(cy > bottom && cx > left && cx < right) { // bottom side + return 2; + } else if (cx < left && cy > top && cy < bottom) { // left side + return 3; + } else if (cx > right && cy > top && cy < bottom) { // right side + return 1; + } else { + let returnValue=0; // 0 = top, 1 = right, 2 = bottom, 3 = left + let topleft = dist (circle,{x:left,y:top}); + let topright = dist (circle,{x:right,y:top}); + let bottomleft = dist (circle,{x:left,y:bottom}); + let bottomright = dist (circle,{x:right,y:bottom}); + switch(Math.min(topleft,topright,bottomleft,bottomright)) { // find what corner the cricle is closer to, then determine what side it is closer to + case topleft: + var m = slope(rect,{x:left,y:top}); + var mperp = -(1/m); + var b = yIntercept(rect,m); + var bperp = yIntercept(circle,mperp); + var mid = POI(m,b,mperp,bperp); + if(cx left2 && cx < right2) { // top side + return 0; + } else if(cy > bottom2 && cx > left2 && cx < right2) { // bottom side + return 2; + } else if (cx < left2 && cy > top2 && cy < bottom2) { // left side + return 3; + } else if (cx > right2 && cy > top2 && cy < bottom2) { // right side + return 1; + } else { + let returnValue=0; // 0 = top, 1 = right, 2 = bottom, 3 = left + let determiningPoint = {x:cx,y:cy}; + let topleft = dist (determiningPoint,{x:left2,y:top2}); + let topright = dist (determiningPoint,{x:right2,y:top2}); + let bottomleft = dist (determiningPoint,{x:left2,y:bottom2}); + let bottomright = dist (determiningPoint,{x:right2,y:bottom2}); + switch(Math.min(topleft,topright,bottomleft,bottomright)) { // find what corner the point is closer to, then determine what side it is closer to + case topleft: + var m = slope(rect2,{x:left2,y:top2}); + var mperp = -(1/m); + var b = yIntercept(rect2,m); + var bperp = yIntercept(determiningPoint,mperp); + var mid = POI(m,b,mperp,bperp); + if(cxedge.right) { + rect.v.x *= -1; + rect.x = edge.right-rw; + } + if(rx-rwedge.bottom) { + rect.v.y *= -1; + rect.y = edge.bottom-rh; + } + if(ry-rhedge.right) { + circle.v.x *= -1; + circle.x = edge.right-cr; + } + if(cx-credge.bottom) { + circle.v.y *= -1; + circle.y = edge.bottom-cr; + } + if(cy-cr