Pygame TypeError: update() 需要 1 个位置参数,但给出了 2 个 [英] Pygame TypeError: update() takes 1 positional argument but 2 were given

查看:62
本文介绍了Pygame TypeError: update() 需要 1 个位置参数,但给出了 2 个的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在分析了我的代码大约 2-3 小时后,我查找了与我的问题类似的以下链接,这些链接在下面提供.但是在认识到他们的问题是什么之后,我想我的必须是一样的,不幸的是事实并非如此.我将提供我认为问题所在的代码,如果您需要查看更多内容,我将非常乐意遵守.谢谢.

After analyzing my code for about 2-3 hours, I looked up the following links that were similar to my problem, which are provided below. But after recognizing what their issue was, I figured my must be the same, unfortunately that's not the case. I'll provide the code where I believe the issue lies, if you need to see more, i'll be more than happy to comply. Thank you.

超链接...

TypeError: __init__() 需要 4 个位置参数但是给了 5 个

采用 1 个位置参数,但给出了 2 个

这是代码...

def game_loop(player_img):
  player_group = pygame.sprite.GroupSingle()
  global player
  player = Sprites.Player(player_img)
  player.rect.x = WINDOW_WIDTH/2
  player.rect.y = WINDOW_HEIGHT - player.rect.height
  player_group.add(player)

  global asteroid_group
  asteroid_group = pygame.sprite.Group()
  asteroid_stopwatch = Stopwatch.Stopwatch()

  global ufo_group
  ufo_group = pygame.sprite.Group()
  ufo_stopwatch = Stopwatch.Stopwatch()

  global enemy_group
  enemy_group = pygame.sprite.Group()
  enemy_stopwatch = Stopwatch.Stopwatch()

  global bomb_group
  bomb_group = pygame.sprite.Group()
  bomb_stopwatch = Stopwatch.Stopwatch()

  global space_mine_group
  space_mine_group = pygame.sprite.Group()
  space_mine_stopwatch = Stopwatch.Stopwatch()

  explosion_group = pygame.sprite.Group()

  ammo_power_up = Sprites.Ammo_Powerup()
  ammo_power_up_group = pygame.sprite.GroupSingle()
  ammo_power_up_stopwatch = Stopwatch.Stopwatch()

  health_power_up = Sprites.Health_Powerup()
  health_power_up_group = pygame.sprite.GroupSingle()
  health_power_up_stopwatch = Stopwatch.Stopwatch()

  stun = Sprites.Stun()
  stun_group = pygame.sprite.GroupSingle()
  stun_stopwatch = Stopwatch.Stopwatch()
  player_stun_stopwatch = Stopwatch.Stopwatch()

  bullet_list = pygame.sprite.Group()
  enemy_bullet_list = pygame.sprite.Group()

  ammo, health, score = 10, 100, 0

  background = Sprites.Background("Sprites/Background/background.jpg", [0, 0])

  pygame.mixer.music.load("Sprites/Efx/Fantasy_Game_Background.mp3")
  pygame.mixer.music.play(-1)

  power_up_sound = pygame.mixer.Sound("Sprites/Efx/powerup.ogg")
  laser_sound = pygame.mixer.Sound("Sprites/Efx/laser1.ogg")
  space_mine_sound = pygame.mixer.Sound("Sprites/Efx/explosion.ogg")
  bomb_sound = pygame.mixer.Sound("Sprites/Efx/explosion.ogg")

  while True:
    clear_previous(player.rect.x, player.rect.y, player.rect.width, player.rect.height)

    if asteroid_stopwatch.get_seconds() >= 3:
        spawn_asteroid()
        asteroid_stopwatch.reset()

    if ufo_stopwatch.get_seconds() >= 8:
        spawn_ufo()
        ufo_stopwatch.reset()

    if enemy_stopwatch.get_seconds() >= 5:
        spawn_enemy()
        enemy_stopwatch.reset()

    if bomb_stopwatch.get_seconds() >= 6:
        spawn_space_bomb()
        bomb_stopwatch.reset()

    if space_mine_stopwatch.get_seconds() >= 6:
        spawn_space_mine()
        space_mine_stopwatch.reset()

    if ammo_power_up_stopwatch.get_seconds() >= 5:
        ammo_power_up_group.remove(ammo_power_up)
        clear_previous(ammo_power_up.rect.x, ammo_power_up.rect.y, ammo_power_up.rect.width, ammo_power_up.rect.height)

    if ammo_power_up_stopwatch.get_seconds() >= 10:
        ammo_power_up.rect.x = random.randrange(30, 700)
        ammo_power_up.rect.y = random.randrange(200, 930)
        ammo_power_up_group.add(ammo_power_up)
        ammo_power_up_stopwatch.reset()

    if health_power_up_stopwatch.get_seconds() >= 7.5:
        health_power_up_group.remove(health_power_up)
        clear_previous(health_power_up.rect.x, health_power_up.rect.y, health_power_up.rect.width, health_power_up.rect.height)

    if health_power_up_stopwatch.get_seconds() >= 15:
        health_power_up.rect.x = random.randrange(30, 700)
        health_power_up.rect.y = random.randrange(200, 930)
        health_power_up_group.add(health_power_up)
        health_power_up_stopwatch.reset()

    if player_stun_stopwatch.get_seconds() >= 4:
        player.x_vel = 5
        player.y_vel = 5

    if stun_stopwatch.get_seconds() >= 10:
        stun_group.remove(stun)
        clear_previous(stun.rect.x, stun.rect.y, stun.rect.width, stun.rect.height)

    if stun_stopwatch.get_seconds() >= 12:
        stun.rect.x = random.randrange(30, 700)
        stun.rect.y = random.randrange(200, 930)
        stun_group.add(stun)
        stun_stopwatch.reset()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit_game()
        if event.type == pygame.MOUSEBUTTONDOWN and ammo > 1:
            ammo -= 2
            clear_previous(20, 50, 100, 30)

            laser_sound.play()

            bullet = Sprites.Bullet()
            bullet.rect.x = player.rect.right
            bullet.rect.y = player.rect.top
            bullet_list.add(bullet)

            second_bullet = Sprites.Bullet()
            second_bullet.rect.x = player.rect.left
            second_bullet.rect.y = player.rect.top
            bullet_list.add(second_bullet)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
        player.move_right()
    if keys[pygame.K_LEFT] or keys[pygame.K_a]:
        player.move_left()
    if keys[pygame.K_UP] or keys[pygame.K_w]:
        player.move_up()
    if keys[pygame.K_DOWN] or keys[pygame.K_s]:
        player.move_down()

    for bullet in bullet_list:
        if bullet.rect.y <= 0:
            bullet_list.remove(bullet)
        clear_previous(bullet.rect.x, bullet.rect.y, bullet.rect.width, bullet.rect.height)

    for asteroid in asteroid_group:
        if asteroid.rect.y >= WINDOW_HEIGHT:
            asteroid_group.remove(asteroid)
        if pygame.sprite.spritecollide(player, asteroid_group, False):
            health -= 15
            clear_previous(20, 20, 100, 30)
            asteroid.hit = True
            bomb_sound.play()
            explosion = Sprites.Explosion(asteroid.rect.x, asteroid.rect.y)
            asteroid_group.remove(asteroid)
            clear_previous(asteroid.rect.x, asteroid.rect.y, asteroid.rect.width, asteroid.rect.height)
            explosion_group.add(explosion)

        clear_previous(asteroid.rect.x, asteroid.rect.y, asteroid.rect.width, asteroid.rect.height)

    for enemy in enemy_group:
        if enemy.rect.y >= WINDOW_HEIGHT:
            enemy_group.remove(enemy)
        if pygame.sprite.spritecollide(player, enemy_group, False):
            health -= 10
            clear_previous(20, 20, 100, 30)
            explosion = Sprites.Explosion(enemy.rect.x, enemy.rect.y)
            enemy_group.remove(enemy)
            clear_previous(enemy.rect.x, enemy.rect.y, enemy.rect.width, enemy.rect.height)
            explosion_group.add(explosion)
        clear_previous(enemy.rect.x, enemy.rect.y, enemy.rect.width, enemy.rect.height)

    for ufo in ufo_group:
        if ufo.rect.y >= WINDOW_HEIGHT:
            ufo_group.remove(ufo)
        if pygame.sprite.spritecollide(player, ufo_group, False):
            health -= 15
            clear_previous(20, 20, 100, 30)
            explosion = Sprites.Explosion(ufo.rect.x, ufo.rect.y)
            ufo_group.remove(ufo)
            clear_previous(ufo.rect.x, ufo.rect.y, ufo.rect.width, ufo.rect.height)
            explosion_group.add(explosion)
        clear_previous(ufo.rect.x, ufo.rect.y, ufo.rect.width, ufo.rect.height)

    for bomb in bomb_group:
        if pygame.sprite.spritecollide(player, bomb_group, False):
            health -= 20
            clear_previous(20, 20, 100, 30)
            bomb_sound.play()
            explosion = Sprites.Explosion(bomb.rect.x, bomb.rect.y)
            bomb_group.remove(bomb)
            clear_previous(bomb.rect.x, bomb.rect.y, bomb.rect.width, bomb.rect.height)
            explosion_group.add(explosion)
        if pygame.sprite.spritecollide(asteroid, bomb_group, True):
            bomb_sound.play()
            explosion = Sprites.Explosion(bomb.rect.x, bomb.rect.y)
            asteroid_group.remove(asteroid)
            explosion_group.add(explosion)
        if bomb_stopwatch.get_seconds() >= 3:
            bomb_group.remove(bomb)
            clear_previous(bomb.rect.x, bomb.rect.y, bomb.rect.width, bomb.rect.height)
        clear_previous(bomb.rect.x, bomb.rect.y, bomb.rect.width, bomb.rect.height)

    for mine in space_mine_group:
        if pygame.sprite.spritecollide(player, space_mine_group, False):
            health -= 20
            clear_previous(20, 20, 100, 30)
            space_mine_sound.play()
            explosion = Sprites.Explosion(mine.rect.x, mine.rect.y)
            space_mine_group.remove(mine)
            clear_previous(mine.rect.x, mine.rect.y, mine.rect.width, mine.rect.height)
            explosion_group.add(explosion)
        if pygame.sprite.spritecollide(asteroid, space_mine_group, True):
            space_mine_sound.play()
            explosion =  Sprites.Explosion(mine.rect.x, mine.rect.y)
            asteroid_group.remove(asteroid)
            explosion_group.add(explosion)
        if space_mine_stopwatch.get_seconds() >= 3:
            space_mine_group.remove(mine)
            clear_previous(mine.rect.x, mine.rect.y, mine.rect.width, mine.rect.height)
        clear_previous(mine.rect.x, mine.rect.y, mine.rect.width, mine.rect.height)

    for enemy_bullet in enemy_bullet_list:
        if enemy_bullet.rect.y >= WINDOW_HEIGHT:
            enemy_bullet_list.remove(enemy_bullet)
        if pygame.sprite.spritecollide(player, enemy_bullet_list, False):
            health -= 10
            clear_previous(20, 20, 100, 30)
            enemy_bullet_list.remove(enemy_bullet)
            clear_previous(enemy_bullet.rect.x, enemy_bullet.rect.y, enemy_bullet.rect.width, enemy_bullet.rect.height)
        clear_previous(enemy_bullet.rect.x, enemy_bullet.rect.y, enemy_bullet.rect.width, enemy_bullet.rect.height)

    if pygame.sprite.groupcollide(bullet_list, asteroid_group, True, True):
        score += 10
        clear_previous(20, 80, 200, 30)
        explosion = Sprites.Explosion(asteroid.rect.x, asteroid.rect.y)
        asteroid.hit = True
        explosion_group.add(explosion)

    if pygame.sprite.groupcollide(bullet_list, enemy_group, True, True):
        score += 20
        clear_previous(20, 80, 200, 30)
        explosion = Sprites.Explosion(enemy.rect.x, enemy.rect.y)
        enemy.hit = True
        enemy_group.add(explosion)

    if pygame.sprite.groupcollide(bullet_list, ufo_group, True, True):
        score += 25
        clear_previous(20, 80, 200, 30)
        explosion = Sprites.Explosion(ufo.rect.x, ufo.rect.y)
        ufo.hit = True
        explosion_group.add(explosion)

    if pygame.sprite.groupcollide(bomb_group, bullet_list, True, True):
        score += 15
        clear_previous(20, 80, 200, 30)
        explosion = Sprites.Explosion(bomb.rect.x, bomb.rect.y)
        bomb_sound.play()
        explosion_group.add(explosion)

    if pygame.sprite.groupcollide(space_mine_group, bullet_list, True, True):
        score += 15
        clear_previous(20, 80, 200, 30)
        explosion = Sprites.Explosion(mine.rect.x, mine.rect.y)
        space_mine_sound.play()
        explosion_group.add(explosion)

    if pygame.sprite.groupcollide(space_mine_group, ufo_group, True, True):
        bomb_sound.play()

    if pygame.sprite.groupcollide(bomb_group, ufo_group, True, True):
        bomb_sound.play()

    if pygame.sprite.groupcollide(space_mine_group, enemy_group, True, True):
        bomb_sound.play()

    if pygame.sprite.groupcollide(bomb_group, enemy_group, True, True):
        bomb_sound.play()

    if pygame.sprite.groupcollide(enemy_group, asteroid_group, True, True):
        bomb_sound.play()

    if pygame.sprite.spritecollide(player, stun_group, False):
        power_up_sound.play()
        stun_group.remove(stun)
        clear_previous(stun.rect.x, stun.rect.y, stun.rect.width, stun.rect.height)
        player.x_vel = 8
        player.y_vel = 8
        player_stun_stopwatch.reset()

    if pygame.sprite.spritecollide(player, ammo_power_up_group, False):
        power_up_sound.play()
        ammo += 10
        clear_previous(20, 50, 100, 30)
        ammo_power_up_group.remove(ammo_power_up)
        clear_previous(ammo_power_up.rect.x, ammo_power_up.rect.y, ammo_power_up.rect.width, ammo_power_up.rect.height)

    if pygame.sprite.spritecollide(player, health_power_up_group, False):
        power_up_sound.play()
        if health >= 90:
            diff = 100 - health
            health += diff
            clear_previous(20, 20, 200, 30)
        else:
            health += 10
            clear_previous(20, 20, 200, 30)
        health_power_up_group.remove(health_power_up)
        clear_previous(health_power_up.rect.x, health_power_up.rect.y, health_power_up.rect.width, health_power_up.rect.height)

    if health <= 0:
        game_over(score)

    window.blit(background.image, background.rect)

    text(20, 20, 20, "Comic Sans MS", "Health: " + str(health), WHITE)
    text(20, 50, 20, "Comic Sans MS", "Ammo: " + str(ammo), WHITE)
    text(20, 80, 20, "Comic Sans MS", "Score: " + str(score), WHITE)

    check_bounds(player)
    player_group.update()
    asteroid_group.update()
    explosion_group.update()
    enemy_group.update(enemy_bullet_list)
    bomb_group.update()
    space_mine_group.update()
    ufo_group.update(enemy_bullet_list)
    ammo_power_up_group.update()
    health_power_up_group.update()
    enemy_bullet_list.update()
    bullet_list.update()
    stun_group.update()

    bullet_list.draw(window)
    asteroid_group.draw(window)
    explosion_group.draw(window)
    enemy_group.draw(window)
    ufo_group.draw(window)
    bomb_group.draw(window)
    space_mine_group.draw(window)
    enemy_bullet_list.draw(window)
    player_group.draw(window)
    ammo_power_up_group.draw(window)
    health_power_up_group.draw(window)
    stun_group.draw(window)

    pygame.display.flip()
    clock.tick(FPS)

敌人等级代码...

class Enemy(pygame.sprite.Sprite):
  def __init__(self, img):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.image.load(img)
    self.rect = self.image.get_rect()
    self.hit = False
    self.vel_x = 5
    self.vel_y = 5
    self.laser_sound = pygame.mixer.Sound("Sprites/Efx/sfx_laser1.ogg")
    self.timer = Stopwatch.Stopwatch()

  def update(self, bullet_group):
    if self.hit == False:
        self.rect.y += self.vel_y

    if self.timer.get_seconds() >= .7:
        self.laser_sound.play()

        bullet = EnemyBullet()
        bullet.rect.x = self.rect.x + 20
        bullet.rect.y = self.rect.y + 50

        second_bullet = EnemyBullet()
        second_bullet.rect.x = self.rect.x + 65
        second_bullet.rect.y = self.rect.y + 50

        bullet_group.add(bullet)
        bullet_group.add(second_bullet)

        self.timer.reset()

这是错误...

Traceback (most recent call last):
  File "C:/Users/trist_000/PycharmProjects/SpaceWars/Game.py", line 763, in <module> main()
  File "C:/Users/trist_000/PycharmProjects/SpaceWars/Game.py", line 760, in main
    game_loop(player_img)
  File "C:/Users/trist_000/PycharmProjects/SpaceWars/Game.py", line 724, in game_loop
    enemy_group.update(enemy_bullet_list)
  File "C:\Users\trist_000\AppData\Local\Programs\Python\Python35\lib\site-packages\pygame\sprite.py", line 462, in update
    s.update(*args)
TypeError: update() takes 1 positional argument but 2 were given

推荐答案

通常该错误是因为您调用的方法只接受带有附加参数的 self.在这种情况下,您似乎正在使用定义为 def update(self) 的内容调用 .update(bullet_list) 并且方法调用中的隐式 self 是第一个2 个位置参数.

Usually that error is because you are calling a method that just takes self with an additional argument. In this case it looks like you are calling .update(bullet_list) with something that is defined as def update(self) and the implicit self in your method call is the first of the 2 positional args.

快速搜索您的代码并查看您设置的错误

Quickly searching through your code and looking at the error you set

enemy_group = pygame.sprite.Group()

然后调用 enemy_group.add(explosion) 这不是 Enemy 并且我假设没有自定义 .update定义在它上面.

and then call enemy_group.add(explosion) which isn't an Enemy and i assume doesn't have a custom .update defined on it.

将来我建议您查看 pdb.

这篇关于Pygame TypeError: update() 需要 1 个位置参数,但给出了 2 个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆