我在java中编写了一个原型,它采用了可移动的角色和基于图块的图形和游戏逻辑。每个级别的布局存储在10x10 2D阵列中。当我使用下面的代码来检测玩家是否与'1'(空)磁贴碰撞时,它只会在玩家与阵列中的最后'1'磁贴碰撞时返回正数,为什么会这样?我知道这种方法非常低效。
for(int r = 0; r < levArray.length; r++) {
for(int c = 0; c < levArray[0].length; c++) {
if(levArray[r][c] == 1) {
if(px >= r*64-9 && px <= (r+1)*64+11 && py >= c*64-30 && py <= (c+1)*64+30) {
isColliding = true;
} else {
isColliding = false;
}
}
}
}
答案 0 :(得分:3)
当您发现碰撞时,您需要停止循环(例如,使用break)。现在你一直循环,isColliding变量将设置为数组中最后一项的任何内容。
答案 1 :(得分:0)
您正在根据玩家位置(px,py)
检查关卡的每个元素。由于这些循环中唯一的控件是迭代本身,因此发生的最后一次比较是在最后一个单元格中。以前计算的任何结果都将被最后一次计算覆盖。
正如卡亚曼所说,你可以打破或返回退出循环;更好的方法是检查玩家的位置,而不是检查玩家的等级。您知道播放器的位置,如果将px,py
坐标转换为r,c
坐标,则只需要查看关卡数组中的一个元素。