web-dev-qa-db-fra.com

Comment ajouter une image de fond dans pygame?

nouveau sur pygame me demandant comment je pourrais ajouter une image d’arrière-plan au jeu lui-même? C’est mon code jusqu’à présent. J’utilise le bg comme moyen d’importer mon image, mais le fichier py refuse de se charger.

import pygame
import sys
from pygame.locals import *

clock = pygame.time.Clock()
screen = pygame.display.set_mode((600,500))

bg = pygame.image.load("images\space.png")


pygame.mouse.set_visible(0)

ship = pygame.image.load("images\ship.png")
ship_top = screen.get_height() - ship.get_height()
ship_left = screen.get_width()/2 - ship.get_width()/2

screen.blit(ship, (ship_left,ship_top))

shot = pygame.image.load("images\shot.png")
shoot_y = 0


pygame.display.set_caption('galaxy invaders')

while True:
    clock.tick(60)
    screen.fill((r,0,0))
    screen.blit(bg.(0,0))
    x,y = pygame.mouse.get_pos()
    screen.blit(ship, (x-ship.get_width()/2, ship_top))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        Elif event.type == MOUSEBUTTONDOWN:
            shoot_y = 500
            shoot_x = x

    if shoot_y > 0:
        screen.blit(shot, (shoot_x, shoot_y))
        shoot_y -= 10

    pygame.display.update()
5
jy95

Ce problème peut être facilement résolu. Vous aurez besoin d'une image de la taille de votre écran pour votre arrière-plan. N'oubliez pas d'ajouter pygame.init() au début de votre jeu pour pouvoir le démarrer et ses capacités. Une fonction pour cette image peut être utilisée comme ceci:

class Background(pygame.Sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.Sprite.Sprite.__init__(self)  #call Sprite initializer
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

Cela permettra au programme de charger votre image via cette fonction quand vous l'appelez comme ceci:

BackGround = Background('background_image.png', [0,0])

Et vous aurez également besoin de ces deux lignes dans votre boucle while:

screen.fill([255, 255, 255])
screen.blit(BackGround.image, BackGround.rect)

Ceci remplira votre écran en blanc et mettra l'image d'arrière-plan dessus mais sous vos autres sprites et objets.
Suggestions: .__ Vous devriez créer une autre classe pour votre autre Sprite (peut-être la raison pour laquelle l'image n'apparaît pas). Un exemple pourrait être comme:

class Ship(pygame.Sprite.Sprite):
    def __init__(self, image_file, speed, location):
        pygame.Sprite.Sprite.__init__(self)
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

Vous pouvez alors "l'activer" comme ceci:

ship = Ship("images\ship.png", [a, b])

Sélectionnez les coordonnées pour a et b. Vous pouvez ensuite afficher l'image sur l'écran de cette manière, mais après votre déclaration d'arrière-plan:

screen.blit(ship.image, ship.rect)

J'espère que ceci vous aide!

8
Anthony Pham

Pour le fond, je fais toujours une image de la taille de la fenêtre de jeu ou plus petite qu'avant l'affichage de toutes les images, je blit cette image à 0,0.

bg = pygame.image.load("bg.png")

#INSIDE OF THE GAME LOOP
gameDisplay.blit(bg, (0, 0))

#REST OF ITEMS ARE BLIT'D TO SCREEN.

J'espère que cela t'aides.

6
HKVariant

Tout d’abord, cela ne fonctionnera pas car vous n’avez pas initialisé Pygame après l’avoir importé. De plus, les images ne seront pas chargées car la barre oblique inverse indique une séquence d'échappement. Enfin, vous devriez corriger votre indentation.

import pygame
import sys
from pygame.locals import *

pygame.init() # initialize pygame
clock = pygame.time.Clock()
screen = pygame.display.set_mode((600,500))

# os.path.join properly forms a cross-platform relative path
# by joining directory names

bg = pygame.image.load(os.path.join("images", "space.png"))


pygame.mouse.set_visible(0)

ship = pygame.image.load(os.path.join("images", "ship.png"))
ship_top = screen.get_height() - ship.get_height()
ship_left = screen.get_width()/2 - ship.get_width()/2
screen.blit(ship, (ship_left,ship_top))

shot = pygame.image.load(os.path.join("images", "space.png"))
shoot_y = 0


pygame.display.set_caption('galaxy invaders')

# fix indentation

while True:
    clock.tick(60)
    screen.blit(bg, (0,0))
    x,y = pygame.mouse.get_pos()
    screen.blit(ship, (x-ship.get_width()/2, ship_top))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        Elif event.type == MOUSEBUTTONDOWN:
            shoot_y = 500
            shoot_x = x

    if shoot_y > 0:
        screen.blit(shot, (shoot_x, shoot_y))
        shoot_y -= 10

    pygame.display.update()
1
Malik Brahimi