当玩家与垃圾精灵碰撞时分数不会增加

时间:2021-07-22 02:50:46

标签: python pygame sprite collision

我正在尝试运行我 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()

1 个答案:

答案 0 :(得分:0)

pygame.sprite.spritecollide 不返回布尔值,而是一个包含与另一个 Sprite 相交的 Group 中所有 Sprite 的列表

if col == True:

col = pygame.sprite.spritecollide(player,basket)
if col:
    score += 1
    pocket = 0

另见How do I check if a list is empty?