195 lines
7.0 KiB
JavaScript
195 lines
7.0 KiB
JavaScript
|
/**
|
|||
|
* 检测2个物体是否碰撞
|
|||
|
* @param object1 物体1
|
|||
|
* @param object2 物体2
|
|||
|
* @param overlap 允许重叠的大小
|
|||
|
* @returns {Boolean} 如果碰撞了,返回true
|
|||
|
*/
|
|||
|
function CheckIntersect(object1, object2, overlap)
|
|||
|
{
|
|||
|
// x-轴 x-轴
|
|||
|
// A1------>B1 C1 A2------>B2 C2
|
|||
|
// +--------+ ^ +--------+ ^
|
|||
|
// | object1| | y-轴 | object2| | y-轴
|
|||
|
// | | | | | |
|
|||
|
// +--------+ D1 +--------+ D2
|
|||
|
//
|
|||
|
//overlap是重叠的区域值
|
|||
|
A1 = object1.x + overlap;
|
|||
|
B1 = object1.x + object1.size - overlap;
|
|||
|
C1 = object1.y + overlap;
|
|||
|
D1 = object1.y + object1.size - overlap;
|
|||
|
|
|||
|
A2 = object2.x + overlap;
|
|||
|
B2 = object2.x + object2.size - overlap;
|
|||
|
C2 = object2.y + overlap;
|
|||
|
D2 = object2.y + object2.size - overlap;
|
|||
|
|
|||
|
//假如他们在x-轴重叠
|
|||
|
if(A1 >= A2 && A1 <= B2
|
|||
|
|| B1 >= A2 && B1 <= B2)
|
|||
|
{
|
|||
|
//判断y-轴重叠
|
|||
|
if(C1 >= C2 && C1 <= D2 || D1 >= C2 && D1 <= D2)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 坦克与地图块碰撞
|
|||
|
* @param tank 坦克对象
|
|||
|
* @param mapobj 地图对象
|
|||
|
* @returns {Boolean} 如果碰撞,返回true
|
|||
|
*/
|
|||
|
function tankMapCollision(tank,mapobj){
|
|||
|
//移动检测,记录最后一次的移动方向,根据方向判断+-overlap,
|
|||
|
var tileNum = 0;//需要检测的tile数
|
|||
|
var rowIndex = 0;//map中的行索引
|
|||
|
var colIndex = 0;//map中的列索引
|
|||
|
var overlap = 3;//允许重叠的大小
|
|||
|
|
|||
|
//根据tank的x、y计算出map中的row和col
|
|||
|
if(tank.dir == UP){
|
|||
|
rowIndex = parseInt((tank.tempY + overlap - mapobj.offsetY)/mapobj.tileSize);
|
|||
|
colIndex = parseInt((tank.tempX + overlap- mapobj.offsetX)/mapobj.tileSize);
|
|||
|
}else if(tank.dir == DOWN){
|
|||
|
//向下,即dir==1的时候,行索引的计算需要+tank.Height
|
|||
|
rowIndex = parseInt((tank.tempY - overlap - mapobj.offsetY + tank.size)/mapobj.tileSize);
|
|||
|
colIndex = parseInt((tank.tempX + overlap- mapobj.offsetX)/mapobj.tileSize);
|
|||
|
}else if(tank.dir == LEFT){
|
|||
|
rowIndex = parseInt((tank.tempY + overlap- mapobj.offsetY)/mapobj.tileSize);
|
|||
|
colIndex = parseInt((tank.tempX + overlap - mapobj.offsetX)/mapobj.tileSize);
|
|||
|
}else if(tank.dir == RIGHT){
|
|||
|
rowIndex = parseInt((tank.tempY + overlap- mapobj.offsetY)/mapobj.tileSize);
|
|||
|
//向右,即dir==3的时候,列索引的计算需要+tank.Height
|
|||
|
colIndex = parseInt((tank.tempX - overlap - mapobj.offsetX + tank.size)/mapobj.tileSize);
|
|||
|
}
|
|||
|
if(rowIndex >= mapobj.HTileCount || rowIndex < 0 || colIndex >= mapobj.wTileCount || colIndex < 0){
|
|||
|
return true;
|
|||
|
}
|
|||
|
if(tank.dir == UP || tank.dir == DOWN){
|
|||
|
var tempWidth = parseInt(tank.tempX - map.offsetX - (colIndex)*mapobj.tileSize + tank.size - overlap);//去除重叠部分
|
|||
|
if(tempWidth % mapobj.tileSize == 0 ){
|
|||
|
tileNum = parseInt(tempWidth/mapobj.tileSize);
|
|||
|
}else{
|
|||
|
tileNum = parseInt(tempWidth/mapobj.tileSize) + 1;
|
|||
|
}
|
|||
|
for(var i=0;i<tileNum && colIndex+i < mapobj.wTileCount ;i++){
|
|||
|
var mapContent = mapobj.mapLevel[rowIndex][colIndex+i];
|
|||
|
if(mapContent == WALL || mapContent == GRID || mapContent == WATER || mapContent == HOME || mapContent == ANOTHREHOME){
|
|||
|
if(tank.dir == UP){
|
|||
|
tank.y = mapobj.offsetY + rowIndex * mapobj.tileSize + mapobj.tileSize - overlap;
|
|||
|
}else if(tank.dir == DOWN){
|
|||
|
tank.y = mapobj.offsetY + rowIndex * mapobj.tileSize - tank.size + overlap;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}else{
|
|||
|
var tempHeight = parseInt(tank.tempY - map.offsetY - (rowIndex)*mapobj.tileSize + tank.size - overlap);//去除重叠部分
|
|||
|
if(tempHeight % mapobj.tileSize == 0 ){
|
|||
|
tileNum = parseInt(tempHeight/mapobj.tileSize);
|
|||
|
}else{
|
|||
|
tileNum = parseInt(tempHeight/mapobj.tileSize) + 1;
|
|||
|
}
|
|||
|
for(var i=0;i<tileNum && rowIndex+i < mapobj.HTileCount;i++){
|
|||
|
var mapContent = mapobj.mapLevel[rowIndex+i][colIndex];
|
|||
|
if(mapContent == WALL || mapContent == GRID || mapContent == WATER || mapContent == HOME || mapContent == ANOTHREHOME){
|
|||
|
if(tank.dir == LEFT){
|
|||
|
tank.x = mapobj.offsetX + colIndex * mapobj.tileSize + mapobj.tileSize - overlap;
|
|||
|
}else if(tank.dir == RIGHT){
|
|||
|
tank.x = mapobj.offsetX + colIndex * mapobj.tileSize - tank.size + overlap;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 子弹与地图块的碰撞
|
|||
|
* @param bullet 子弹对象
|
|||
|
* @param mapobj 地图对象
|
|||
|
*/
|
|||
|
function bulletMapCollision(bullet,mapobj){
|
|||
|
var tileNum = 0;//需要检测的tile数
|
|||
|
var rowIndex = 0;//map中的行索引
|
|||
|
var colIndex = 0;//map中的列索引
|
|||
|
var mapChangeIndex = [];//map中需要更新的索引数组
|
|||
|
var result = false;//是否碰撞
|
|||
|
//根据bullet的x、y计算出map中的row和col
|
|||
|
if(bullet.dir == UP){
|
|||
|
rowIndex = parseInt((bullet.y - mapobj.offsetY)/mapobj.tileSize);
|
|||
|
colIndex = parseInt((bullet.x - mapobj.offsetX)/mapobj.tileSize);
|
|||
|
}else if(bullet.dir == DOWN){
|
|||
|
//向下,即dir==1的时候,行索引的计算需要+bullet.Height
|
|||
|
rowIndex = parseInt((bullet.y - mapobj.offsetY + bullet.size)/mapobj.tileSize);
|
|||
|
colIndex = parseInt((bullet.x - mapobj.offsetX)/mapobj.tileSize);
|
|||
|
}else if(bullet.dir == LEFT){
|
|||
|
rowIndex = parseInt((bullet.y - mapobj.offsetY)/mapobj.tileSize);
|
|||
|
colIndex = parseInt((bullet.x - mapobj.offsetX)/mapobj.tileSize);
|
|||
|
}else if(bullet.dir == RIGHT){
|
|||
|
rowIndex = parseInt((bullet.y - mapobj.offsetY)/mapobj.tileSize);
|
|||
|
//向右,即dir==3的时候,列索引的计算需要+bullet.Height
|
|||
|
colIndex = parseInt((bullet.x - mapobj.offsetX + bullet.size)/mapobj.tileSize);
|
|||
|
}
|
|||
|
if(rowIndex >= mapobj.HTileCount || rowIndex < 0 || colIndex >= mapobj.wTileCount || colIndex < 0){
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
if(bullet.dir == UP || bullet.dir == DOWN){
|
|||
|
var tempWidth = parseInt(bullet.x - map.offsetX - (colIndex)*mapobj.tileSize + bullet.size);
|
|||
|
if(tempWidth % mapobj.tileSize == 0 ){
|
|||
|
tileNum = parseInt(tempWidth/mapobj.tileSize);
|
|||
|
}else{
|
|||
|
tileNum = parseInt(tempWidth/mapobj.tileSize) + 1;
|
|||
|
}
|
|||
|
for(var i=0;i<tileNum && colIndex+i < mapobj.wTileCount ;i++){
|
|||
|
var mapContent = mapobj.mapLevel[rowIndex][colIndex+i];
|
|||
|
if(mapContent == WALL || mapContent == GRID || mapContent == HOME || mapContent == ANOTHREHOME){
|
|||
|
//bullet.distroy();
|
|||
|
result = true;
|
|||
|
if(mapContent == WALL){
|
|||
|
//墙被打掉
|
|||
|
mapChangeIndex.push([rowIndex,colIndex+i]);
|
|||
|
}else if(mapContent == GRID){
|
|||
|
|
|||
|
}else{
|
|||
|
isGameOver = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}else{
|
|||
|
var tempHeight = parseInt(bullet.y - map.offsetY - (rowIndex)*mapobj.tileSize + bullet.size);
|
|||
|
if(tempHeight % mapobj.tileSize == 0 ){
|
|||
|
tileNum = parseInt(tempHeight/mapobj.tileSize);
|
|||
|
}else{
|
|||
|
tileNum = parseInt(tempHeight/mapobj.tileSize) + 1;
|
|||
|
}
|
|||
|
for(var i=0;i<tileNum && rowIndex+i < mapobj.HTileCount;i++){
|
|||
|
var mapContent = mapobj.mapLevel[rowIndex+i][colIndex];
|
|||
|
if(mapContent == WALL || mapContent == GRID || mapContent == HOME || mapContent == ANOTHREHOME){
|
|||
|
//bullet.distroy();
|
|||
|
result = true;
|
|||
|
if(mapContent == WALL){
|
|||
|
//墙被打掉
|
|||
|
mapChangeIndex.push([rowIndex+i,colIndex]);
|
|||
|
}else if(mapContent == GRID){
|
|||
|
|
|||
|
}else{
|
|||
|
isGameOver = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//更新地图
|
|||
|
map.updateMap(mapChangeIndex,0);
|
|||
|
return result;
|
|||
|
}
|