Python 开火。检查矩形列表是否与播放器矩形冲突

Python 开火。检查矩形列表是否与播放器矩形冲突,python,pygame,Python,Pygame,我知道我需要一个循环来检查子弹清单是否击中玩家。 我已经试着在网上搜索了2个小时的参考代码,但都使用精灵和类 #Bullet Collision with players for i in range(len(bullets_2)): #player is a rectangle style object if bullets_2[i].colliderect(player): player_health -= 10 可悲的是,我的计算机科学老师没有教全班同学关于精

我知道我需要一个循环来检查子弹清单是否击中玩家。 我已经试着在网上搜索了2个小时的参考代码,但都使用精灵和类

#Bullet Collision with players

for i in range(len(bullets_2)):
 #player is a rectangle style object
    if bullets_2[i].colliderect(player):
        player_health -= 10
可悲的是,我的计算机科学老师没有教全班同学关于精灵或课程,所以让我们避免这样做

我尝试让上面的代码检查列表是否与矩形播放器冲突

上面代码的要点是,如果敌方玩家的子弹击中玩家,游戏将从健康栏中获取健康

编辑: 我只有大约8天的时间来完成这场比赛

TLDR:
如何检查列表是否与矩形冲突。

如注释所示,代码如下

这是我正在使用的

import pygame, time, sys
from pygame.locals import *

pygame.init()

screen = pygame.display.set_mode((800,600))
clock = pygame.time.Clock()

class playerClass(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("player.png").convert()
        self.image.set_alpha(196)
        self.rect = self.image.get_rect()
        self.rect.y = 260
        self.rect.x = 500
    def update(self):
        pass

class bulletClass(pygame.sprite.Sprite):
    def __init__(self, speed, starty):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bullet.png").convert()
        self.rect = self.image.get_rect()
        self.rect.y = starty
        self.rect.x = 0
        self.speed = speed
    def update(self):
        self.rect.x += self.speed

gameExit = False
player = playerClass()
bullet1 = bulletClass(7,265)
bullet2 = bulletClass(10,295)
bullet3 = bulletClass(7,325)
bulletSprites = pygame.sprite.RenderPlain((bullet1, bullet2, bullet3))
playerSprites = pygame.sprite.RenderPlain((player))

bulletRectList = [bullet1.rect, bullet2.rect, bullet3.rect]

while not gameExit:
    for event in pygame.event.get():

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

    screen.fill((255,255,255))

    bulletSprites.update()
    bulletSprites.draw(screen)

    playerSprites.update()
    playerSprites.draw(screen)

    collidedBulletList = player.rect.collidelistall(bulletRectList)

    if len(collidedBulletList) > 0:
        for i in collidedBulletList:
            print(i)


    pygame.display.update()
    clock.tick(10)
在这段代码中,如果要添加项目符号,只需声明一个新对象

bullet4 = bulletClass(speed, yCoordinateToBeginWith)

并将其附加到bulletSprites和bulletRectList中,就完成了。使用精灵简化了这一点。让你的代码精灵变得友好在一开始是很困难的,但在之后附加它肯定很容易。

“很遗憾,我的计算机科学老师没有教我们关于精灵或类的课程,所以我们还是避免吧。”-但这并不意味着你不能学习它,也不能领先于你的班级:-)我对如何制作和使用精灵做了一些概述。我知道你可能不想学习如何使用精灵,但从长远来看,它们会比普通的形状更方便使用。忘了说我只有不到一周的时间来完成这场比赛。我的时间有点紧。或者,对于这个,你可能需要一个所有项目符号矩形的列表。最好使用CollizeListAll,它返回与给定矩形相交的所有矩形的列表,而不是CollizeList,它只返回第一个相交矩形的索引。您发布的代码应该可以工作(如果没有,您必须发布一个),但是你必须在子弹碰撞后将其从列表中删除,否则每帧会使玩家减少10点生命。请记住,在对列表或其他可编辑项进行迭代/循环时,不应修改它们,而应创建一个新的筛选列表。@GLaDOS我尝试了CollizeListAll,但出现了一个错误“Trace-back error(最近的调用)参数必须是一系列rect样式的对象”。我想分别检查两名球员的碰撞情况#子弹与范围内i的玩家发生碰撞(len(bullets_2)):#如果子弹_2[i],则玩家是矩形样式的对象。碰撞Rect(玩家):玩家_health-=10