How do I use blit() in the proper way in pygame? [duplicate]

I was trying to make a texture game, but it doesn't work with no errors. I'll show the code.

import time
import pygame
from pygame.locals import *

def Main():
    pygame.mixer.init()

    pygame.mixer.music.load(r"C:\...\OMFG+-+Ice+Cream.mp3")
    pygame.mixer.music.play(-1)

    pygame.init()

    screen = pygame.display.set_mode((640, 480))
    screen.fill((0,0,0))
    pygame.display.set_caption("3 Minutes Left!!!")

    font = pygame.font.Font('freesansbold.ttf', 18)

    intro_1 = font.render('3', True, (255,255,255))
    intro_2 = font.render('Minutes', True, (255,255,255))
    intro_3 = font.render('Left!!!', True, (255,255,255))

    time.sleep(1)
    screen.blit(intro_1, (140, 30)) #This isn't working.
    time.sleep(1)
    screen.blit(intro_2, (340, 30)) #This isn't working.
    time.sleep(1)
    screen.blit(intro_3, (540, 30)) #This isn't working.

Main()

I thought that the code screen.blit would work with while loops. So I tried.

import time
import pygame
from pygame.locals import *

def Main():
    pygame.mixer.init()

    pygame.mixer.music.load(r"C:\...\OMFG+-+Ice+Cream.mp3")
    pygame.mixer.music.play(-1)

    pygame.init()

    screen = pygame.display.set_mode((640, 480))
    screen.fill((0,0,0))
    pygame.display.set_caption("3 Minutes Left!!!")

    font = pygame.font.Font('freesansbold.ttf', 18)

    intro_1 = font.render('3', True, (255,255,255))
    intro_2 = font.render('Minutes', True, (255,255,255))
    intro_3 = font.render('Left!!!', True, (255,255,255))

    while True: #This isn't working.
        time.sleep(1)
        screen.blit(intro_1, (140, 30)) #This isn't working.
        time.sleep(1)
        screen.blit(intro_2, (340, 30)) #This isn't working.
        time.sleep(1)
        screen.blit(intro_3, (540, 30)) #This isn't working.

Main()

And I started the program. But pygame tab had no response. So i tried the screen.blit in a definition.

import time
import pygame
from pygame.locals import *

def Main():
    pygame.mixer.init()

    pygame.mixer.music.load(r"C:\...\OMFG+-+Ice+Cream.mp3")
    pygame.mixer.music.play(-1)

    pygame.init()

    screen = pygame.display.set_mode((640, 480))
    screen.fill((0,0,0))
    pygame.display.set_caption("3 Minutes Left!!!")

    font = pygame.font.Font('freesansbold.ttf', 18)

    intro_1 = font.render('3', True, (255,255,255))
    intro_2 = font.render('Minutes', True, (255,255,255))
    intro_3 = font.render('Left!!!', True, (255,255,255))

    while True: #This isn't working.
        screen_blit(screen, intro_1, intro_2, intro_3) #This isn't working.

def screen_blit(screen, intro_1, intro_2, intro_3): #This isn't working.
    time.sleep(1)
    screen.blit(intro_1, (340, 30)) #This isn't working.
    time.sleep(1)
    screen.blit(intro_2, (340, 30)) #This isn't working.
    time.sleep(1)
    screen.blit(intro_3, (340, 30)) #This isn't working.

Main()

Again, No Response. How can I fix this???


The window is not responding, because you don't handle the events. You don't see anything in the window, because you don't update the display.
A minimal typical PyGame application

  • needs a game loop

  • has to handle the events, by either pygame.event.pump() or pygame.event.get().

  • has to update the display Surface, by either pygame.display.flip() or pygame.display.update().

e.g:

def Main():
    # [...]

    while True: #This isn't working.

        # handle the events
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.quit()

        # draw the scene
        screen.blit(intro_1, (340, 30))

        # update the display
        pygame.display.flip()

You need to update the screen every time you draw/blit something to it, otherwise the changes won't show.

It doesn't matter whether you change things inside a loop or in a function, what matters is that you update the screen by calling either pygame.display.flip(), which updates the entire screen, or pygame.display.update(), which updates the entire screen or the rectangle passed to it. In this example I used the rectangle returned by blitting to only update the specific area, and also added a simple game loop that handles events, so your game will be responsive and you can exit it:

import time
import pygame
from pygame.locals import *

def Main():
    pygame.mixer.init()

    pygame.mixer.music.load(r"C:\...\OMFG+-+Ice+Cream.mp3")
    pygame.mixer.music.play(-1)

    pygame.init()

    screen = pygame.display.set_mode((640, 480))
    screen.fill((0,0,0))
    pygame.display.set_caption("3 Minutes Left!!!")
    pygame.display.update() # Update screen after filling it

    font = pygame.font.Font('freesansbold.ttf', 18)

    intro_1 = font.render('3', True, (255,255,255))
    intro_2 = font.render('Minutes', True, (255,255,255))
    intro_3 = font.render('Left!!!', True, (255,255,255))

    time.sleep(1)
    pygame.display.update(screen.blit(intro_1, (140, 30)))
    time.sleep(1)
    pygame.display.update(screen.blit(intro_2, (340, 30))) 
    time.sleep(1)
    pygame.display.update(screen.blit(intro_3, (540, 30)))

    while pygame.event.wait().type != QUIT:
        pass

Main()