如何让敌人跟随pygame中的玩家?

2024-09-28 17:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我是游戏的一部分。它运行良好,但我想添加敌人在我的游戏。到目前为止,我在pygame精灵中添加了敌人的图像。但是我如何让敌人跟着玩家?我试过这么做,但它只是让敌人的形象直接指向玩家:

def moveEnemy(self):
    enemies.rect.x = player.rect.x
    enemies.rect.y = player.rect.y
    all_sprites_list.add(enemies)
    enemies_list.add(enemies)

我以为这会让敌人的形象跟随玩家。相反,它只是重叠了玩家的形象。我读了很多pygame精灵的例子,但是这些例子说要用“敌人.rect.x=-5”或者其他什么东西来代替“敌人.rect.x=player.rect.x”。我也试过这个,但它只是移动图像,而不是跟随球员。我需要制定一个方程式吗?如果是这样的话我不知道怎么做。我如何让敌人移动,同时让它跟随玩家?有人能帮我解决这个问题吗?任何帮助都将不胜感激。Windows7,Python2.6,PyGame2.6,精灵。


Tags: rect图像add游戏def玩家pygamelist
3条回答

在高水平上,你需要计算出从敌人到玩家的矢量。方向向量的xy分量如下:

enemies.rect.x - player.rect.x
enemies.rect.y - player.rect.y

然后,将方向的倍数添加到敌方位置,使其向玩家移动。

但是:你会注意到当玩家和敌人相隔很远时,这个向量会有一个很大的量值,当他们更接近时,这个向量会有一个很小的量值。因此,为了避免敌人以超高速移动,你可以使方向向量正常化,并乘以速度s来控制它。

你需要通过改变敌人的位置来缩短敌人和玩家之间的距离。这可以通过找到它们位置之间的差异,然后使用该向量计算normalized(单位长度)方向向量来实现。这样,通过将速度乘以方向向量来改变敌人的位置。

一种方法是在Enemy类中添加如下方法。数学运算可以使用内置的math模块或pygame.math模块来完成。后者还支持2DVector2类,因此它可能是实际使用的更好的类。

import math
import pygame
from pygame.locals import *

class Enemy(object):
    ...
    def move_towards_player(self, player):
        # Find direction vector (dx, dy) between enemy and player.
        dx, dy = player.rect.x - self.rect.x, player.rect.y - self.rect.y
        dist = math.hypot(dx, dy)
        dx, dy = dx / dist, dy / dist  # Normalize.
        # Move along this normalized vector towards the player at current speed.
        self.rect.x += dx * self.speed
        self.rect.y += dy * self.speed

    # Same thing using only pygame utilities
    def move_towards_player2(self, player):
        # Find direction vector (dx, dy) between enemy and player.
        dirvect = pygame.math.Vector2(player.rect.x - self.rect.x,
                                      player.rect.y - self.rect.y)
        dirvect.normalize()
        # Move along this normalized vector towards the player at current speed.
        dirvect.scale_to_length(self.speed)
        self.rect.move_ip(dirvect)

你将需要添加检查,以确定敌人的物体是否会超出,从而击中沿途的球员,如果它移动了这个距离,并作出相应的反应。提示:当移动量大于或等于速度向量的长度时,即对象的速度大于或等于它们之间的距离时,将发生碰撞。

这里,px&;py是敌人跟踪/追逐的目标的位置(全局)。

class Enemy(object):
    def __init__(self,x,y):  # initial position
        self.x = x 
        self.y = y
    def move(self, speed=5): # chase movement
        # Movement along x direction
        if self.x > px:
            self.x -= speed
        elif self.x < px:
            self.x += speed
        # Movement along y direction
        if self.y < py:
            self.y += speed
        elif self.y > py:
            self.y -= speed

如果需要,还可以自定义沿x&y方向的速度。

相关问题 更多 >