From 8b3a6710664a659b050731fda81b1ed297e485d1 Mon Sep 17 00:00:00 2001 From: RedEnchilada Date: Sat, 7 May 2016 12:54:40 -0500 Subject: [PATCH] Add collision handler --- data/LevelDatabase.js | 4 +++- level/Dolphin.js | 14 ++++++++++++++ level/Entity.js | 4 ++++ level/Level.js | 43 +++++++++++++++++++++++++++++++++++++++++++ level/Rock.js | 3 ++- 5 files changed, 66 insertions(+), 2 deletions(-) diff --git a/data/LevelDatabase.js b/data/LevelDatabase.js index 200c9f6..282ab03 100644 --- a/data/LevelDatabase.js +++ b/data/LevelDatabase.js @@ -74,7 +74,9 @@ LevelDatabase = { {x: 1536, y: 1298, z: 0, type: "small"}, {x: 1506, y: 1268, z: 0, type: "large"}, {x: 1536, y: 1238, z: 0, type: "small"}, - {x: 1566, y: 1268, z: 0, type: "large"} + {x: 1566, y: 1268, z: 0, type: "large"}, + + {x: 1024, y: 1024, z: 0, type: "large"} ], spawn: { diff --git a/level/Dolphin.js b/level/Dolphin.js index d22fb14..e218883 100644 --- a/level/Dolphin.js +++ b/level/Dolphin.js @@ -10,6 +10,13 @@ Dolphin = function(level, axis, position, z) { position: position }; + dolphin.bbox = { + x: 20, + y: 20, + z: 20, + tag: "player" + }; + axisMove(); var sprite = Renderer.animation([ @@ -61,6 +68,13 @@ Dolphin = function(level, axis, position, z) { } positionOnAxis(); + + if (toucher = dolphin.colliding("geometry")) { + dolphin.momentum.x /= -1.5; + dolphin.axis.current = oldCurrent; + dolphin.axis.position = oldPosition; + positionOnAxis(); + } } function newAxis(transitionList) { diff --git a/level/Entity.js b/level/Entity.js index 3812311..ad5ddab 100644 --- a/level/Entity.js +++ b/level/Entity.js @@ -39,5 +39,9 @@ Entity = function(level, x, y, z) { currentAnim = name; } + entity.colliding = function(tag) { + return level.colliding(entity, tag); + } + return entity; }; \ No newline at end of file diff --git a/level/Level.js b/level/Level.js index 1de8d00..8c7b172 100644 --- a/level/Level.js +++ b/level/Level.js @@ -110,6 +110,49 @@ Level = function(levelName) { } + level.colliding = function(object, tag, excludes) { + excludes = excludes || []; + var xoffs = object.position.x % 600 > 300 ? 1 : -1; + var yoffs = object.position.y % 600 > 300 ? 512 : -512; + + try { + ([0, xoffs, yoffs, xoffs+yoffs]).forEach(function(pos) { + if (entityGrid[pos]) { + entityGrid[pos].forEach(function(target) { + if (!target.bbox || target.bbox.tag != tag) { + return; + } + + if (Math.abs(target.position.x - object.position.x) + > target.bbox.x + object.bbox.x) { + return; + } + + if (Math.abs(target.position.y - object.position.y) + > target.bbox.y + object.bbox.y) { + return; + } + + if (Math.abs(target.position.z - object.position.z) + > target.bbox.z + object.bbox.z) { + return; + } + + if (excludes.indexOf(target) != -1) { + return; + } + + throw target; + }); + } + }); + } catch (toucher) { + return toucher; + } + + return false; + } + function placeEntityInGrid(entity) { var grid; var gridpos = getGridIndex(entity.position.x, entity.position.y); diff --git a/level/Rock.js b/level/Rock.js index a662412..0323e59 100644 --- a/level/Rock.js +++ b/level/Rock.js @@ -8,7 +8,8 @@ Rock = function(level, x, y, z, size) { small: 12, medium: 31, large: 47 - })[size] + })[size], + tag: "geometry" }; rock.addSprite("sprite", Renderer.sprite("rock-" + size));