我是一名Python初学者,正在学习使用Pygame构建简单游戏,在游戏中玩家(猴子)试图从屏幕顶部接住尽可能多的香蕉。
我的问题是如何让香蕉在每个x秒内单独生成并下落。不管是它们同时产生,还是如果我使用time.sleep,会暂停香蕉在空中。甚至在彻底迷失后使用了线程。
我的代码中相关组件如下:
catch_game
import sys
import pygame
from pygame.sprite import Group
from settings import Settings
# from background import Background
from monkey import Monkey
from banana import Banana
import functions
def run_game():
pygame.init()
settings = Settings()
screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
pygame.display.set_caption('Monkey Catch')
monkey = Monkey(screen, settings)
# background = Background((0, 0), screen)
bananas = Group()
functions.create_banana(screen, settings, bananas)
while True:
monkey.movement()
functions.check_events(monkey)
functions.update_screen(screen, settings, monkey, bananas)
functions.update_banana(monkey, bananas)
run_game()
香蕉
import pygame
from pygame.sprite import Sprite
from random import randint
class Banana(Sprite):
def __init__(self, screen, settings):
super(Banana, self).__init__()
self.screen = screen
self.settings = settings
self.image = pygame.image.load('E:\PycharmProjects\catch\images/banana.png')
self.rect = self.image.get_rect()
self.screen_rect = self.screen.get_rect()
self.y = self.screen_rect.top
self.y = float(self.rect.y)
self.x = randint(0, 1150)
self.speed = settings.banana_fallspeed
def update(self):
'''Banana falls down'''
self.y += self.settings.banana_fallspeed
self.rect.y = self.y
self.rect.x = self.x
def blit(self):
self.screen.blit(self.image, self.rect)
函数
import pygame
import sys
from banana import Banana
import threading
import time
def update_screen(screen, settings, monkey, bananas):
screen.fill([255, 255, 255])
# background.blit()
monkey.blit()
for banana in bananas:
banana.update()
bananas.draw(screen)
pygame.display.flip()
def keydown_events(event, monkey):
if event.key == pygame.K_RIGHT:
monkey.moving_right = True
if event.key == pygame.K_LEFT:
monkey.moving_left = True
def keyup_events(event, monkey):
if event.key == pygame.K_RIGHT:
monkey.moving_right = False
if event.key == pygame.K_LEFT:
monkey.moving_left = False
def check_events(monkey):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
keydown_events(event, monkey)
if event.type == pygame.KEYUP:
keyup_events(event, monkey)
def create_banana(screen, settings, bananas):
banana = Banana(screen, settings)
bananas.add(banana)
def update_banana(monkey, bananas):
'''kill bananas, collisions with monkey'''
for banana in bananas.copy():
if banana.rect.bottom >= 720:
bananas.remove(banana)
collision = pygame.sprite.spritecollide(monkey, bananas, True)
if collision:
bananas.remove(banana)
# time.sleep(2)
# fall_interval = banana.threading.Timer(3, create_banana(screen, settings, bananas))
# fall_interval.start()
pygame.event
。每个事件类型都与一个唯一的ID相关联,范围从NOEVENT(0)到NUMEVENTS(32)。事件ID范围从USEREVENT(24)到NUMEVENTS(32)保留给“用户”,可以由计时器使用(参见pygame.time.set_timer()
)。 - Rabbid76