Julk
Julk

Reputation: 169

Objects being drawn from list not staying on the screen (pygame)

I'm starting to work with classes more and I was trying to translate my old classless code to this new format. Before, I defined my lists as global variables and could draw multiple enemies to the screen with no problem. This time, however, something about working with classes causes the enemies to be drawn and instantly disappear from their position.

Some help or workaround would be greatly appreciated. Here's the code:

import pygame
import sys
import random
import math

pygame.init()

class enemies(object):
    enemies = []
    def __init__(self, enemy_num, diff, enemy_size):
        self.enemy_num = enemy_num
        self.diff = diff
        self.enemy_s = enemy_size

    def add_enemies(self):
        counter = 0
        if len(self.enemies) < self.enemy_num:
            for enemy in range(0, self.enemy_num):
                if len(self.enemies) < 5:
                    self.enemies.append([counter * (self.enemy_s * 0.5), 200, (50, 168, 82)])
                elif len(self.enemies) > 5 and len(self.enemies) <= 9:
                    self.enemies.append([counter * (self.enemy_s * 0.5), 250, (168, 160, 50)])
                else:
                    self.enemies.append([counter * (self.enemy_s * 0.5), 300, (50, 52, 168)])
                counter += 1

    def move(self, surface):
        for enemy in self.enemies:
            surface.fill((0, 0, 0))
            pygame.draw.rect(surface, enemy[2], (enemy[0], enemy[1], self.enemy_s, self.enemy_s))
            pygame.display.update()

class ship(object):
    def __init__(self, x, y, color):
        self.x = x
        self.y = y
        self.color = color

    def draw_all(self, surface, ship_size):
        surface.fill((0, 0, 0))
        pygame.draw.rect(surface, self.color, (self.x, self.y, ship_size, ship_size))
        pygame.display.update()

    def move(self):
        keys = pygame.key.get_pressed()

        for key in keys:
            if keys[pygame.K_LEFT]:
                self.x -= 0.2
            if keys[pygame.K_RIGHT]:
                self.x += 0.2
            if keys[pygame.K_UP]:
                self.y -= 0.2
            if keys[pygame.K_DOWN]:
                self.y += 0.2

def main():
    width = 800
    height = 1000
    ship_size = 35
    difficulty = 0
    enemy_number = 12
    enemy_size = 35
    player = ship(width / 2, height - 100, (255, 0, 0))
    aliens = enemies(enemy_number, difficulty, enemy_size)
    screen = pygame.display.set_mode((width, height))
    enemy_list = 12
    run = True
    clock = pygame.time.Clock()
    aliens.add_enemies()

    while run:
        player.draw_all(screen, ship_size)
        player.move()
        aliens.move(screen)
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.display.quit()

main()

Upvotes: 4

Views: 88

Answers (1)

Rabbid76
Rabbid76

Reputation: 210996

You've to do 1 clear display and 1 display update in the main loop of the application.
Remove .fill() respectively .pygame.display.update from the .move() and .draw_all method. Clear the display once, draw all the objects and then update the display:

while run:
    clock.tick(30)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.display.quit()

    screen.fill((0, 0, 0))  
    player.draw_all(screen, ship_size)
    player.move()
    aliens.move(screen)
    pygame.display.update()

Note, you didn't see the enemies, because the display is clear before drawing a single enemy in enemies.move() and it is clear again when drawing the ship in ship.draw_all()

Upvotes: 4

Related Questions