Что не так в коде? Нужно чтобы мобы вылетали справа и летели налево, а они летят сверху вниз и глючат, как исправить? (Class Mob нужно изменить)
import pygame
import random
WIDTH = 1920
HEIGHT = 820
FPS = 60
x = 50
y = 380
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Победи демонов!")
clock = pygame.time.Clock()
monster1_image = pygame.image.load('monster1.gif')
monster1_image = pygame.transform.scale(monster1_image, (350, 350))
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('player.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 5
self.rect.bottom = HEIGHT - 5
self.speedx = 0
def update(self):
self.speedx = 0
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
self.speedx = -8
if keys[pygame.K_d]:
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.left)
player_group.add(bullet)
bullets.add(bullet)
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = monster1_image
self.rect = self.image.get_rect()
self.rect.x = random.randrange(2000, 3000)
self.rect.y = random.randrange(-1920, -50)
self.speedy = random.randrange(1, 2)
self.speedx = random.randrange(2, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.right > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
self.rect.x = random.randrange(1920, 3000)
self.rect.y = random.randrange(-1920, -50)
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()
player_group = pygame.sprite.Group()
mobs = pygame.sprite.Group()
bullets = pygame.sprite.Group()
player = Player()
player_group.add(player)
for i in range(2):
m = Mob()
player_group.add(m)
mobs.add(m)
swag = True
while swag:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
swag = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
player.shoot()
player_group.update()
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
m = Mob()
player_group.add(m)
mobs.add(m)
hits = pygame.sprite.spritecollide(player, mobs, False)
if hits:
swag = False
screen.fill(BLACK)
player_group.draw(screen)
pygame.display.update()
pygame.quit()
Весь код всё-таки дал, но там нужно сделать изменения в Class Mob, чтобы он начал справа на лево лететь
Ответы (1 шт):
Автор решения: Сергей
→ Ссылка
Для изменения движения справа на лево надо заменить плюс на минус def update(self): self.rect.x += self.speedx на self.rect.x -= self.speedx. Почему координаты по Y отрицательные? Такого быть не должно. И они не должны быть больше, чем размер окна. Скорость по Y такой большой не нужна self.speedy = random.randrange(1, 8), достаточно (-1, 1).