как сделать последовательное изображение спрайтов в pygame?
у меня щас они рандомно идут , я хочу сделать что бы одна одна шла за другой по оси х , но не как не получается , помогите пожалуйста исправить код )))
# Игра Shmup - 3 часть
# Cтолкновения и стрельба
import pygame
import random
WIDTH = 1600
HEIGHT = 800
FPS = 60
# Задаем цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
BLUE2 = (0, 0, 255, 255)
# переменные
timer_stats = 0 # таймер статистики
ship_shield = 0# броня корабля
ship_life_timer = 0 # секундамер для хп корабля ( жизни)
ship_life = 3# жизни корабля
boss_life = 100
#разное
pygame.time.set_timer(pygame.USEREVENT, 1000)# таймер , смотреть инструкцию
sss = 3
# Создаем игру и окно
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shmup!")
clock = pygame.time.Clock()
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((40, 50))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
self.speedx = 0
def update(self):
self.speedx = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -8
if keystate[pygame.K_RIGHT]:
self.speedx = 8
self.rect.x += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
class Boss(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((70, 60))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect = self.image.get_rect()
self.rect.x = random.randrange(600,900)
self.rect.y = random.randrange(HEIGHT - 700)
self.speedx = random.randrange(-10 , 10)
def update(self):
self.rect.x += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
self.speedx = random.randrange(-10 ,-1)
if self.rect.left < 0:
self.rect.left = 0
self.speedx = random.randrange(1 , 10)
class HIT(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((50, 38))
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.radius = 20
pygame.draw.circle(self.image, RED, self.rect.center, self.radius, 5)
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
self.speedx = 0
class Mob2(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((40, 40))
self.image.set_colorkey(BLACK)
self.image.set_alpha(200)
self.rect = self.image.get_rect()
self.radius = 20
pygame.draw.circle(self.image, GREEN, self.rect.center, self.radius, 5)
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
def update(self):
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
'''
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((20, 20))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
self.speedx = random.randrange(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
'''
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((10, 20))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x
self.speedy = -10
def update(self):
self.rect.y += self.speedy
# убить, если он заходит за верхнюю часть экрана
if self.rect.bottom < 0:
self.kill()
all_sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
boss = Boss()
all_sprites.add(boss)
hit = HIT()
all_sprites.add(hit)
'''
for i in range(10):
s = Mob()
all_sprites.add(s)
mobs.add(s)
'''
for i in range(8):
m = Mob2()
all_sprites.add(m)
mobs.add(m)
# Цикл игры
running = True
while running:
clock.tick(FPS)
for e in pygame.event.get():#запускает таймер ,каждую секунду он считает
if e.type == pygame.USEREVENT: # только в его границах работает таймер
ship_life_timer += 1
timer_stats += 1
#print(ship_life_timer)
if ship_life_timer == 5:#востоновление жизни постепнно
ship_life_timer -= 5
ship_life += 0.05
if timer_stats == 7: # таймер статистики
print("здоровье:" + str(round(ship_life,2)))
#print("таймер жизни :" + str(ship_life_timer))
print("броня:" + str(ship_shield))
print("босс хп:" + str(boss_life))
print("mobs:" + str(mobs))
timer_stats -= 3
'''
for i in range(sss):
s = Mob()
all_sprites.add(s)
mobs.add(s)
'''
if e.type == pygame.QUIT:
running = False
elif e.type == pygame.KEYDOWN:
if e.key == pygame.K_SPACE:
player.shoot()
# Обновление
all_sprites.update()
# Найти все спрайты, которые сталкиваются между двумя группами.
'''
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
m = Mob()
all_sprites.add(m)
mobs.add(m)
'''
# Проверка, не ударил ли моб игрока
#hits = pygame.sprite.spritecollide(player, mobs, False)
hits = pygame.sprite.spritecollide(player, mobs, True)# если ударил то исчезает с экрана
if hits:
#running = False
ship_life = ship_life - 0.5 # за каждое попадание минус хп
if ship_life <= 0: # если здоровье меньше нуля...
running = False
# босс 1 уровня игры
hits = pygame.sprite.spritecollide(boss, bullets, True)# если ударил то исчезает с экрана
if hits:
#running = False
boss_life = boss_life - 1 # за каждое попадание минус хп
if boss_life <= 0: # если здоровье меньше нуля...
running = False
# Рендеринг
screen.fill(BLACK)
all_sprites.draw(screen)
# После отрисовки всего, переворачиваем экран
pygame.display.flip()
pygame.quit()