如果我移动我的玩家,我的敌人就会停止移动

My enemies stop moving if i move my player

https://imgur.com/a/5aoTDwA

抱歉延迟,但可以看到我的敌人(绿色)生成,但如果我移动我的玩家(灰色),他们有时会停止移动,直到我再次移动我的玩家。

但即使在移动我的玩家之后,先前存在的敌人也不会靠近玩家并保持与玩家的距离

this is the file which contains the main loop of the game

this is the file which contains the player class

this is the file which contains the enemy class

and this is the file which is the main run file

我觉得问题存在于我的主循环 class 中,如下所示:

import pygame, random
from Folder.scripts.TopDown.script_files.td_Player import Player
from Folder.scripts.TopDown.script_files.td_enemy import Enemy
from Folder.scripts.TopDown.script_files.td_colours import colours

pygame.init()

class Main:
    def __init__(self):
        self.FPS = 60
        self.WIDTH = self.HEIGHT = 1280
        self.MAP = pygame.Surface((self.WIDTH, self.HEIGHT))
        self.enemies = []

    def main(self,WINDOW ,clock):

        WINDOW.fill(colours['white'])
        player = Player()

        camera_pos = (0, 0)
        enemy_time = 0

        run = True
        while run:

            clock.tick(self.FPS)

            enemy_y = random.randint(0, 1220)
            enemy_x = random.randint(0, 1220)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False

            current_time = pygame.time.get_ticks()
            if current_time > enemy_time:
                enemy_time = current_time + 1000
                self.enemies.append(Enemy(enemy_y, enemy_x))

            camera_pos = player.movement(camera_pos)

            self.WindowUpdate(WINDOW, player, camera_pos)

        pygame.quit()

    def WindowUpdate(self,WINDOW, player, camera_pos):

        player_x, player_y = player.playerMove()

        WINDOW.fill((255, 255, 255))
        self.MAP.fill(colours['gray'])
        player.renderPlayer(self.MAP)
        WINDOW.blit(self.MAP, camera_pos)

        for e in self.enemies:
            e.renderEnemy(WINDOW)
            e.enemyMovement(player_x, player_y)

        pygame.display.update()

Enemy class:

import pygame, os, random, math

pygame.init()

# current_time = pygame.time.get_ticks()
#         if current_time > self.enemy_time:
#             self.enemy_time = current_time + 1000
#             self.enemies.append()

class Enemy:

    def __init__(self, enemy_y, enemy_x):
        self.ENEMY_HEIGHT = self.ENEMY_WIDTH = 64
        self.ENEMY_ACCELERATION = 5

        self.enemy_rect = pygame.Rect(enemy_x, enemy_y, self.ENEMY_HEIGHT, self.ENEMY_WIDTH)

        self.ENEMY = {
            'up': pygame.transform.scale(pygame.image.load(
                os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_up.png')),
                (self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),

            'down': pygame.transform.scale(pygame.image.load(
                os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_down.png')),
                (self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),

            'left': pygame.transform.scale(pygame.image.load(
                os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_left.png')),
                (self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),

            'right': pygame.transform.scale(pygame.image.load(
                os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_right.png')),
                (self.ENEMY_HEIGHT, self.ENEMY_WIDTH))
        }

        self.enemy_state = 'up'

    def enemyMovement(self, player_x, player_y):
        ene_x, ene_y = player_x - self.enemy_rect.x, player_y - self.enemy_rect.y
        dist = math.hypot(ene_x, ene_y)
        ene_x, ene_y = ene_x // dist, ene_y // dist

        self.enemy_rect.x += ene_x * self.ENEMY_ACCELERATION
        self.enemy_rect.y += ene_y * self.ENEMY_ACCELERATION
        print(self.enemy_rect.x, self.enemy_rect.y)

    def renderEnemy(self, WINDOW):
        WINDOW.blit(self.ENEMY[self.enemy_state] , (self.enemy_rect.x, self.enemy_rect.y))

我希望展示我的问题的视频的 imgur link 被嵌入。任何输入或帮助将不胜感激

ene_x // distene_y // dist 的结果始终为 0。要计算移动,您必须使用 /(除法)运算符而不是 //(楼层划分)运算符

ene_x, ene_y = ene_x // dist, ene_y // dist

ene_x, ene_y = ene_x / dist, ene_y / dist

由于pygame.Rect应该表示屏幕上的一个区域,因此pygame.Rect对象只能存储整数数据。

The coordinates for Rect objects are all integers. [...]

当对象的位置增加时,运动的小数部分丢失:

self.enemy_rect.x += ene_x * self.ENEMY_ACCELERATION
self.enemy_rect.y += ene_y * self.ENEMY_ACCELERATION

如果要以浮点精度存储对象位置,则必须将对象的位置分别存储在单独的变量和属性中,并同步 pygame.Rect 对象。 round坐标并将其分配给矩形的位置(例如.topleft):

x, y = # floating point coordinates
rect.topleft = round(x), round(y)

将浮点坐标添加到Enemy class:

class Enemy:

    def __init__(self, enemy_y, enemy_x):
        # [...]

        self.enemy_rect = pygame.Rect(enemy_x, enemy_y, self.ENEMY_HEIGHT, self.ENEMY_WIDTH)
        self.x, self.y = self.enemy_rect.topleft

        # [...]
        

    def enemyMovement(self, player_x, player_y):
        ene_x, ene_y = player_x - self.x, player_y - self.y
        dist = math.hypot(ene_x, ene_y)
        ene_x, ene_y = ene_x / dist, ene_y / dist

        self.x += ene_x * self.ENEMY_ACCELERATION
        self.y += ene_y * self.ENEMY_ACCELERATION
        self.enemy_rect = round(self.x), round(self.y)