//DOCUMENT-READY==========================
$(document).ready(function() {
//VARS----------------------------------
var step = 10;
var health = 100;
//MAP-----------------------------------
var map = [
[0,1,0,0,0,1,0,0],
[0,1,0,0,0,1,0,0],
[0,1,0,0,0,1,0,0],
[0,1,1,1,0,1,0,0],
[0,0,0,0,0,0,0,2]
];
//DRAW MAP------------------------------
(function() {
var tile = "";
for (var y=0,county=map.length; y<county; ++y) {
$("#canvas").append('<div class="tile-row" id="row_'+(y+1)+'"></div>');
for (var x=0,countx=map[y].length; x<countx; ++x) {
switch (parseInt(map[y][x])) {
case 0: tile="air"; break;
case 1: tile="block"; break;
case 2: tile="spike"; break;
default: tile="error";
}
$("#row_"+(y+1)).append('<div class="tile '+tile+'"></div>');
}
}
})();
//SET BOUNDARIES------------------------
var xMin=$("#canvas").offset().left, xMax=xMin+$("#canvas").width()-$("#player").width();
var yMin=$("#canvas").offset().top, yMax=yMin+$("#canvas").height()-$("#player").height();
//PLACE PLAYER--------------------------
$("#player").css("left",xMin).css("top",yMin);
//MOVE PLAYER---------------------------
$(document).keydown(function(e){
var player=document.getElementById("player"), tile=null;
var x=$(player).offset().left, playerLeft=x, playerRight=playerLeft+$(player).width();
var y=$(player).offset().top, playerTop=y, playerBottom=playerTop+$(player).height();
function checkCollision(playerCorner1x, playerCorner1y, playerCorner2x, playerCorner2y) {
var collisionTiles=["block","spike"];
//check if the front of the player is colliding with the environment
var front = (playerCorner1x==playerCorner2x?playerCorner1x:playerCorner1y);
var corner1 = (front==playerCorner1x?playerCorner1y:playerCorner1x);
var corner2 = (front==playerCorner1x?playerCorner2y:playerCorner2x);
//check every pixel along the front for collision
for (var i=corner1; i<corner2; ++i) {
var checkTile = document.elementFromPoint((front==playerCorner1x?front:i), (front==playerCorner1y?front:i));
if (collisionTiles.indexOf(checkTile.className.split(" ")[1]) != -1) {
if ($(checkTile).hasClass("spike")) {console.log("YOU DEAD!");}
else if ($(checkTile).hasClass("block")) {return checkTile;}
break;
}
}
}
if(e.which==37 || e.which==65){ //LEFT,A
x -= step;
if (x <= xMin) {x = xMin;}
else {tile = checkCollision(playerLeft-step,playerTop, playerLeft-step,playerBottom);}
$(player).css("left",(tile?$(tile).offset().left+$(tile).width():x));
}
if(e.which==39 || e.which==68){ //RIGHT,D
x += step;
if (x >= xMax) {x = xMax;}
else {tile = checkCollision(playerRight+step,playerTop, playerRight+step,playerBottom);}
$(player).css("left",(tile?$(tile).offset().left-$(player).width():x));
}
if(e.which==38 || e.which==87){ //UP,W
y -= step;
if (y <= yMin) {y = yMin;}
else {tile = checkCollision(playerLeft,playerTop-step, playerRight,playerTop-step);}
$(player).css("top",(tile?$(tile).offset().top+$(tile).height():y));
}
if(e.which==40 || e.which==83){ //DOWN,S
y += step;
if (y >= yMax) {y = yMax;}
else {tile = checkCollision(playerLeft,playerBottom+step, playerRight,playerBottom+step);}
$(player).css("top",(tile?$(tile).offset().top-$(player).height():y));
}
});
});
div {margin:0; padding:0; border-style:none; box-sizing:border-box; overflow:hidden;}
/*CANVAS================*/
#canvas {display:inline-block;}
/*TILES=================*/
.tile-row {width:100%; height:40px;}
.tile {float:left; width:40px; height:100%;}
.tile.air {background-color:skyblue;}
.tile.block {background-color:sienna;}
.tile.spike {background-color:gray;}
.tile.error {background-color:red;}
/*PLAYER================*/
#player {position:absolute; width:15px; height:15px; background-color:black;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="canvas"></div>
<div id="player"></div>
map[i][j]coordinates. Then you can check the next cell that the guy will enter to determine if he should collide or not. In fact it would probably be better to only track guy's location in i, j coordinates and then use a function to map those to the display coordinates.if (up <= 0) { up = 0; }first and then assign style.if(e.keyCode==83){up+=10; if(up>400){up-=10;} guy.style.top=up+'px';}(click for link). This is what Nina Scholz meant in the comment above.$(window).load(function(){...});instead ofwindow.onload = function(){...};, and$(document).keydown(function(){...});instead ofdocument.onkeydown=function(){...};, etc...