Javascript 如何在返回值时不中断函数/循环(Js)
嘿,所以我在做一个2D瓷砖游戏,或者说我只是在胡闹。我从一个数组中创建了贴图,其中0表示零,其他字符表示一个可行走的平铺Javascript 如何在返回值时不中断函数/循环(Js),javascript,arrays,2d,Javascript,Arrays,2d,嘿,所以我在做一个2D瓷砖游戏,或者说我只是在胡闹。我从一个数组中创建了贴图,其中0表示零,其他字符表示一个可行走的平铺 var map=[["t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t"], ["l","1","b","b","b","b","b","b","b","b","b","b","b","b","b","b","b","b","b","r"], ["l","
var map=[["t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t","t"],
["l","1","b","b","b","b","b","b","b","b","b","b","b","b","b","b","b","b","b","r"],
["l","r","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","r"],
["l","1","t","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","l","r"],
["l","1","1","t","t","t","t","t","t","t","t","t","t","t","t","r","0","0","l","r"],
["l","b","b","b","b","b","b","b","b","1","1","b","b","b","b","b","t","t","b","r"],
["0","0","0","0","0","0","0","0","0","l","r","0","0","0","0","0","0","0","0","0"],
["0","0","0","0","0","0","0","0","0","l","r","0","0","0","0","0","0","0","0","0"],
["0","0","0","0","0","0","0","0","0","l","r","0","0","0","0","0","0","0","0","0"],
["0","0","0","0","0","0","0","0","l","1","1","r","0","0","0","0","0","0","0","0"],
["0","0","0","0","0","0","0","l","1","1","1","1","r","0","0","0","0","0","0","0"],
["t","t","t","t","t","t","t","1","1","1","1","1","1","t","t","t","t","t","t","t"]];
你也可以在这里看到我的可移动角色。
现在我已经走到了这一步,我希望我的角色与地图数组中表示为0的空平铺发生碰撞
这是我检查冲突的代码(脚本中括号是正确的):
功能冲突检查(ind){
用于(映射中的变量i){
对于(映射[i]中的变量j){
如果(yass==true){
if(map[i][j]==0){
如果(ind==0&&playerPosX==j*32+32&&playerPosY>i*32-32&&playerPosYi*32-32&&playerPosYj*32-32&&playerPosXj*32-32&&playerPosX您需要在第15行的主if/else块的最后一个else中使用continue
而不是return
。您走在正确的轨道上,您的循环只运行一次迭代,因为您总是重新执行但是,您应该只在知道最终结果时调用return,因为正如您所说的,它将退出函数
在检测到碰撞后立即调用“return false”是正确的,因为如果玩家与至少一个块碰撞,则存在碰撞。相反,只有在您确定整个棋盘上根本没有碰撞时,才应调用“return true”,并且您需要在使用c之前测试地图上的每个块一位专家证实了这一点
function collisioncheck(ind) {
for (var i in map) {
for (var j in map[i]) {
if (yass == true) {
if (map[i][j] == 0) {
if (ind == 0 && playerPosX == j * 32 + 32 && playerPosY > i * 32 - 32 && playerPosY < i * 32 + 32) {
return false;
} else if (ind == 1 && playerPosX == j * 32 - 32 && playerPosY > i * 32 - 32 && playerPosY < i * 32 + 32) {
return false;
} else if (ind == 2 && playerPosY == i * 32 + 32 && playerPosX > j * 32 - 32 && playerPosX < j * 32 + 32) {
return false;
} else if (ind == 3 && playerPosY == i * 32 - 32 && playerPosX > j * 32 - 32 && playerPosX < j * 32 + 32) {
return false;
}
// else: do nothing. (i.e. let the loop run for the next block)
}
} else {
return true;
}
}
}
return true;
}
功能冲突检查(ind){
用于(映射中的变量i){
对于(映射[i]中的变量j){
如果(yass==true){
if(map[i][j]==0){
如果(ind==0&&playerPosX==j*32+32&&playerPosY>i*32-32&&playerPosYi*32-32&&playerPosYj*32-32&&playerPosXj*32-32&&playerPosX
我们在这里要做的是遍历所有块,如果发现冲突,我们将返回false并退出函数。只有遍历所有块而未发现任何冲突,我们才能得到“return true”语句,这正是您想要的。您可以断开标签;
或继续,而不是使用返回
,其中,label
是for循环上的一个标签。感谢您澄清这一点!您的答案非常有意义,而且有效;)
function collisioncheck(ind) {
for (var i in map) {
for (var j in map[i]) {
if (yass == true) {
if (map[i][j] == 0) {
if (ind == 0 && playerPosX == j * 32 + 32 && playerPosY > i * 32 - 32 && playerPosY < i * 32 + 32) {
return false;
} else if (ind == 1 && playerPosX == j * 32 - 32 && playerPosY > i * 32 - 32 && playerPosY < i * 32 + 32) {
return false;
} else if (ind == 2 && playerPosY == i * 32 + 32 && playerPosX > j * 32 - 32 && playerPosX < j * 32 + 32) {
return false;
} else if (ind == 3 && playerPosY == i * 32 - 32 && playerPosX > j * 32 - 32 && playerPosX < j * 32 + 32) {
return false;
}
// else: do nothing. (i.e. let the loop run for the next block)
}
} else {
return true;
}
}
}
return true;
}