как разделить 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, но у Вас уже есть такая переменная. И далее у каждого из этих врагов проверяется координата, в зависимости от которой будет прибавляться скорость или вычитаться. А вообще, советую использовать спрайты и группы спрайтов, тогда код станет намного чище.