[英]Pygame module errors with collsions
I've been working on a shmup game for quite some time. 我一直在做一个大型游戏。 One of the issues that I get constantly are with collisions. 我经常遇到的问题之一就是碰撞。 The thing is, my code appears to be totally correct, but I'm getting errors from the pygame module itself! 问题是,我的代码似乎是完全正确的,但是我从pygame模块本身中得到了错误!
Example: 例:
Traceback (most recent call last):
File "/home/pi/shooter_modified(1).py", line 101, in <module>
hitregistry = pygame.sprite.groupcollide(enemies, player, True, True)
File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 1549, in groupcollide
for s in groupa.sprites():
AttributeError: 'list' object has no attribute 'sprites'
Is this some sort of issue with my own code or and issue with the pygame module itself? 这是我自己的代码出现问题还是pygame模块本身出现问题? Here's my code: 这是我的代码:
import pygame,random,os
from pygame.locals import *
'initialize pygame'
pygame.init()
'set variables'
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
black = (0,0,0)
white = (255,255,255)
width = 1280
height = 720
'create window'
screen = pygame.display.set_mode((1280,720))
clock = pygame.time.Clock()
'sprite groups'
all_sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()
enemies = pygame.sprite.Group()
pygame.display.set_caption("kamikaze base defense")
'classes'
class Player(pygame.sprite.Sprite):
def __init__(self):
self.x, self.y = pygame.mouse.get_pos()
pygame.sprite.Sprite.__init__(self)
#self.image = pygame.Surface((32,32))++--3
#$self.image.fill((green))
self.image = pygame.image.load("vehicle.png")
self.image.set_colorkey(white)
self.rect = self.image.get_rect()
self.rect.center = (width/2,700)
self.speed = 0
def update(self):
self.keypress = pygame.key.get_pressed()
if self.keypress[pygame.K_a]:
self.speed = 3
self.rect.x -= self.speed
if self.keypress[pygame.K_d]:
self.speed = 3
self.rect.x += self.speed
#self.rect.x += 1
if self.rect.left > width:
self.rect.right = 0
if self.rect.right < 0:
self.rect.left = 1280
def shoot(self):
bullet = Bullet(self.rect.centerx,self.rect.top)
all_sprites.add(bullet)
class Enemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("missile.png")
self.rect = self.image.get_rect()
self.rect.x = random.randrange(50,width)
self.rect.y = random.randrange(-100,-40)
self.speedy = random.randrange(1,5)
self.speedx = random.randrange(0,3)
def update(self):
self.rect.y = self.rect.y + self.speedy
self.rect.x = self.rect.x + self.speedx
if self.rect.top > height:
self.rect.x = random.randrange(50,width)
self.rect.y = random.randrange(-200,-100)
self.speedy = random.randrange(1,6)
class Bullet(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((5,10))
self.image.fill(red)
self.rect = self.image.get_rect()
self.speedy = -5
def update(self):
self.rect.y -= 5
if self.rect.bottom < 0:
self.kill()
enemies = []
player = Player()
enemy1 = Enemy()
enemy2 = Enemy()
enemy3 = Enemy()
enemy4 = Enemy()
all_sprites.add(enemy1)
all_sprites.add(enemy2)
all_sprites.add(enemy3)
all_sprites.add(enemy4)
enemies.append(enemy1)
enemies.append(enemy2)
enemies.append(enemy3)
enemies.append(enemy4)
pygame.init()
while True:
pygame.event.pump()
'main loop'
all_sprites.add(player)
screen.fill(black)
all_sprites.draw(screen)
hitregistry = pygame.sprite.groupcollide(enemies, player, True, True)
if hitregistry:
print("hit!")
pygame.quit()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
bullet = Bullet()
bullet.rect.x = player.rect.x +50
bullet.rect.y = player.rect.y
all_sprites.add(bullet)
bullets.add(bullet)
bullets.draw(screen)
bullethits = pygame.sprite.groupcollide(enemies,bullets,True,True)
if bullethits:
print("hit!")
Your error is happening here: 您的错误在这里发生:
hitregistry = pygame.sprite.groupcollide(enemies, player, True, True)
groupcollide()
requires two Sprite Groups as arguments. groupcollide()
需要两个Sprite组作为参数。 You're using it correctly when you are doing enemies
versus bullets
, but here you are passing it enemies
(a Group) and player
(not a Group). 当您对enemies
和bullets
进行enemies
时,您可以正确使用它,但是在这里,您可以将enemies
(一个组)和一个player
(而不是一个组)传递给它。 You probably want to use spritecollide()
instead, which tests a Sprite versus a Group: 您可能想改用spritecollide()
来测试Sprite和Group:
hitregistry = pygame.sprite.spritecollide(player, enemies, True)
Also, why do you have all_sprites.add(player)
inside your while
loop? 另外,为什么在while
循环中有all_sprites.add(player)
? You are adding the player to the group every frame... 您正在每帧将播放器添加到组中...
pygame.sprite.groupcollide
first two arguments are of type pygame.sprite.Group
, but you're giving it a list
and a Player
. pygame.sprite.groupcollide
前两个参数的类型为pygame.sprite.Group
,但是您要为其提供一个list
和一个Player
。
So, instead of enemies = []
and enemies.append(enemy1)
, you should try enemies = Group()
and enemies.add(enemy1)
. 因此,您应该尝试使enemies = Group()
和enemies = Group()
enemies.append(enemy1)
而不是enemies = []
和enemies = Group()
enemies.add(enemy1)
。 Other changes may be necessary. 可能需要其他更改。 Similarly for the player. 玩家也一样。 Try looking into the pygame documentation . 尝试查看pygame文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.