Я работаю Python 3.8.2 и Pygame 2.0.0.dev6 в Pycharm.
Я прочитал несколько других тем на подобные проблемы, но не мог понять, почему я получаю эту ошибку в этом случае. Цель этого поста двоякая: 1 - это то, что я хотел бы понять эту ошибку (я очень новичок в программировании), и 2 - это то, что я хотел бы знать, если есть лучший метод для достижения sh, что Я пытаюсь сделать.
Я пытаюсь заставить врагов раскачиваться взад-вперед в направлении х, их изменение срабатывает либо по прошествии определенного количества времени, либо (еще не добавил) определенное количество столкновений с другими врагами.
Ошибка, кажется, вызвана вторым оператором if в методе movement
здесь:
class EnemyShip(ShipGeneral):
MOVEMENT_TIME = 180
SHIP_TYPE_DIC = {
'pawn': Images().pawn_ship_img,
'boss': Images().boss_ship_img
}
def __init__(self, x, y, enemy_type=None):
super().__init__(x, y, enemy_type)
self.ship_img = self.SHIP_TYPE_DIC[enemy_type]
self.mask = pygame.mask.from_surface(self.ship_img)
self.health = 100
self.movement_time_counter = 0 # Defaut set to zero
def movement_timer(self):
if self.movement_time_counter >= self.MOVEMENT_TIME:
self.movement_time_counter = 0
elif self.movement_time_counter > 0:
self.movement_time_counter +=1
def movement(self): # TODO fix enemy movement to prevent overlapping and allow for advances
y_vel = 10
x_vel = 2
boundaries = Settings()
if self.y <= 100:
self.y += y_vel
if self.movement_time_counter == 0: # should be true and run first in the while loop
x_direction = random.choice(['R', 'L'])
self.movement_time_counter += 1
if x_direction == 'R' and self.x + self.ship_img.get_width() + x_vel < boundaries.screen_width:
self.x += x_vel
if x_direction == 'L' and self.x > 0:
self.x -= x_vel
Я вызываю класс и функции в основной игре, пока l oop здесь:
enemies = []
running = True
while running:
clock.tick(FPS)
gf.check_events() # checks for user quit event
if len(enemies) == 0: # updates level and spawns new enemies after each wave
level += 1
fleet_size += 5
for enemy in range(fleet_size):
enemy = EnemyShip(
random.randrange(20, 800 - 20),
random.randrange(-1000, -100, 10),
enemy_type=random.choice(['pawn', 'pawn', 'pawn', 'pawn', 'boss'])
)
enemies.append(enemy)
for enemy in enemies: # enables each enemy to move
enemy.movement()
enemy.move_missile(7, playership)
enemy.movement_timer()
if enemy.health <=0:
enemies.remove(enemy)
Если я запускаю это, я получаю следующую ошибку:
File >"/Users/aaronbastian/Documents/PythonCode/Part_II_Projects/alien_invasion/ships.py", line 114, in movement
if x_direction == 'R' and self.x + self.ship_img.get_width() + x_vel < boundaries.screen_width:
UnboundLocalError: local variable 'x_direction' referenced before assignment
Я не понимаю ошибка, потому что я думал, что self.movement_time_counter == 0
должен оценить значение True и, таким образом, присваивать x_direction
до следующего, если выполняются операторы.
Если бы кто-то мог объяснить мне мою ошибку, я был бы очень признателен! Кроме того, я прошу прощения, если это избыточный пост, я просто не мог понять другие подобные темы.