Я взломал ваш код до такой степени, что он, кажется, делает то, что описывает код, и что соответствует вашему вопросу.В этом коде пропало много вещей, возможно, вы вырезали их перед публикацией в SO, чтобы сделать код короче.
Суть проблемы - обработка вражеских спрайтов.Я не знаю, было ли это по замыслу, но оригинальный код определял то, что казалось спрайтом, но основывалось на спрайте group .
Так что я изменил код на основеИдея, что enemies
должна быть глобальной группой спрайтов, и пошла оттуда "исправление" вещей.Класс Player
не определен, я его добавил.Я не мог следовать временному коду, он использовал pygame.time.clock()
(который является объектом) в качестве значения времени. казалось , будто этот код держал дельту и считал время, чтобы возродить нового врага, мне пришлось переписать этот бит, чтобы заставить его работать - мои извинения.
Другойкомментарий, который я хочу сделать - спрайты могут определять функцию update()
.Эта функция должна обрабатывать изменения положения и внешний вид спрайта.Группы спрайтов PyGame будут обрабатывать вызов этой функции автоматически (если она определена) в мета-вызове группы спрайтов update()
.Это дает программе простой и понятный способ обработки спрайтовой анимации.
import pygame
pygame.init()
import random
import time
inPlay = True
width=900
height=700
screen = pygame.display.set_mode((width, height))
#enemy
enemies = pygame.sprite.Group() # Holds all enemy sprites
enemyFrequency = 1000 # milliseconds between enemy spawn
killEnemy = True
enemyCount = 0
#------------------------------#
# classes #
#------------------------------#
######################################################
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.center = (100,100) # TODO - position properly
def update(self):
# TODO
pass
class Enemy(pygame.sprite.Sprite):
def __init__(self, ballX, ballY, ballSpeed, picture2=None):
pygame.sprite.Sprite.__init__(self)
self.ballSpeed = ballSpeed
self.image = pygame.image.load(picture2).convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = ( ballX, ballY )
def update(self):
global enemies # group of all enemy sprites (to which this sprite belongs)
global height # window height
self.rect.x += self.ballSpeed
self.rect.y += self.ballSpeed
# decay the enemy
if ( self.rect.y > height ):
enemies.remove(self) # went off screen, delete it
#------------------------------#
# functions #
#------------------------------#
def redraw_game_window():
screen.fill((30, 30, 30))
enemies.draw(screen)
pygame.display.update()
#------------------------------#
# main program #
#------------------------------#
player = Player()
RB=width-player.rect.width
CEILING = 3*player.rect.height # for ship movement
FLOOR = height - player.rect.height #
# start with 3 enemies
for i in range( 3 ):
enemySpeed = 3
eX=random.randint(0,RB)
eY=random.randint(-height,0)
enemies.add( Enemy(eX,eY,enemySpeed,'asteroid.png') )
clock = pygame.time.Clock()
last_enemy_spawn_time = 0
while inPlay:
time_now = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
inPlay=False
# is it time to spawn a new enemy?
if ( time_now - last_enemy_spawn_time > enemyFrequency ):
last_enemy_spawn_time = time_now # reset timer
#enemies spawning
eX=random.randint(0,RB)
eY=random.randint(-height,0)
enemies.add( Enemy(eX,eY,enemySpeed,'asteroid.png') )
enemyCount += 1
enemies.update() # call the update() of every sprite
redraw_game_window()
#enemies.decay() -- MOVED INTO Enemy.update()
clock.tick(30)
pygame.quit()