Попытка поменять шаблоны пуль в этой игре - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь создать игру в стиле пули-ада, и я почти заставил ее работать, за исключением того, что противник не переключится с одной стрельбы на другую.

Предполагается стрелять по 3 синим пулям 8 раз, а затем перейти на стрельбу по 2 фиолетовым пулям 8 раз.Есть последовательность шаблонов, но у меня есть только два.

Так что он должен повторять каждый шаблон каждый раз, когда текущий шаблон снимает определенное количество раз.Когда все шаблоны сделаны, он должен полностью прекратить стрельбу.

Я видел, как люди пытаются сделать это, но это всегда Java, и я на питоне.

Код очень длинный, ноЯ не могу больше это урезать.Оригинал находится в нескольких файлах, но я поместил его в один скрипт.Упростить это практически невозможно.

import sys
import time
import itertools
import pygame
from pygame.locals import *

class Player(pygame.sprite.Sprite):

    #this sprite variable is a placeholder
    sprite = pygame.image.load("Sprites/player.png")

    def __init__(self, *groups):
        super().__init__(*groups)
        self.image = Player.sprite
        self.rect = self.image.get_rect(topleft=(445, 550))
        self.pos = pygame.Vector2(self.rect.topleft)

    def update(self):
        key = pygame.key.get_pressed()
        dist = 3
        if key[pygame.K_DOWN]:
            self.rect.y += dist
        elif key[pygame.K_UP]:
            self.rect.y -= dist
        if key[pygame.K_RIGHT]:
            self.rect.x += dist
        elif key[pygame.K_LEFT]:
            self.rect.x -= dist


class Spell:
    def __init__(self, bullet, pattern, speed, loop, tick_delay):
        self.bullet = bullet
        self.pattern = pattern
        self.speed = speed
        self.loop = loop
        self.tick_delay = tick_delay



class Opponent(pygame.sprite.Sprite):

    def __init__(self, sprite, sequence, *groups):
        super().__init__(*groups)
        self.image = sprite
        self.rect = self.image.get_rect(topleft=(425, 30))
        self.pos = pygame.Vector2(self.rect.topleft)
        self.path = itertools.cycle((self.rect.topleft, ))
        self.next_point = pygame.Vector2(next(self.path))
        self.speed = 1
        self.ticks = 1000
        self.queue = []
        self.sequence = sequence
        self.spellno = 0
        self.currentspell = sequence[self.spellno]

    def update(self):
        #this function basically does most of the stuff in this class
        move = self.next_point - self.pos
        move_length = move.length()
        if move_length != 0:
            move.normalize_ip()
            move = move * self.speed
            self.pos += move

        #later on down the line i want to make the opponent sprite move
        if move.length() == 0 or move_length < self.speed:
            self.next_point = pygame.Vector2(next(self.path))

        self.rect.topleft = self.pos

        for i in range(0, self.currentspell.loop):
            if pygame.time.get_ticks() - self.ticks > self.currentspell.tick_delay:
                self.ticks = pygame.time.get_ticks()
                self.shoot()

        time_gone = pygame.time.get_ticks() - self.ticks
        for bullet in self.queue:
            if bullet[0] <= time_gone:
                Bullet(self.rect.center, bullet[1], self.currentspell.bullet, sprites, bullets)

        self.queue = [bullet for bullet in self.queue if bullet[0] > time_gone]
        return

    def shoot(self):
        pattern = self.currentspell.pattern
        self.queue = pattern



class Bullet(pygame.sprite.Sprite):

    def __init__(self, pos, direction, image, *groups):
        super().__init__(*groups)
        self.image = image
        self.rect = self.image.get_rect(topleft=pos)
        self.direction = direction
        self.pos = pygame.Vector2(self.rect.topleft)

    def update(self):
        self.pos += self.direction
        self.rect.topleft = (self.pos.x, self.pos.y)
        if not screen.get_rect().colliderect(self.rect):
            self.kill()

sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()

opponentgroup = pygame.sprite.Group()
mi1 = Spell(pygame.image.load("Sprites/lightblue-glowey.png"),(
            (0, pygame.Vector2(-0.5, 1) * 4),
            (0, pygame.Vector2(0, 1) * 4),
            (0, pygame.Vector2(0.5, 1) * 4)),
            10, 8, 340
            )

mi2 = Spell(pygame.image.load("Sprites/purple-glowey.png"),(
            (0, pygame.Vector2(1, 1) * 4),
            (0, pygame.Vector2(-1, 1) * 4)),
            4,  8, 340
            )

minty_spells = [mi1, mi2]

player = Player(sprites)
Minty = Opponent(pygame.image.load("Sprites/minty.png"), minty_spells, opponentgroup)

opponents = [Minty]

pygame.init()

SCREENWIDTH = 1000
SCREENHEIGHT = 650
screen = pygame.display.set_mode([SCREENWIDTH, SCREENHEIGHT])

screen.fill((255, 123, 67))
pygame.draw.rect(screen, (0, 255, 188), (50, 50, 900, 575), 0)
background = screen.copy()

clock = pygame.time.Clock()

currentopponent = 0
def closegame():
    pygame.quit()
    return
def stage(opponent, background, bgm):
    currentopponent = opponent
    for spell in opponents[opponent].sequence:
        op = opponents[opponent]
        op.update()
        op.spellno += 1

def main():        
    running = True
    while running:   
        for events in pygame.event.get():
            if events.type == pygame.QUIT:
                pygame.quit()
                return

        # update all sprites
        sprites.update()
        sprites.add(opponents[currentopponent])
        # draw everything
        screen.blit(background, (0, 0))
        stage(0, "", "") # "" means placeholder. i'm working on them

        sprites.draw(screen)
        pygame.display.update()

        clock.tick(100)

if __name__ == '__main__':
    main()

Оригинальный код и ресурсы на моем GitHub: https://github.com/E-Lee-Za/Eleeza-Crafter-The-Game

1 Ответ

0 голосов
/ 30 декабря 2018

Вот рабочая (и упрощенная) версия вашего кода.Атрибут loop текущего заклинания уменьшается каждый раз, когда создаются маркеры.Когда loop равно 0, self.spellno увеличивается и заклинание изменяется, в противном случае, если spellno равно >= len(self.sequence), self.currentspell устанавливается на None, так что он прекращает стрельбу (просто добавьте if self.currentspell is not Noneк условному утверждению).

import pygame


class Spell:

    def __init__(self, bullet, pattern, speed, loop, tick_delay):
        self.bullet = bullet
        self.pattern = pattern
        self.speed = speed
        self.loop = loop
        self.tick_delay = tick_delay


class Opponent(pygame.sprite.Sprite):

    def __init__(self, sprite, sequence, *groups):
        super().__init__(*groups)
        self.image = sprite
        self.rect = self.image.get_rect(topleft=(425, 30))
        self.start_time = pygame.time.get_ticks()
        self.sequence = sequence
        self.spellno = 0
        self.currentspell = sequence[self.spellno]

    def update(self):
        time_gone = pygame.time.get_ticks() - self.start_time
        # Only create bullets if self.currentspell is not None.
        if self.currentspell is not None and time_gone > self.currentspell.tick_delay:
            self.start_time = pygame.time.get_ticks()
            for bullet in self.currentspell.pattern:
                if bullet[0] <= time_gone:
                    Bullet(self.rect.center, bullet[1], self.currentspell.bullet, sprites, bullets)

            # Decrement the loop attribute of the current spell and
            # switch to the next spell when it's <= 0. When all spells
            # are done, set self.currentspell to None to stop shooting.
            self.currentspell.loop -= 1
            if self.currentspell.loop <= 0:
                self.spellno += 1
                if self.spellno >= len(self.sequence):
                    self.currentspell = None
                else:
                    self.currentspell = self.sequence[self.spellno]


class Bullet(pygame.sprite.Sprite):

    def __init__(self, pos, direction, image, *groups):
        super().__init__(*groups)
        self.image = image
        self.rect = self.image.get_rect(topleft=pos)
        self.direction = direction
        self.pos = pygame.Vector2(self.rect.topleft)

    def update(self):
        self.pos += self.direction
        self.rect.topleft = (self.pos.x, self.pos.y)
        if not screen.get_rect().colliderect(self.rect):
            self.kill()


sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()

opponentgroup = pygame.sprite.Group()
img = pygame.Surface((30, 40))
img.fill((0, 100, 200))
mi1 = Spell(
    img,
    ((0, pygame.Vector2(-0.5, 1) * 4), (0, pygame.Vector2(0, 1) * 4),
     (0, pygame.Vector2(0.5, 1) * 4)),
    10, 8, 340
    )
img2 = pygame.Surface((30, 30))
img2.fill((110, 0, 220))
mi2 = Spell(
    img2,
    ((0, pygame.Vector2(1, 1) * 4), (0, pygame.Vector2(-1, 1) * 4)),
    4, 8, 340
    )

minty_spells = [mi1, mi2]
img3 = pygame.Surface((30, 50))
img3.fill((220, 0, 200))
Minty = Opponent(img3, minty_spells, opponentgroup)
sprites.add(Minty)

pygame.init()
SCREENWIDTH = 1000
SCREENHEIGHT = 650
screen = pygame.display.set_mode([SCREENWIDTH, SCREENHEIGHT])
screen.fill((255, 123, 67))
pygame.draw.rect(screen, (0, 255, 188), (50, 50, 900, 575), 0)
background = screen.copy()
clock = pygame.time.Clock()


def main():
    while True:
        for events in pygame.event.get():
            if events.type == pygame.QUIT:
                pygame.quit()
                return

        sprites.update()

        screen.blit(background, (0, 0))
        sprites.draw(screen)
        pygame.display.update()

        clock.tick(100)

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...