Jaho
Jaho

Reputation: 51

pygame, how can I use sprite.Group.draw() to draw all sprites?

I am learning pygame by making a simple game. Here is the code: Main script:

import pygame
from gracz2 import SpriteGenerator

BLACK = ( 0, 0, 0)
WHITE = ( 255, 255, 255)
GREEN = ( 0, 255, 0)
RED = ( 255, 0, 0)
BLUE = ( 0, 0, 255)

pygame.init()
pygame.display.set_caption("Super Gra!")
screen_height = 720
screen_width = 1280
screen = pygame.display.set_mode((screen_width, screen_height))

all_sprites_list = pygame.sprite.Group()
playerSprite = SpriteGenerator(1,150,150)
playerSprite.rect.x = (screen_width/2 - 75)
playerSprite.rect.y = 550
all_sprites_list.add(playerSprite)

clock = pygame.time.Clock()
mainloop = True
playtime = 0

while mainloop:

    for event in pygame.event.get():
        # User presses QUIT-button.
        if event.type == pygame.QUIT:
            mainloop = False 
        elif event.type == pygame.KEYDOWN:
            # User presses ESCAPE-Key
            if event.key == pygame.K_ESCAPE:
                mainloop = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        playerSprite.moveLeft(8)
    if keys[pygame.K_RIGHT]:
        playerSprite.moveRight(8)

    milliseconds = clock.tick(60) 
    playtime += milliseconds / 1000.0
    all_sprites_list.update()

    pygame.display.set_caption("Czas gry: " + str(round(playtime,1)) + " sekund")

    # Refresh the screen
    screen.fill(BLACK)
    all_sprites_list.draw(screen)
    screen.blit(playerSprite.image, (playerSprite.rect.x,playerSprite.rect.y))
    pygame.display.flip()

print(all_sprites_list.sprites())
print(all_sprites_list)
print(playerSprite.rect.x)
print(playerSprite.rect.y)
pygame.quit()

and another file called "gracz2.py":

import pygame
WHITE = (255, 255, 255)
BLACK = ( 0, 0, 0)

class SpriteGenerator(pygame.sprite.Sprite):
    #This class represents a player. It derives from the "Sprite" class in Pygame.

    def __init__(self, type, width, height):
        # Call the parent class (Sprite) constructor
        super().__init__()

        # Pass in the color of the player, and its x and y position, width and height.
        # Set the background color and set it to be transparent
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        self.image.set_colorkey(WHITE)


        if type == 1:
            self.image = pygame.image.load("sprite-ufo.gif").convert_alpha()
        elif type == 2:
            self.image = pygame.image.load("sprite-bomb.jpg").convert_alpha()

        # Fetch the rectangle object that has the dimensions of the image.
        self.rect = self.image.get_rect()

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels

It could be done in one file but the code is more readable for me this way. around line 50 i call all_sprites_list.draw(screen) which to my understanding should blit all the sprites contained in all_sprites_list but it does nothing. I have to use screen.blit(playerSprite.image, (playerSprite.rect.x,playerSprite.rect.y)) to manually blit the sprite. As i am going to add generate lots of sprites later i can't blit them all manually. Why doesn't all_sprites_list.draw(screen) work as intended? It's probably a stupid mistake in the code but I am trying to find for over an hour now and I am unable to locate it.

Upvotes: 1

Views: 1435

Answers (1)

Jaho
Jaho

Reputation: 51

Turns out that when i restart my PC the draw() function works fine. I don't know what caused it first, sorry for asking without following the first rule of IT troubleshooting first (restart and try again) PS: thank you furas for your answers

Upvotes: 1

Related Questions