【发布时间】:2023-03-17 23:35:01
【问题描述】:
我用 Javascript 和 Canvas 制作了一个小游戏。我有碰撞检测,但效果不太好。我不能穿墙。到目前为止一切都很好,但它只适用于左侧和顶部,没有重叠。
我的地图是基于 0 和 1 的数组。1 是可步行的,0 必须阻止
我的播放器是 32x32,我的瓷砖也是。
PosX 是来自可能玩家的 x 坐标 PosY 是来自可能玩家的 y 坐标
这是我的检测代码:
var tileWidth = 32; // Fliesen breite festgelegt
var tileHeight = 32; // Fliesen höhe festgelegt
var solidTiles = [0]; // var solidTiles beinhaltet die 0 aus dem array, sagt das die nicht durchdringbar sein sollen (Hol mir quasi die 0 ausem array raus
function isSolidTile(x, y) { // Funktion zu festlegung das 0 Fließen nicht durchgehbar sind, x Pixel und y Pixel der fliese
var tileX = Math.floor(x / tileWidth); // Fließe in X --> x koordinate / durch die halbe breite, damit wir den mittelpunkt der fliese als festen punkt feststellen
var tileY = Math.floor(y / tileHeight); // Fließe in Y --> y koordinate / durch die halbe breite, damit wir den mittelpunkt der fliese als festen punkt feststellen
var tile = mapKollision[ tileY ][tileX] ; // WICHTIG!: Bei Listen ist auch die Zeile und Spalte einzuhalten. Bei der Abfrage einer Kollision zu erst Y dann X
if ( tile == 0 ) { //
return true; //
} else {return false} //
}
var altPosX = PosX; // neue variable für die alte helden position
var altPosY = PosY;
if ( isSolidTile( PosX, PosY) ){ // if wenn isSolidTile getroffen wird
PosX = altPosX; // soll er DIESE PosX in die alte Pos X umwandeln
PosY = altPosY; // soll er DIESE PosY in die alte Pos Y umwandeln
}
我知道我必须说类似的话
if( PosX + 32 ) PosX = altPosX -32;
但是当我使用这个时,我的玩家从阻挡瓷砖的右侧反弹回来,当我向左走时,我的玩家穿过了我的玩家留下的所有阻挡瓷砖。
但我想要的是,当我的玩家用他的 32x32 右侧触及阻挡瓷砖的左侧时,他必须停下来。
我不知道为什么它不起作用。
如果您需要更多代码,请告诉我。
谢谢:)
【问题讨论】:
标签: javascript canvas 2d collision-detection collision