1

Hey i am trying to make fruit catcher game in python using pygame but the fruits somehow get struck on screen(screenshot attached).The fruits and basket are getting screeched on the screen. I have also tried adding user defined events but then also the fruits images are getting screeched on the output screen. Can someone tell me what I am doing wrong?

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()


Rabbid76
  • 202,892
  • 27
  • 131
  • 174
  • does this helps: https://stackoverflow.com/questions/66251296/pygame-image-smudging-leaving-a-trail-on-the-screen? – Pygirl May 27 '21 at 07:57

2 Answers2

1

Credit: https://stackoverflow.com/a/44686333/6660373 You need to add background before updating your fruits and basket. add these two lines:


    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()

enter image description here

Pygirl
  • 12,969
  • 5
  • 30
  • 43
1

You have to clear the display or draw the background in the application loop. Loading an image is a very time consuming operation. Load the background image once before the application loop, but blit it continuously in the loop:

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)

The typical PyGame application loop has to:

Rabbid76
  • 202,892
  • 27
  • 131
  • 174