Pygame碰撞错误Python 3

2024-10-01 17:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python3.5.2创建一个简单的空间入侵者Python游戏。目前一切正常,但每当子弹击中我的外星人一侧的程序显示一个错误。 这是密码

import pygame
from pygame.locals import *

pygame.init()

width, height = 640, 480

keys=[False, False, False, False]
playerpos=[290,400]
alienpos=[]
bulletpos=[]
for i in range(100, 600, 100):
    for j in range(0, 150, 50):
        alienpos.append([i, j])

screen = pygame.display.set_mode((width, height))
space = pygame.image.load("space.jpg")
alien = pygame.image.load("alien.png")
bullet = pygame.image.load("bullet.png")
space = pygame.transform.scale(space,(width,height))

player = pygame.image.load("spacecraft.png")
flag1 = 0
flag2 = 0
switch = True


while 1:
    screen.fill(0)
    screen.blit(space,(0,0))

    for i in alienpos:

        for j in bulletpos:
            if i[1]<=j[1] and i[1]+28 >= j[1] and i[0]<=j[0] and i[0]+28 >= j[0]:
                alienpos.remove(i)

        screen.blit(alien, i)

        if (i[0] + 1) > 600:
            flag1 = 1
        elif (i[0] - 1) < 1:
            flag1 = 0
        if flag1 == 0:
            i[0] += 1
        elif flag1 == 1:
            i[0] -= 1    

    if not len(bulletpos)==0:
        for pos in bulletpos:
            if pos[1] > 0:
                screen.blit(bullet, pos)
                pos[1] -= 1
                pos=([playerpos[0], playerpos[1]])


    screen.blit(player, playerpos)


    pygame.display.flip()

    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key==K_w:
                keys[0]=True
            elif event.key==K_a:
                keys[1]=True
            elif event.key==K_s:
                keys[2]=True
            elif event.key==K_d:
                keys[3]=True
        if event.type == pygame.KEYUP:
            if event.key==pygame.K_w:
                keys[0]=False
            elif event.key==pygame.K_a:
                keys[1]=False
            elif event.key==pygame.K_s:
                keys[2]=False
            elif event.key==pygame.K_d:
                keys[3]=False

        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)

    if keys[1]:
        playerpos[0]-=5
    elif keys[3]:
        playerpos[0]+=5
    elif keys[0]:
        bulletpos.append([playerpos[0], playerpos[1]])

当子弹击中外星人一侧时,程序停止并出现以下错误。你知道吗

Traceback (most recent call last):
  File "Python35\game.py", line 36, in <module>
    alienpos.remove(i)
ValueError: list.remove(x): x not in list

在StackOverflow有很多关于这个问题的类似问题,但是没有一个建议有什么帮助。如果有任何更多的信息,你们都需要我很乐意评论。提前谢谢!你知道吗


Tags: keyineventfalseforifspacekeys
1条回答
网友
1楼 · 发布于 2024-10-01 17:27:06

问题是因为您从列表中删除了alien,但稍后您仍然将此alien与其他bullets进行检查,而其他bullet可能会与此alien发生冲突,并且您尝试再次删除相同的alien-但此alien不存在于列表中。你知道吗

您可以使用break离开for循环并跳过与其他bullets的冲突检查。你知道吗

    for j in bulletpos:
        if i[1]<=j[1] and i[1]+28 >= j[1] and i[0]<=j[0] and i[0]+28 >= j[0]:
            alienpos.remove(i)
            break

顺便说一句:您可以这样组织代码:

我使用pygame.Rect().get_rect())来保持对象的位置,然后我可以使用pygame函数来检查冲突。你知道吗

pygame.Rect()具有属性leftrighttopbottomcenter,等等。因此比较位置更容易,例如player_rect.right == screen_rect.right,或者将中心放在屏幕上player_rect.center = screen_rect.center

Pygame有函数pygame.key.get_pressed(),您不必创建自己的列表keys

我使用event only来触发项目符号,因为当我按下按钮时pygame.key.get_pressed()会触发项目符号。但我只想在压力下开火一次。你知道吗

import pygame

#  - constants  - (UPPER_CASE names)

WIDTH  = 640
HEIGHT = 480

BLACK = (  0,   0,   0)
WHITE = (255, 255, 255)

#  - main  - (lower_case names)

# - init -

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
screen_rect = screen.get_rect()

# - objects -

background = pygame.image.load("space.jpg")
background = pygame.transform.scale(background, (WIDTH, HEIGHT))

alien = pygame.image.load("alien.png")
bullet = pygame.image.load("bullet.png")

aliens = []
bullets = []

for x in range(100, 600, 100):
    for y in range(0, 150, 50):
        aliens.append(alien.get_rect(x=x, y=y))

player = pygame.image.load("spacecraft.png")
player_rect = player.get_rect(x=290, y=400)

# - other -

move_right = True

# - mainloop -

while True:

    # - events -

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            #exit(0)
        elif event.type == pygame.KEYDOWN:
            if event.key in (pygame.K_SPACE, pygame.K_w):
                # add bullet
                bullets.append(bullet.get_rect(center=player_rect.center))

    # - updates (without draws) -

    keys = pygame.key.get_pressed()

    # move player

    if keys[pygame.K_a] or keys[pygame.K_LEFT]:
        player_rect.x -= 5
        if player_rect.left < screen_rect.left:
            player_rect.left = screen_rect.left
    elif keys[pygame.K_d] or keys[pygame.K_RIGHT]:
        player_rect.x += 5
        if player_rect.right > screen_rect.right:
            player_rect.right = screen_rect.right

    # move bullets

    for b in bullets:
        if b.bottom > screen_rect.top:
             b.y -= 1

    # move aliens

    switch_direction = False

    for a in aliens:
        if move_right:
            a.x += 1
            if a.right >= screen_rect.right:
                switch_direction = True
        else:
            a.x -= 1
            if a.left <= screen_rect.left:
                switch_direction = True

    if switch_direction:
        move_right = not move_right
        for a in aliens:
            a.y += 5

    # check collisions

    temp_aliens = []

    for a in aliens:
        for b in bullets:
            if b.colliderect(a):
                bullets.remove(b)
                break
        else:
            temp_aliens.append(a)

    aliens = temp_aliens

    # - draws (without updates) -

    #screen.fill(BLACK)
    screen.blit(background, (0,0))

    for a in aliens:
        screen.blit(alien, a)

    for b in bullets:
        screen.blit(bullet, b)

    screen.blit(player, player_rect)
    pygame.display.flip()

相关问题 更多 >

    热门问题