我正在尝试运行我 4 年前编写的 Pygame 程序,但它无法正常工作。当玩家与垃圾精灵碰撞时,垃圾精灵应该消失并且“口袋”值应该增加。但是,当玩家与垃圾精灵发生碰撞时,什么也不会发生。我在 Python/Pygame 上很生疏,需要帮助来从语义上确定这里出了什么问题。垃圾列表是一组图像和副本。让我知道是否应该包含精灵文件。
编辑:当玩家当前与垃圾精灵发生碰撞时按下空格键时,应发生上述动作。
import pygame
import sys
import random
import time
from trash_sprite import Trash
from player import Player
from tide_waves import tide
from basket import basket
pygame.init()
# Initialization
check_errors = pygame.init() # should be (6, 0), 6 is processes initialized, 0 is errors
if check_errors[1] > 0 :
print("Error!: Had {0} initializing errors, quitting ...".format(check_errors[1]))
print("Errors: " + str(check_errors))
else :
print("(+) Pygame successfully intialized!")
#Screen Display
screen_width = 720
screen_height = 460
#screen = pygame.display.set_mode((screen_width, screen_height))
screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
background = pygame.image.load("images/Beach.png")
pygame.display.set_caption("Beach Cleanup")
# Sprites
all_sprites_list = pygame.sprite.Group()
#Player
player = Player(340, 200)
all_sprites_list.add(player)
# Tide
tide = tide(0,-250)
all_sprites_list.add(tide)
# Basket
basket = basket(24,415)
all_sprites_list.add(basket)
# Trash List
trash_list = pygame.sprite.Group()
# Images for separate trash pieces
trashy = ["images/apple.png", "images/banana.png", "images/bucket.png", "images/cigarette.png", "images/diaper.png"]
for i in range(65):
trash = Trash(200,200)
trash_image = random.choice(trashy)
trash.image = pygame.image.load(trash_image).convert_alpha()
trash.rect.x = random.randrange(50,screen_width-50)
trash.rect.y = random.randrange(150,screen_height-40)
trash_list.add(trash)
all_sprites_list.add(trash)
# Player Facing Direction
direction = 'up'
# Score
score = 0
red = (233,21,68)
def showScore() :
sFont = pygame.font.SysFont('monaco', 24)
Ssurf = sFont.render("Score: {0}".format(score), True, red)
Srect = Ssurf.get_rect()
Srect.midtop = (50, 25)
screen.blit(Ssurf,Srect)
# Pocket Function
pocket = 0
def showPocket():
sFont = pygame.font.SysFont('monaco', 24)
Psurf = sFont.render("Pocket: {0}".format(pocket), True, red)
Prect = Psurf.get_rect()
Prect.midtop = (54, 45)
screen.blit(Psurf,Prect)
# Timer Variables
clock = pygame.time.Clock()
start_ticks=pygame.time.get_ticks() #starter tick
def gameTimer():
seconds=int((pygame.time.get_ticks()-start_ticks)/1000) #calculate how many seconds
font = pygame.font.SysFont('monaco', 24)
print (seconds) #print how many seconds
text = font.render("Timer: {0}".format(30-seconds), True, red)
trect = text.get_rect()
trect.midtop = (50, 65)
screen.blit(text, trect)
return seconds
# Basket Collision
def collided_with(self,player,basket):
global score
global pocket
col = pygame.sprite.spritecollide(player,basket)
if col == True:
score += 1
pocket = 0
def timesup():
sFont = pygame.font.SysFont('monaco', 56)
Gsurf = sFont.render("Time's Up!", True, red)
Grect = Gsurf.get_rect()
Grect.midtop = (360, 230)
screen.blit(Gsurf,Grect)
# Gameloop
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE :
pygame.event.post(pygame.event.Event(pygame.QUIT))
# Main sprite movement
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT] or keys[pygame.K_d]:
player.moveRight(4)
direction = 'right'
if keys[pygame.K_LEFT] or keys[pygame.K_a]:
player.moveLeft(4)
direction = 'left'
if keys[pygame.K_UP] or keys[pygame.K_w]:
player.moveUp(4)
direction = 'up'
if keys[pygame.K_DOWN] or keys[pygame.K_s]:
player.moveDown(4 )
direction = 'down'
if player.rect.x > screen_width:
player.rect.x -= screen_width
elif player.rect.x < 0:
player.rect.x += screen_width
if player.rect.y > screen_height:
player.rect.y -= screen_height
elif player.rect.y < 0:
player.rect.y += screen_height
# Sprite Collision:
trash_hit_list = pygame.sprite.spritecollide(player, trash_list, False)
for trash in trash_hit_list:
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
if pocket < 7:
pocket += 1
score += 1
trash_list.remove(trash)
trash_list.update
all_sprites_list.remove(trash)
col = pygame.sprite.collide_rect(player,basket)
if col == True:
if pocket <= 7 and pocket!=0:
if event.type == pygame.KEYDOWN and event.key == pygame.K_LSHIFT:
score += 2
pocket = 0
# Player Graphic
if direction == 'right':
player.image = pygame.image.load("images/character_right.png").convert_alpha()
if direction == 'left':
player.image = pygame.image.load("images/character_left.png").convert_alpha()
if direction == 'up':
player.image = pygame.image.load("images/character_up.png").convert_alpha()
if direction == 'down':
player.image = pygame.image.load("images/character_down.png").convert_alpha()
# Display
screen.blit(background,(0,0))
trash_list.draw(screen)
basket.draw(screen)
player.draw(screen)
tide.draw(screen)
#Timer
seconds = gameTimer()
# Tide
tide.tide_movement()
# Update
showScore()
showPocket()
pygame.display.flip()
clock.tick(30)
print(pygame.time.get_ticks())
if seconds == 30:
timesup()
pygame.display.flip()
time.sleep(6)
break
pygame.quit()
答案 0 :(得分:0)
pygame.sprite.spritecollide
不返回布尔值,而是一个包含与另一个 Sprite 相交的 Group 中所有 Sprite 的列表
if col == True:
col = pygame.sprite.spritecollide(player,basket)
if col:
score += 1
pocket = 0