#python #animation #pygame
#питон #Анимация #pygame
Вопрос:
Привет, я новичок в python и в качестве своего первого проекта решил сделать игру space invaders, поэтому моя проблема в том, что для каждой колонки инопланетян я сбиваю взрывы, чтобы эта колонка появлялась в одном и том же определенном месте.
Например, взрывы для крайнего левого столбца отображаются в левом верхнем углу экрана, и при переходе к столбцам справа взрывы уменьшаются настолько, что анимация взрыва для крайнего правого столбца отображается в правом нижнем углу экрана.
Я включу код для класса Explosions, который я создал, и часть файла функций, в которой, как мне кажется, я написал код, вызывающий эту проблему.
класс взрывов:
import pygame pygame.init() clock = pygame.time.Clock() fps = 60 class Explosion(pygame.sprite.Sprite): def __init__(self, x, y, size): pygame.sprite.Sprite.__init__(self) self.images = [] for num in range(1, 6): img = pygame.image.load(f"images/exp{num}.png") if size == 1: img = pygame.transform.scale(img, (20, 20)) if size == 2: img = pygame.transform.scale(img, (40, 40)) if size == 3: img = pygame.transform.scale(img, (160, 160)) # add the image to the list self.images.append(img) self.index = 0 self.image = self.images[self.index] self.rect = self.image.get_rect() self.rect.center = [x, y] self.counter = 0 def update(self): explosion_speed = 4 # Update explosion animation. self.counter = 1 if self.counter gt;= explosion_speed and self.index lt; len(self.images) - 1: self.counter = 0 self.index = 1 self.image = self.images[self.index] # If the animation is complete, delete explosion. if self.index gt;= len(self.images) - 1 and self.counter gt;= explosion_speed: self.kill()
возможный проблемный раздел:
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets, ai_sounds, explosions): """Respond to bullet_alien collisions.""" # Remove the bullets that have collided. collisions = pygame.sprite.groupcollide(aliens, bullets, True, True) for alienn in collisions: explosion = Explosion(alienn.rect.centerx, alienn.rect.centerx, 2) explosions.add(explosion) if collisions: for alienss in collisions.values(): stats.score = ai_settings.alien_points * len(alienss) ai_sounds.play_alien_explosion_sound() sb.prep_score() check_high_score(stats, sb) if len(aliens) == 0: start_new_level(ai_settings, screen, stats, sb, ship, aliens, bullets)
Комментарии:
1. Это опечатка. Вы переходите
alienn.rect.centerx
кExplosion
двум. Это должно бытьExplosion(alienn.rect.centerx, alienn.rect.centery, 2)
илиExplosion(*alienn.rect.center, 2)
вместоExplosion(alienn.rect.centerx, alienn.rect.centerx, 2)
2. @Rabbid76 — Спасибо, чувак, ты буквально сделал мой день, очень ценю это.
Ответ №1:
В вашем заявлении есть опечатка. Вы переходите alienn.rect.centerx
к Explosion
двум. Это должно быть Explosion(alienn.rect.centerx, alienn.rect.centery, 2)
или Explosion(*alienn.rect.center, 2)
вместо Explosion(alienn.rect.centerx, alienn.rect.centerx, 2)
этого .