【问题标题】:Pygame: How do i make Fruits fall randomly without them getting struck on screen? [duplicate]Pygame:如何让水果随机掉落而不会卡在屏幕上? [复制]
【发布时间】:2021-05-27 16:23:24
【问题描述】:

嘿,我正在尝试使用 pygame 在 python 中制作水果捕手游戏,但水果以某种方式在屏幕上被击中(附截图)。水果和篮子在屏幕上发出刺耳的声音。我也尝试过添加用户定义的事件,但水果图像也在输出屏幕上发出刺耳的声音。谁能告诉我我做错了什么?

import pygame
import time,random,sys
from pygame.locals import *

screenWidth=800
screenHeight=600

pygame.init()

screen=pygame.display.set_mode((screenWidth,screenHeight))
pygame.display.set_caption("Fruit Catcher")

white=(255,255,255)
black=(0,0,0)
red=(255,0,0)

pygame.mixer.init()

clock=pygame.time.Clock()

font=pygame.font.SysFont("City Blueprint",50)
smallfont=pygame.font.SysFont("City Blueprint",20)


class Basket(pygame.sprite.Sprite):
    def __init__(self):
        super(Basket,self).__init__()
        self.image=pygame.image.load("basket.png").convert_alpha()
        self.image=pygame.transform.scale(self.image,(100,70))
        self.rect=self.image.get_rect()
        self.rect.x=0
        self.rect.y=screenHeight-100
    def update(self,pressed_keys):
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-5,0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(5,0)
        if self.rect.left<0:
            self.rect.left=0
        if self.rect.right>screenWidth:
            self.rect.right=screenWidth


class Fruits(pygame.sprite.Sprite):
    def __init__(self,img):
        super(Fruits,self).__init__()
        self.image=pygame.image.load(img).convert_alpha()
        self.image=pygame.transform.scale(self.image,(20,20))
        self.rect=self.image.get_rect()
        self.rect.x=random.randrange(screenWidth)
        self.rect.y=0
        self.speed=random.randint(1,7)
    def update(self):
        self.rect.y+=self.speed
        if self.rect.bottom>screenHeight:
            self.kill()

fruitsgroup=pygame.sprite.Group()
allsprites=pygame.sprite.Group()

fruits=["apple.png","guava.png","strawberry.png"]

def createBasket():
    basket=Basket()
    allsprites.add(basket)
    return basket

def createFruits():
    fruit=Fruits(random.choice(fruits))
    fruitsgroup.add(fruit)
    allsprites.add(fruit)
    return fruit

def start():
    screen.blit(pygame.image.load("background.jpg"),(0,0))
    fruitsgroup.empty()
    allsprites.empty()
    basket=createBasket()
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                return
        
        pressedkeys=pygame.key.get_pressed()
        basket.update(pressedkeys)
        fruitsgroup.update()
        if random.randrange(100)<2:
            createFruits()
        allsprites.draw(screen)
        clock.tick(30)
        pygame.display.update()
        

start()
pygame.quit()


【问题讨论】:

标签: python pygame


【解决方案1】:

您必须在应用程序循环中清除显示或绘制背景。加载图像是一项非常耗时的操作。在应用循环之前加载一次背景图片,但blit在循环中不断地加载:

def start():
    
    # load and scale background
    background = pygame.image.load("background.jpg"))
    background = pygame.transform.scale(background, (screenWidth,screenHeight))
    
    fruitsgroup.empty()
    allsprites.empty()
    basket=createBasket()
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                return
        
        pressedkeys=pygame.key.get_pressed()
        basket.update(pressedkeys)
        fruitsgroup.update()
        if random.randrange(100)<2:
            createFruits()
        
        # clear screen / draw background
        screen.blit(background, (0, 0))
        
        allsprites.draw(screen)
        pygame.display.update()
        clock.tick(30)

典型的 PyGame 应用程序循环必须:

【讨论】:

  • 是的,我明白了!非常感谢!
  • @KinjalThacker 谢谢。不客气。
【解决方案2】:

信用:https://stackoverflow.com/a/44686333/6660373 您需要在更新水果和篮子之前添加背景。 添加这两行:


    screen.fill((0,0,0)) 
    screen.blit(pygame.image.load("background.jpg"),(0,0)) 

def start():
    screen.blit(pygame.image.load("background.jpg"),(0,0))
    fruitsgroup.empty()
    allsprites.empty()
    basket=createBasket()
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                return

        screen.fill((0,0,0)) # <--------------- here
        screen.blit(pygame.image.load("background.jpg"),(0,0)) #<-----------here
        
        pressedkeys=pygame.key.get_pressed()

【讨论】:

  • 成功了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2020-04-26
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多