main
HuangHai 4 months ago
parent d48193eca0
commit e7d594fbdb

@ -73,8 +73,9 @@ class Character:
self.grid_y = grid_y # 小人的网格 y 坐标
self.x = grid_x * cell_size + cell_size // 2 # 小人的像素 x 坐标
self.y = grid_y * cell_size + cell_size // 2 # 小人的像素 y 坐标
self.radius = cell_size // 3 # 人的半径
self.radius = cell_size // 3 - 1 # 稍微减小半径,避免卡住
self.speed = 3 # 移动速度
self.collision_margin = 2 # 碰撞检测的边缘余量,减小这个值可以让小球更容易通过狭窄通道
def move(self, dx, dy):
# 计算目标位置
@ -83,7 +84,13 @@ class Character:
# 检测是否与墙壁碰撞
if self.will_collide(new_x, new_y):
return
# 尝试单独移动 X 或 Y 方向
if dx != 0 and not self.will_collide(new_x, self.y):
new_y = self.y # 只移动 X 方向
elif dy != 0 and not self.will_collide(self.x, new_y):
new_x = self.x # 只移动 Y 方向
else:
return # 两个方向都不能移动
# 更新位置
self.x = new_x
@ -92,20 +99,23 @@ class Character:
self.grid_y = self.y // cell_size
def will_collide(self, x, y):
# 计算碰撞检测的实际半径
collision_radius = self.radius - self.collision_margin
# 检测小球是否会与墙壁碰撞
# 计算小球边缘的四个点
points = [
(x - self.radius, y), # 左
(x + self.radius, y), # 右
(x, y - self.radius), # 上
(x, y + self.radius) # 下
(x - collision_radius, y), # 左
(x + collision_radius, y), # 右
(x, y - collision_radius), # 上
(x, y + collision_radius) # 下
]
# 检测每个点是否在墙壁内
for px, py in points:
# 计算点所在的网格位置
grid_x = px // cell_size
grid_y = py // cell_size
grid_x = int(px // cell_size)
grid_y = int(py // cell_size)
# 检测是否超出边界
if grid_x < 0 or grid_x >= grid_width or grid_y < 0 or grid_y >= grid_height:

Loading…
Cancel
Save