Adafruit TFT 1.8屏幕贪吃蛇:如何检测两等大圆形是否接触?
解决Adafruit TFT 1.8屏贪吃蛇的圆形碰撞检测问题
嘿,我来帮你搞定这个碰撞检测的bug!你说用了√(dx² + dy²)的公式但一直输出“NOT TOUCHING”,大概率是这几个地方出了问题,咱们一步步排查修复:
首先,优化碰撞检测逻辑(避免浮点误差+提升效率)
你用的开根号计算其实没必要,而且容易引入浮点精度问题——比如当距离刚好等于6(两个半径之和)时,浮点数的舍入误差可能会让结果略大于6,导致误判。更可靠的做法是直接比较距离的平方和半径和的平方:
因为两个圆半径都是3,所以半径之和是6,平方就是36。只要两个圆心的距离平方 ≤36,就说明它们接触或重叠了。
替换成这样的代码试试:
bool isColliding(int snakeHeadCenterX, int snakeHeadCenterY, int foodCenterX, int foodCenterY) { int dx = snakeHeadCenterX - foodCenterX; int dy = snakeHeadCenterY - foodCenterY; int distanceSquared = dx * dx + dy * dy; // 两个半径都是3,总和6,平方为36 return distanceSquared <= 36; }
然后,检查圆心坐标的计算是否正确
你提到“圆的中心坐标由屏幕位置x计算得到”,这里很可能是出错的核心:
- 如果你用Adafruit库的
drawCircle(x, y, 3, color)函数,那(x,y)就是圆心坐标,没问题。 - 但如果是你自己绘制的图形(比如用方块模拟圆),或者把蛇头的左上角位置当成了圆心,那就要调整:比如蛇头的左上角是(x,y),直径是6(半径3),那圆心应该是
x+3和y+3。
最后,用调试输出排查数值问题
如果还是不行,加个串口打印看看具体的坐标和计算值,就能直观找到问题:
bool isColliding(int snakeHeadCenterX, int snakeHeadCenterY, int foodCenterX, int foodCenterY) { int dx = snakeHeadCenterX - foodCenterX; int dy = snakeHeadCenterY - foodCenterY; int distanceSquared = dx * dx + dy * dy; // 串口打印调试信息 Serial.print("蛇头圆心: ("); Serial.print(snakeHeadCenterX); Serial.print(", "); Serial.print(snakeHeadCenterY); Serial.print(") | 食物圆心: ("); Serial.print(foodCenterX); Serial.print(", "); Serial.print(foodCenterY); Serial.print(") | 距离平方: "); Serial.println(distanceSquared); return distanceSquared <= 36; }
打开Arduino的串口监视器,看看当蛇头靠近食物时,距离平方是不是真的大于36——如果是,说明坐标计算错了;如果小于等于36但函数返回false,那就是逻辑写错了。
另外别忘了确认屏幕坐标范围:Adafruit TFT 1.8屏的分辨率是160x128,x范围0-159,y范围0-127,确保你的坐标没有超出这个范围,不然会出现异常数值。
内容的提问来源于stack exchange,提问作者ImStupid
相关产品推荐
相关产品推荐

