C#开发猫追老鼠小游戏:PictureBox距离触发躲避功能求助
解决猫追老鼠游戏的距离触发移动问题
嘿,我明白你现在的困扰——已经让老鼠能反向跑了,但就是加不上“距离够近才触发”的条件对吧?别着急,咱们一步步来搞定它:
第一步:正确计算两个PictureBox的距离
首先要注意,咱们得用控件中心坐标来计算距离,而不是左上角的Location,不然判断会不准(比如猫的边缘碰到老鼠中心才触发,这显然不符合直觉)。
计算距离的时候,用欧几里得距离的平方就足够了(不用开根号,能省不少性能)。比如你想把阈值设为10像素,那对应的平方值就是100;要是调整成15像素,平方值就是225。代码示例如下:
// 获取猫和老鼠的中心坐标 Point catCenter = new Point(pictureBoxCat.Location.X + pictureBoxCat.Width / 2, pictureBoxCat.Location.Y + pictureBoxCat.Height / 2); Point mouseCenter = new Point(pictureBoxMouse.Location.X + pictureBoxMouse.Width / 2, pictureBoxMouse.Location.Y + pictureBoxMouse.Height / 2); // 计算横纵坐标的差值 int deltaX = catCenter.X - mouseCenter.X; int deltaY = catCenter.Y - mouseCenter.Y; // 计算距离的平方(避免开根号,提升运行效率) int distanceSquared = deltaX * deltaX + deltaY * deltaY; // 设定触发移动的阈值平方(这里以10像素为例) int triggerThresholdSquared = 10 * 10;
第二步:把移动逻辑套进条件判断里
你之前已经实现了“老鼠向猫的反方向移动”的代码,现在只需要把这段代码放到距离小于阈值的判断分支里,否则就让老鼠保持静止:
if (distanceSquared < triggerThresholdSquared) { // 这里放你原来的老鼠反向移动代码,比如: // 计算反方向的移动向量 int moveDirX = -deltaX; // 猫在老鼠右边,老鼠就向左跑,反之亦然 int moveDirY = -deltaY; // 给移动速度加个系数,控制老鼠跑的快慢 int moveSpeed = 5; // 按比例分配X/Y方向的移动距离,保证移动方向正确 int moveX = (moveDirX * moveSpeed) / (int)Math.Sqrt(distanceSquared); int moveY = (moveDirY * moveSpeed) / (int)Math.Sqrt(distanceSquared); pictureBoxMouse.Location = new Point( pictureBoxMouse.Location.X + moveX, pictureBoxMouse.Location.Y + moveY ); } else { // 距离没达到阈值,老鼠保持静止,这里不需要额外代码 }
小提醒
- 如果觉得计算根号麻烦,也可以直接用距离平方和阈值平方比较,移动时用deltaX和deltaY的比例分配速度(不用开根号也能保证方向正确)。
- 记得把这段判断逻辑放到游戏的更新循环里(比如Timer控件的Tick事件中),这样每帧都会检查猫和老鼠的距离,及时触发移动逻辑。
这样调整之后,应该就能实现“猫靠近到设定距离时,老鼠才反向逃跑,否则保持静止”的效果啦!
内容的提问来源于stack exchange,提问作者Khamira
相关产品推荐
相关产品推荐

