gpt4 book ai didi

python - 敌人 Sprite 没有正确跟随玩家

转载 作者:行者123 更新时间:2023-12-01 07:43:58 26 4
gpt4 key购买 nike

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

此外,我觉得我的敌人 Sprite 根本没有威胁。有一半的时间,它们并没有真正走向玩家。如果我撞到了敌人,那是因为我没有集中注意力而朝他们走去。

我想解决敌人 Sprite 向墙壁聚集的问题,让敌人更具威胁性。我还发现我的游戏太乏味了,所以我很感激任何关于我可以添加什么以使游戏变得更有趣的建议。

这是我的游戏代码:

Code is removed for now. Will re-upload in 1 to 2 months.

最佳答案

为了获得“平滑”效果,您必须使用浮点值而不是整数值来计算敌人的位置和移动。
请注意,pygame.Rect 对象的位置和大小是整数存储的。每次向该位置添加移动时,小数部分都会丢失。这导致根本不执行某个方向上的小移动。如果将小于 0.5 (round) 的值添加到积分坐标,则位置永远不会改变,即使超出帧也是如此。如果坐标是浮点值,则位置的整数部分会在几帧后发生变化。

为类Enemy添加位置属性(.pos):

class Enemy(pygame.sprite.Sprite):

def __init__(self, x, y, speed, walls):

# [...]
self.pos = [x, y]
self.rect.y = y
self.rect.x = x

更改属性.pos上的位置,并通过.pos更新.rect。例如:

self.pos[0] = self.pos[0] + self.move_x
self.rect.x = round(self.pos[0])

如果检测到冲突,则必须通过属性 .rect 的完整位置来纠正属性 .pos。例如:

if block_collide:
self.pos[0] = self.rect.x

此外,您还必须创建对象属性 self.move_xself.move_y 而不是类属性 Enemy.move_xEnemy.move_y
请注意,类为每种类型(类)存在一次属性,但对象属性为每个对象(“敌人”)存在一次。每个敌人都必须有自己的运动矢量,否则最后一个敌人计算出的运动将应用于所有敌人。这会导致敌人做出意想不到的 Action 。请参阅Class Definition Syntax .

当然你必须循环移动敌人

for e in enemy_list:
e.move(player)

Enemy的完整代码:

class Enemy(pygame.sprite.Sprite):

def __init__(self, x, y, speed, walls):
pygame.sprite.Sprite.__init__(self)

self.image = pygame.Surface([20, 20])
self.image.fill(red)

self.rect = self.image.get_rect()
self.pos = [x, y]
self.rect.y = y
self.rect.x = x
self.move_x = 0
self.move_y = 0

self.speed = speed # speed of the enemy
self.walls = walls # walls for the collision test

def move(self, player):
dx, dy = player.rect.x - self.pos[0], player.rect.y - self.pos[1]
dist = math.hypot(dx, dy)
dx, dy = dx / dist, dy / dist
self.move_x = dx * min(dist, self.speed)
self.move_y = dy * min(dist, self.speed)

def update(self):

self.pos[0] = self.pos[0] + self.move_x
self.rect.x = round(self.pos[0])
block_collide = pygame.sprite.spritecollide(self, self.walls, False)
for block in block_collide:
if self.move_x > 0:
self.rect.right = block.rect.left
else:
self.rect.left = block.rect.right
if block_collide:
self.pos[0] = self.rect.x

self.pos[1] = self.pos[1] + self.move_y
self.rect.y = round(self.pos[1])
block_collide = pygame.sprite.spritecollide(self, self.walls, False)
for block in block_collide:
if self.move_y > 0:
self.rect.bottom = block.rect.top
else:
self.rect.top = block.rect.bottom
if block_collide:
self.pos[1] = self.rect.y

关于python - 敌人 Sprite 没有正确跟随玩家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com