我有一个50宽30高的球员。我的问题是正确计算碰撞。我想通过检查玩家的中间位置(你可以在下面看到它)来做到这一点,但我也有考虑他的宽度和高度的问题 - 他的一半会在他停下来之前穿过墙。
地图被划分为多个正方形(例如100x100像素,100称为tileSize),正方形之间有一个墙或不是(每个正方形是一个可以有顶部或/和左边的对象,如果是真的,你不能通过广场的那一边 - 有一面墙。)
碰撞检测(item == player):
//inner walls - map collisions
var tileX = Math.floor(item.pos.x / this.tileSize);
var tileY = Math.floor(item.pos.y / this.tileSize);
var tileX = Math.floor(item.pos.x / this.tileSize);
var tileY = Math.floor(item.pos.y / this.tileSize);
if(tileX == item.last_X && tileY == item.last_Y){return;} //if its the same tile..
var colidedX = false;
var colidedY = false;
/* Check X */
if (item.last_X > tileX) {
if (this.map[item.last_Y][item.last_X].left) {
item.pos.x = item.last_X * this.tileSize;
colidedX = true;
}
}
if (item.last_X < tileX) {
if (this.map[item.last_Y][item.last_X+1].left) {
item.pos.x = (item.last_X+1) * this.tileSize;
colidedX = true;
}
}
/* Check Y */
if (item.last_Y > tileY) {
if (this.map[item.last_Y][item.last_X].top) {
item.pos.y = item.last_Y * this.tileSize;
colidedY = true;
}
}
if (item.last_Y < tileY) {
if (this.map[item.last_Y+1][item.last_X].top) {
item.pos.y = (item.last_Y+1) * this.tileSize;
colidedY = true;
}
}
if(colidedX == false){
item.last_X = tileX;
}
if(colidedY == false){
item.last_Y = tileY;
}
我知道如何才能做到这一点,但它会非常复杂和冗长,所以我认为必须有一种更简单的方法来做到这一点。