Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <body></body>
- <script>
- var canvas = document.createElement("canvas");
- var ctx = canvas.getContext("2d");
- canvas.width = 500;
- canvas.height = 350;
- canvas.style.border = "thin solid black";
- var boxes = [];
- var player = createAABB(250, 175, 15, 20);
- boxes.push(player);
- var level = "x x" +
- "x xx x" +
- "x xx x" +
- "xxx x" +
- "x xxxx x" +
- "x xxxx" +
- "x xx x" +
- "x x" +
- "x xx xxxxx" +
- "x x" +
- "xxxxxxxx xxxxxx" +
- "x x" +
- "x x" +
- "x x";
- for (var i = 0; i < level.length; i++) {
- if (level[i] == "x")
- boxes.push(createAABB(12.5 + (i % 20) * 25, 12.5 + ~~(i / 20) * 25, 25, 25));
- }
- function createAABB(x, y, width, height) {
- return {x: x, y: y, width: width, height: height, halfWidth: width / 2, halfHeight: height / 2};
- }
- function resolveCollisionX(a, b, dX, dY) {
- var sum = createAABB(b.x, b.y, b.width + a.width, b.height + a.height);
- var time = 1;
- if (dX > 0) {
- if (a.x + dX > sum.x - sum.halfWidth) {
- time = ((sum.x - sum.halfWidth) - a.x) / dX;
- if (a.y + dY * time > sum.y - sum.halfHeight && a.y + dY * time < sum.y + sum.halfHeight && time >= 0) {
- return time;
- }
- }
- } else if (dX < 0) {
- if (a.x + dX < sum.x + sum.halfWidth) {
- time = ((sum.x + sum.halfWidth) - a.x) / dX;
- if (a.y + dY * time > sum.y - sum.halfHeight && a.y + dY * time < sum.y + sum.halfHeight && time >= 0) {
- return time;
- }
- }
- }
- return 1;
- }
- function resolveCollisionY(a, b, dX, dY) {
- var sum = createAABB(b.x, b.y, b.width + a.width, b.height + a.height);
- var time = 1;
- if (dY > 0) {
- if (a.y + dY > sum.y - sum.halfHeight) {
- time = ((sum.y - sum.halfHeight) - a.y) / dY;
- if (a.x + dX * time > sum.x - sum.halfWidth && a.x + dX * time < sum.x + sum.halfWidth && time >= 0) {
- return time;
- }
- }
- } else if (dY < 0) {
- if (a.y + dY < sum.y + sum.halfHeight) {
- time = ((sum.y + sum.halfHeight) - a.y) / dY;
- if (a.x + dX * time > sum.x - sum.halfWidth && a.x + dX * time < sum.x + sum.halfWidth && time >= 0) {
- return time;
- }
- }
- }
- return 1;
- }
- var mouseX = 0, mouseY = 0;
- var keys = [];
- document.addEventListener("keydown", function (event) {
- keys[event.keyCode] = true;
- });
- document.addEventListener("keyup", function (event) {
- keys[event.keyCode] = false;
- });
- var vX = 0, vY = 0, g = false;
- function loop() {
- ctx.clearRect(0, 0, 500, 350);
- if (keys[37]) { // Left arrow key
- vX -= 1.5;
- }
- if (keys[32] && g) { // Space key
- vY = -8.5;
- }
- if (keys[39]) { // Right arrow key
- vX += 1.5;
- }
- vY += 0.55;
- vX *= 0.7;
- var dX = vX, dY = vY;
- var xResolution = 1, yResolution = 1;
- var xBox, yBox;
- for (var i = 1; i < boxes.length; i++) {
- var newXResolution = resolveCollisionX(player, boxes[i], dX, dY);
- var newYResolution = resolveCollisionY(player, boxes[i], dX, dY);
- xResolution = Math.min(xResolution, newXResolution);
- yResolution = Math.min(yResolution, newYResolution);
- if (xResolution == newXResolution) xBox = i;
- if (yResolution == newYResolution) yBox = i;
- }
- if (yResolution < 1) {
- xResolution = resolveCollisionX(player, boxes[xBox], dX, 0);
- }
- if (xResolution < 1) {
- yResolution = resolveCollisionY(player, boxes[yBox], 0, dY);
- }
- player.x += dX * xResolution;
- player.y += dY * yResolution;
- if (dY >= 0 && yResolution < 1) {
- g = true;
- vY = 0;
- } else {
- g = false;
- }
- if (player.y > 350) {
- while (player.y > 0) {
- player.y -= 350;
- }
- }
- for (var i = 0; i < boxes.length; i++) {
- ctx.fillRect(boxes[i].x - boxes[i].halfWidth, boxes[i].y - boxes[i].halfHeight, boxes[i].width, boxes[i].height);
- }
- ctx.fillText(g, 10, 20);
- ctx.fillText(xResolution, 10, 40);
- ctx.fillText(yResolution, 10, 60);
- window.requestAnimationFrame(loop);
- }
- loop();
- document.body.appendChild(canvas);
- </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement