<!--Copyright (c) 2017 Copyright Cliffbreak.de All Rights Reserved.--> <head> <title>⛳ Minigolf</title> <link rel="stylesheet" type="text/css" href="include/style.css"> <script src="include/jquery-3.2.1.min.js"></script> </head> <body> <canvas width="1280" height="720"></canvas> <canvas width="1280" height="720"></canvas> </body> <script> var ctx, staticctx, bX, bY, bWidth = 10, pX, pY, bVec, borders = [] /************************/ /*** _GAME VARIABLES_ ***/ /***********************/ var _COLOR_GRASS = '#388E3C', _COLOR_BORDER = '#FF9800', _COLOR_BALL = '#FFFFFF', _COLOR_HOLE = '#000000', _COLOR_BRACKET = '#000000' var _MAX_BRACKET = 100, _BALL_SPEED = 50, _BALL_SPEED_THRESHOLD = 10 $(function(){ ctx = $('canvas')[0].getContext('2d') staticctx = $('canvas')[1].getContext('2d') init() drawBorder(23, 10, 500, 5) drawBorder(23, 10, 5, 500) drawBorder(23+200, 10+70, 50, 50) drawBorder(23, 500+10-5, 500, 5) drawBorder(500+23-5, 10, 5, 500) drawHole(432, 366) setInterval(animLoop, 10) $(document).mousemove(function(e){ pX = e.pageX - $('canvas').offset().left pY = e.pageY - $('canvas').offset().top }) $(document).mousedown(function(e){ var strength = Math.hypot(pX - bX, pY - bY) if(strength > _MAX_BRACKET) strength = _MAX_BRACKET angle = Math.atan2(pY - bY, pX - bX) x = bX+strength*Math.cos(angle)-_MAX_BRACKET y = bY+strength*Math.sin(angle)-_MAX_BRACKET if(Math.abs(x) < _BALL_SPEED_THRESHOLD){ if(x < 0) x = -_BALL_SPEED_THRESHOLD if(x > 0) x = +_BALL_SPEED_THRESHOLD } if(Math.abs(y) < _BALL_SPEED_THRESHOLD){ if(y < 0) y = -_BALL_SPEED_THRESHOLD if(y > 0) y = +_BALL_SPEED_THRESHOLD } console.log(x + '|' + y); if(bVec == null) bVec = [x/_BALL_SPEED, y/_BALL_SPEED] }) }) // var i = 0 function animLoop() { ctx.clearRect(0, 0, $('canvas').width(), $('canvas').height()); if(bVec != null){ collide() drawBall(bX = bX-bVec[0], bY = bY-bVec[1]) } else drawBall(bX, bY) drawBracket() } function init() { bX = bY = 100 staticctx.fillStyle = _COLOR_GRASS staticctx.fillRect(23, 10, 500, 500) } function drawBorder(x, y, width, height) { staticctx.fillStyle = _COLOR_BORDER staticctx.fillRect(x, y, width, height) borders.push(new Border(x, y, width, height)) } function drawDebugBorder(border) { staticctx.fillStyle = 'red' staticctx.fillRect(border.x, border.y, border.width, border.height) } function drawHole(x, y) { staticctx.beginPath() staticctx.arc(x, y, 20, 0, Math.PI*2) staticctx.fillStyle = _COLOR_HOLE staticctx.fill() staticctx.closePath() } function drawBall(x, y) { ctx.beginPath() ctx.arc(x, y, bWidth, 0, Math.PI*2) ctx.fillStyle = _COLOR_BALL ctx.fill() ctx.closePath() } function drawBracket() { if(bVec != null) return; var x = pX, y = pY if(Math.hypot(pX - bX, pY - bY) > _MAX_BRACKET){ angle = Math.atan2(pY - bY, pX - bX) x = bX+_MAX_BRACKET*Math.cos(angle) y = bY+_MAX_BRACKET*Math.sin(angle) } ctx.beginPath() ctx.moveTo(bX, bY) ctx.lineTo(x, y) ctx.strokeStyle = _COLOR_BRACKET ctx.stroke() ctx.closePath() } function collide() { borders.forEach(function(el){ // if(bX >= el.x && bX <= el.x+el.width && bY >= el.y && bY <= el.y+el.height){ // drawDebugBorder(el) // if(Math.round(bX) == el.x || Math.round(bX) == el.x+el.width){ // bVec = [-bVec[0], bVec[1]] // } // else if(Math.round(bY) == el.y || Math.round(bY) == el.y+el.height) // bVec = [bVec[0], -bVec[1]] // else { // console.error('Error during collide()') // console.log(el) // console.log(Math.round(bY)); // console.log(Math.round(bX)); // } // } var dx = (el.x+el.width/2)-(bX+bWidth/2) var dy = (el.y+el.height/2)-(bY+bWidth/2) var width = (el.width+bWidth)/2 var height = (el.height+bWidth)/2 var crossWidth = width*dy; var crossHeight = height*dx; var collision = 'none'; if(Math.abs(dx)<=width && Math.abs(dy)<=height){ if(crossWidth<crossHeight){ collision=(crossWidth<(-crossHeight))?'bottom':'left' } else { collision=(crossWidth<(-crossHeight))?'right':'top' } } if(collision != 'none') console.log(collision); switch (collision) { case 'bottom': case 'top': bVec = [bVec[0], -bVec[1]]; break case 'left': case 'right': bVec = [-bVec[0], bVec[1]]; break } }) } /** CLASSES **/ function Border(x, y, width, height) { this.x = x this.y = y this.width = width this.height = height } </script> <script src="http://localhost:35729/livereload.js"></script>