Проблема в том, что вы вызываете класс в каждом кадре, который возвращает его значения значениям, присвоенным в __init__
. Вы должны вызывать класс один раз в начале, а затем вызывать методы каждый кадр. Вот ссылка , чтобы узнать больше о занятиях.
Чтобы исправить свой код, сделайте это:
while True:
#do other stuff
for invader in invaders:
invader.move_invader()
#do other stuff
, и, поскольку все захватчики имеют одинаковое изображение, вы можете иметь
invader_image = pygame.image.load('invader.bmp')
invaders = []
for x in invader_x:
invaders.append(Invader(invader_image,x,40,1))
, это должно переместить каждого захватчика на 1 пиксель каждый кадр
, чтобы получить прямоугольник для столкновения, вы можете добавить прямоугольник к классу
class Invader
def __init__(self, invader, invader_x, invader_y, movement):
self.rect = invader.get_rect()
self.rect.x = invader_x
self.rect.y = invader_y
#rest of code
def move_invader(self):
#if moveing move x
self.rect.x = x
#rest of code
и для столкновения
for bullet in range(len(bullets_fired)-1,-1,-1):
for invader in invaders:
if invader.rect.colliderect(bullets_fired[bullet]):
score += 1
invader_x = DISPLAYSURF_rect.centerx
invader_x = DISPLAYSURF_rect.top + 40
del bullets_fired[bullet]
invaders.remove(invader) #to get rid of the invader too
bullet_fired = False
break
elif bullets_fired[bullet].y > 0:
bullet_fired = True
bullets_fired[bullet].y -= 14
bullet_rect = pygame.draw.rect(DISPLAYSURF, RED, (x, y, width, height))
для столкновения я зациклился назад, потому что если вы удалите 2-ю пулю в списке, 3-я станет 2-й, а l oop перейдет к 3-й (которая была 4-й), пропустив пулю. Но если вы go назад, если вы удалите пулю, уже проверенные пули будут перемещены, и вы можете продолжать проверять следующую.
для пули, у вас есть bullet и bullet_rect, которые это то же самое, и у вас есть список для пуль, лично я бы избавился от bullet_rect
bullet = pygame.draw.rect(screen,RED,(x,y,w,y))
для
pygame.draw.rect(screen,RED,bullets_fired[bullet]
теперь для того, где вы добавляете пули, когда вы нажимаете пробел вместо получения y просто получите прямоугольник
elif event.key == K_SPACE:
if bullet_fired == False:
rect = spaceship_rect.copy() # this makes the bullet the same size as the ship
#you could also do rect = pygame.rect(0,0,0,0)
rect.x = spaceship_rect.centerx - 3
rect.y = spaceship_rect.top
#rect.w = width
#rect.h = height
bullets_fired.append(rect)
и снова в столкновении l oop замените y на bullets_fired [bullet] .y