Как заставить врагов двигаться по экрану

import pygame
import sys
import os
import random

pygame.init()

path = os.getcwd()

bg = pygame.transform.scale2x(pygame.image.load(f'{path}/Images/index.jpg'))

char = [
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R1.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R2.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R3.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R4.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R5.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R6.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R7.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R8.png'), 0, (14 / 18)),
    pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/R9.png'), 0, (14 / 18)),
]

charFlipped = [
    pygame.transform.flip(char[0], False, True),
    pygame.transform.flip(char[1], False, True),
    pygame.transform.flip(char[2], False, True),
    pygame.transform.flip(char[3], False, True),
    pygame.transform.flip(char[4], False, True),
    pygame.transform.flip(char[5], False, True),
    pygame.transform.flip(char[6], False, True),
    pygame.transform.flip(char[7], False, True),
    pygame.transform.flip(char[8], False, True),
]

fireball = [
    pygame.transform.flip(pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/FB001.png'), 0, 3), True, False),
    pygame.transform.flip(pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/FB002.png'), 0, 3), True, False),
    pygame.transform.flip(pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/FB003.png'), 0, 3), True, False),
    pygame.transform.flip(pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/FB004.png'), 0, 3), True, False),
    pygame.transform.flip(pygame.transform.rotozoom(pygame.image.load(f'{path}/Images/FB005.png'), 0, 3), True, False)
]

winLength = 600
winWidth = 336

screen = pygame.display.set_mode((winLength, winWidth))
pygame.display.set_caption("Space Adventures")

clock = pygame.time.Clock()

running = True


class Background(object):
    def __init__(self, speed):
        self.bgx1 = 0
        self.bgx2 = self.bgx1 + winLength
        self.speed = speed

    def draw(self):
        if self.bgx1 < (0 - winLength):
            self.bgx1 = winLength
        if self.bgx2 < (0 - winLength):
            self.bgx2 = self.bgx1 + winLength

        screen.blit(bg, (self.bgx1, 0))
        screen.blit(bg, (self.bgx2, 0))

    def move(self):
        self.bgx1 -= self.speed
        self.bgx2 -= self.speed


class Player(object):
    def __init__(self, x, vel, buffer):
        self.x = x
        self.y = 128
        self.vel = vel
        self.buffer = buffer
        self.count = 0
        self.flipped = False
        self.width = 64 * (14 / 18)

    def draw(self):
        if self.count + 1 >= 63:
            self.count = 0

        self.count += 1

        if self.flipped is False:
            screen.blit(char[self.count // 7], (self.x, self.y))

        if self.flipped is True:
            screen.blit(charFlipped[self.count // 7], (self.x, self.y))

    def move(self):
        if self.flipped is False and self.y < winWidth - self.buffer - self.width:
            self.y += self.vel
        if self.flipped is True and self.y > self.buffer:
            self.y -= self.vel


class Fireball(object):
    def __init__(self, x):
        self.x = x
        self.count = 0

        self.y = 100

        self.vel = 2
        self.passed = False

    def draw(self):
        if self.count + 1 >= 35:
            self.count = 0
        self.count += 1

        screen.blit(fireball[self.count // 7], (self.x, self.y))

    def move(self):
        self.x -= self.vel


background = Background(0.5)
character = Player(128, 2, 32)
meteor = Fireball(200)


def gameWindow():
    background.draw()
    character.draw()
    meteor.draw()
    pygame.display.update()


while running:

    clock.tick(60)

    keys = pygame.key.get_pressed()

    for event in pygame.event.get():
        if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.MOUSEBUTTONUP:
            character.flipped = not character.flipped

    background.move()
    character.move()

    gameWindow()

Я пытаюсь сделать игру, действительно похожую на Flappy Bird, но у меня возникли проблемы с тем, чтобы заставить огненные шары двигаться по экрану полностью, я даже не придумал способ, который мог бы быть хотя бы частично успешным, и это мое последнее средство перед Я иду копаться в Интернете в поисках чьего-то кода. Единственный способ сделать это - передать список значений x, а затем подключить их к классу, а затем изменить xs, а затем после того, как они исчезнут с экрана, они удаляются и передается новый набор f xs.


person BambooBlackjack975    schedule 19.10.2020    source источник


Ответы (1)


В классе FireBall уже есть метод move. Вам просто нужно использовать его.

Внесите следующие изменения:

В методе перемещения FireBall:

def move(self):
    self.x -= self.vel
    if self.x < -100:
       self.x = 700    # restart for right side

В основном цикле:

background.move()
character.move()
meteor.move()   # add this line

gameWindow()
person Mike67    schedule 19.10.2020
comment
Спасибо за вашу помощь, но также есть ли у вас какой-либо способ сделать так, чтобы несколько огненных шаров могли одновременно летать на экране, например, Flappy Bird может иметь до 3 труб на экране, каким-либо образом я могу это сделать? - person BambooBlackjack975; 19.10.2020
comment
@BambooBlackjack975 Если у вас есть новый вопрос, задайте общедоступный вопрос. Раздел комментариев не предназначен для того, чтобы задавать дополнительные вопросы. Не расширяйте этот вопрос, вам придется задать совершенно новый вопрос. - person Rabbid76; 19.10.2020