Python 敌人的精灵没有正确跟随玩家

Python 敌人的精灵没有正确跟随玩家,python,pygame,Python,Pygame,我的敌人精灵通常能够跟随玩家,但当我继续游戏时,敌人精灵有时都会开始走向墙壁并相互重叠。即使我让玩家精灵向另一个方向移动,敌人精灵也只会沿着墙移动,而不会朝我的玩家移动 此外,我觉得我的敌人精灵没有任何威胁。有一半的时候,他们并没有真正向球员移动。如果我撞到敌人,那是因为我没有注意到他们,所以我向他们移动 我想解决我的敌人精灵向墙聚集的问题,让我的敌人更具威胁性。我也发现我的游戏太平淡了,所以我很感激任何关于我可以添加什么使游戏更有趣的建议 这是我的游戏代码: Code is removed f

我的敌人精灵通常能够跟随玩家,但当我继续游戏时,敌人精灵有时都会开始走向墙壁并相互重叠。即使我让玩家精灵向另一个方向移动,敌人精灵也只会沿着墙移动,而不会朝我的玩家移动

此外,我觉得我的敌人精灵没有任何威胁。有一半的时候,他们并没有真正向球员移动。如果我撞到敌人,那是因为我没有注意到他们,所以我向他们移动

我想解决我的敌人精灵向墙聚集的问题,让我的敌人更具威胁性。我也发现我的游戏太平淡了,所以我很感激任何关于我可以添加什么使游戏更有趣的建议

这是我的游戏代码:

Code is removed for now. Will re-upload in 1 to 2 months.
要获得“平滑”,必须使用浮点值而不是整数值计算敌人的位置和移动。
注意,
pygame.Rect
对象的位置和大小存储为整数。每次将运动添加到位置时,分数部分都会丢失。这导致根本不执行某个方向上的小移动。如果将小于0.5(
round
)的值添加到积分坐标中,则位置将永远不会改变,即使超出帧。如果坐标是浮点值,则位置的整数部分将在某些帧后更改

在类
敌人
中添加位置属性(.pos):

类敌人(pygame.sprite.sprite):
定义初始(自我、x、y、速度、墙):
# [...]
self.pos=[x,y]
自校正y=y
self.rect.x=x
更改属性
.pos
上的位置,并通过
.pos
更新
.rect
。e、 g:

self.pos[0]=self.pos[0]+self.move\u x
self.rect.x=圆形(self.pos[0])
如果检测到碰撞,则必须通过属性
.rect
的积分位置来校正属性
.pos
。e、 g:

如果块碰撞:
self.pos[0]=self.rect.x
此外,您还需要创建对象属性
self.move\x
self.move\y
,而不是类属性
founder.move\x
founder.move\y

注意,对于每个类型(calss),类存在一个属性,但是对于每个对象(“敌人”)存在一个对象属性。每个敌人都必须有自己的运动矢量,否则最后一个敌人计算的运动将应用于所有敌人。这会导致敌人做出意外的移动。看

当然,你必须在一个循环中移动敌人

敌方名单中e的
:
e、 移动(玩家)
类的完整代码
敌人

类敌人(pygame.sprite.sprite):
定义初始(自我、x、y、速度、墙):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface([20,20])
self.image.fill(红色)
self.rect=self.image.get_rect()
self.pos=[x,y]
自校正y=y
self.rect.x=x
self.move_x=0
self.move_y=0
self.speed=速度#敌人的速度
self.walls=碰撞测试的墙#墙
def移动(自身,玩家):
dx,dy=player.rect.x-self.pos[0],player.rect.y-self.pos[1]
距离=数学形下(dx,dy)
dx,dy=dx/dist,dy/dist
self.move_x=dx*min(距离、自速度)
自移y=dy*min(距离、自速度)
def更新(自我):
self.pos[0]=self.pos[0]+self.move\u x
self.rect.x=圆形(self.pos[0])
block_collide=pygame.sprite.spritecollide(self,self.walls,False)
对于块中的块_碰撞:
如果self.move_x>0:
self.rect.right=block.rect.left
其他:
self.rect.left=block.rect.right
如果块碰撞:
self.pos[0]=self.rect.x
self.pos[1]=self.pos[1]+self.move\y
self.rect.y=圆形(self.pos[1])
block_collide=pygame.sprite.spritecollide(self,self.walls,False)
对于块中的块_碰撞:
如果self.move_y>0:
self.rect.bottom=block.rect.top
其他:
self.rect.top=block.rect.bottom
如果块碰撞:
self.pos[1]=self.rect.y

移动更加顺畅(谢谢),但当我的玩家精灵不在时,我的敌人精灵仍会朝墙移动。它将向左侧或右侧墙移动,然后向下移动,直到脱离屏幕。你知道为什么会这样吗@Rabbid76@helpless只有当玩家不在屏幕上时,才会发生这种情况。玩家的坐标总是在窗口中吗<代码>0
0
?注意,
move()
中的答案有一个问题:
self.move\u x
分别是
self.move\u y
,而不是
敌军.move\u x
敌军.move\u y
否。我的播放器始终在屏幕上。我甚至有墙来防止玩家精灵和敌人精灵移出屏幕。我不太明白你在
move():self.move\u x
中所说的问题是什么意思。我应该如何改变它@Rabbid76@helpless请参阅答案的最后更改。它必须是
self.move\u x
分别
self.move\u y
而不是
敌人.move\u x
敌人.move\u y
。在敌人的构造函数中初始化:
self.move\u x=0
self.move\u y=0
并循环移动敌人:
对于敌人列表中的e:e.move(玩家)
。我在答案中添加了所有这些代码。