как разделить element.x для каждого объекта

Надо сделать так, чтобы каждый раз при появлении врага он двигался в свою сторону, но с помощью моего кода они все начинают двигаться в одном направлении или же можете просто объяснить как сделать разделение метода element.x для каждого нового созданного врага собственным(ну то есть разделить element.x для каждого)описанная проблема

import pygame
import random

pygame.init()

H = 450 
W = 768


screen = pygame.display.set_mode((W, H), pygame.RESIZABLE)
bg = pygame.transform.scale(pygame.image.load('images//bg.png').convert_alpha(), (W, H))
virtual = pygame.Surface((W, H))

left_player = [pygame.transform.scale(pygame.image.load('images//left//defolt.png').convert_alpha(), (100,100))]

right_player = [pygame.transform.scale(pygame.image.load('images//right//defolt.png').convert_alpha(), (100,100))]

enemys = [pygame.transform.scale(pygame.image.load('images//enemy//enemy_left.png').convert_alpha(), (100, 100)),
         pygame.transform.scale(pygame.image.load('images//enemy//enemy_right.png').convert_alpha(), (100, 100))]

coor_for_enemy = [(-20, 133), (-20, 320), (690, 133), (690, 320)]

enemy_in_list = []

spawn_enemy = pygame.USEREVENT + 1
pygame.time.set_timer(spawn_enemy, 1000)

i = 1
while i < 9:
    left_player.append(pygame.transform.scale(pygame.image.load(f'images//left//left{i}.png').convert_alpha(), (100,100)))
    i+=1
i = 1
while i < 9:
    right_player.append(pygame.transform.scale(pygame.image.load(f'images//right//right{i}.png').convert_alpha(), (100, 100)))
    i+=1

player_speed = 6
player_jump_bool = False
player_jump = 8
jump_stop = 0
player_down_bool = False
player_down = 0
step_run = 1
player_x = 335
player_y = 320
speed_enemy = 7
enemy_x = 0
enemy_y = 0

process = True
while process:
    real_size = screen.get_size()
    virtual.blit(bg, (0, -1))
    virtual.blit(left_player[0], (player_x, player_y))
    player_rect = pygame.Rect(player_x + 50, player_y  + 50, 50, 50)
    key = pygame.key.get_pressed()
    if key[pygame.K_d]:
        player_x+=player_speed
        if player_x >= 690:
            player_x = 690
        virtual.blit(bg, (0, -1))
        virtual.blit(right_player[step_run], (player_x, player_y))

        if step_run == 8:
            step_run = 1
        else:
            step_run+=1   

    elif key[pygame.K_a]:
        player_x-=player_speed
        if player_x <= -20:
            player_x = -20
        virtual.blit(bg, (0, -1))
        virtual.blit(left_player[step_run], (player_x, player_y))

        if step_run == 8:
            step_run = 1
        else:
            step_run+=1

    if not player_jump_bool and player_down_bool == False:
        if key[pygame.K_SPACE]:
            player_jump_bool = True
    elif player_jump_bool and player_down_bool == False:
        if player_jump > 0:
            player_y-=(player_jump**2)/2

        player_jump-=0.5

        if player_jump < 0:
            player_y+=(player_jump**2)/2

        if player_jump == -8 or player_y == 133.0:
            player_y = int(player_y)
            player_jump_bool = False
            player_jump = 8
        
    if not player_down_bool and player_jump_bool == False and player_y == 133.0:
        if key[pygame.K_s]:
            player_down_bool = True
    elif player_down_bool and player_jump_bool == False:
        player_down-=0.5
        player_y+=(player_down**2)/2
        if player_down == -8:
            player_y = int(player_y)
            player_down_bool = False
            player_down = 0
    
    if enemy_in_list:
        if enemy_x == -20:
            for enemy_spawning_right in enemy_in_list:  
                virtual.blit(enemy, enemy_spawning_right)
                enemy_spawning_right.x += speed_enemy
                if player_rect.colliderect(enemy_spawning_right):
                    print('you lose!')

        elif enemy_x == 690:
            for enemy_spawning_left in enemy_in_list:  
                virtual.blit(enemy, enemy_spawning_left)
                enemy_spawning_left.x -= speed_enemy
                if player_rect.colliderect(enemy_spawning_left):
                    print('you lose!')


            
            
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            process = False
        elif event.type == spawn_enemy:
            rand_coor = random.choice(coor_for_enemy)
            enemy_x = rand_coor[0]
            enemy_y = rand_coor[1]
            if enemy_x == -20:
                enemy = enemys[1]
            elif enemy_x == 690:
                enemy = enemys[0]
            enemy_in_list.append(enemy.get_rect(topleft=(enemy_x, enemy_y)))


    scale_virtual = pygame.transform.scale(virtual, real_size)
    screen.blit(scale_virtual, (0, 0))
    pygame.display.update()
    pygame.time.Clock().tick(100)

p.s. проблема начинается с проверки

if enemy_in_list:

Ответы (1 шт):

Автор решения: Никомах

Мне кажется проблема в том, что Вы не там проверяете условие координат. Вот так должно работать:

if enemy_in_list:
    for enemy_spawning in enemy_in_list:
        if enemy_x == -20:
            virtual.blit(enemy, enemy_spawning)
            enemy_spawning.x += speed_enemy
            if player_rect.colliderect(enemy_spawning):
                print('you lose!')
        elif enemy_x == 690:
            virtual.blit(enemy, enemy_spawning)
            enemy_spawning.x -= speed_enemy
            if player_rect.colliderect(enemy_spawning):
                print('you lose!')

Когда Вы проходите всех врагов в списке enemy_in_list, нет разницы, слева они появляются или справа, поэтому я каждый элемент в этом списке упростил до enemy_spawning, хотя можно было просто до enemy, но у Вас уже есть такая переменная. И далее у каждого из этих врагов проверяется координата, в зависимости от которой будет прибавляться скорость или вычитаться. А вообще, советую использовать спрайты и группы спрайтов, тогда код станет намного чище.

→ Ссылка