Проблема со спрайтами В питоне(pygame)
столкнулся с проблемой, есть программа, где ездит машинка(с помощью стрелок ), подъезжает к спрайту, и при нажатии на пробел около спрайта он должен пропасть и должен воспроизвестись соответственный звук. Спрайты, которые нужно взять, появляются раз в секунду. Проблема заключается в том, что на экране спрайт подразумевается и берется, при нажатии пробела, но его не видно)
На изображении на самом деле больше 40 cпрайтов(тракторов)При появлении нового спрайта старый удаляется, но продолжает функционировать))) Помогите пожалуйста)
Все используемые файлы(за исключением модуля pygame) и файл с программой в архиве здесь - https://yadi.sk/d/srMDGjW9Xg6Jlg
Все звуки пробные, потом заменю на подходящие.
Заранее всем спасибо) Надеюсь хоть кто ни будь откликнется(
Ответы (1 шт):
Вы неправильно итерировались по "еде", я исправил цикл почти в конце программы и стало показывать:
import pygame, sys, time, random
from pygame.locals import *
# Установка pygame
pygame.init()
mainClock = pygame.time.Clock()
# Настройка окна
WINDOWWIDTH = 1000
WINDOWHEIGHT = 1000
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption('Спрайты и звуки')
# Настройка цвета
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
# Создание структур данных блока
car = pygame.Rect(500, 300, 40, 40)
imageCarLeft = pygame.image.load('carL.gif')
carLStretchedImage = pygame.transform.scale(imageCarLeft, (40, 40))
foodImage = pygame.image.load('90695.jpg')
foodCounter = 0
NEWFOOD = 40
FOODSIZE = 20
foods = []
for i in range(20):
foods.append(pygame.Rect(random.randint(0, WINDOWWIDTH - 20), random.randint(0, WINDOWHEIGHT - 20), 20, 20))
# создание переменных клавиатуры
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
MOVESPEED = 6
#Настройка музыки
avaria = pygame.mixer.Sound('avaria.wav')
benzin = pygame.mixer.Sound('benzin.wav')
pygame.mixer.music.load('dvigatel.wav')
pygame.mixer.music.play(-1, 0.0)
musicPlaying = True
# Запуск игрового цикла
while True:
# проверка событий
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
#Изменение переменных клавиатуры
if event.key == K_LEFT or event.key == K_a:
moveRight = False
moveLeft = True
if event.key == K_RIGHT or event.key == K_d:
moveLeft = False
moveRight = True
if event.key == K_UP or event.key == K_w:
moveDown = False
moveUp = True
if event.key == K_DOWN or event.key == K_s:
moveUp = False
moveDown = True
if event.type == KEYUP:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == K_LEFT or event.key == K_a:
moveLeft = False
if event.key == K_RIGHT or event.key == K_d:
moveRight = False
if event.key == K_UP or event.key == K_w:
moveUp = False
if event.key == K_DOWN or event.key == K_s:
moveDown = False
if event.key == K_x:
car.top = random.randint(0, WINDOWHEIGHT - car.height)
car.left = random.randint(0, WINDOWWIDTH - car.width)
if event.key == K_m:
if music.playing:
pygame.mixer.music.stop()
else:
pygame.mixer.music.play(-1, 0.0)
musicPlaying = not musicPlaying
if event.type == MOUSEBUTTONUP:
foods.append(pygame.Rect(event.pos[0] - 10, event.pos[1] - 10, 20, 20))
foodCounter += 1
if foodCounter >= NEWFOOD:
# Добавление новой "еды"
foodCounter = 0
foods.append(pygame.Rect(random.randint(0, WINDOWWIDTH - 20), random.randint(0, WINDOWHEIGHT - 20), 20, 20))
#Создание белого фона
windowSurface.fill(WHITE)
#Перемещение игрока
if moveDown and car.bottom < WINDOWHEIGHT:
car.top += MOVESPEED
if moveUp and car.top > 0:
car.top -= MOVESPEED
if moveLeft and car.left > 0:
car.left -= MOVESPEED
if moveRight and car.right < WINDOWWIDTH:
car.right += MOVESPEED
if moveDown and car.bottom == WINDOWHEIGHT:
avaria.play
if moveUp and car.top == 0:
avaria.play
if moveLeft and car.left == 0:
avaria.play
if moveRight and car.right == WINDOWWIDTH:
avaria.play
windowSurface.blit(carLStretchedImage, car)
# Проверка, не пересекся ли игрок с блоками "еды".
for food in foods[:]:
if car.colliderect(food) and event.type == KEYDOWN:
if event.key == K_SPACE:
foods.remove(food)
if musicPlaying:
benzin.play()
# ----> Исправил этот цикл <----
for food in foods:
windowSurface.blit(foodImage, food)
# Вывод окна на экран
pygame.display.update()
mainClock.tick(40 )