0

My friend and I are fairly new pygame users and noticed problems with the results of our code. I want to understand why the enemies seem to get faster and at some point travel through the borders. We have set conditions for the borders which should result in the enemy sprites to bounce off the borders consistently.

Here is a preview of the error

import pygame, sys, random, time
from pygame.locals import *
pygame.init()
screen_height = 870
screen_width = 1530
screen = pygame.display.set_mode((screen_width, screen_height))
fpsfunc = pygame.time.Clock()
enemy_speed = 1
SPAWNENEMY = USEREVENT + 1
pygame.time.set_timer(SPAWNENEMY, 1000)

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.surf = pygame.Surface((50, 50))
        self.surf.fill((255, 0, 0))
        self.rect = self.surf.get_rect(center=(screen_width / 2,
                                               screen_height - 100))

    def update(self, pressed_keys):
        if pressed_keys[K_d]:
            self.rect.move_ip(3, 0)
        if pressed_keys[K_a]:
            self.rect.move_ip(-3, 0)
        if pressed_keys[K_w]:
            self.rect.move_ip(0, -5)
        if pressed_keys[K_s]:
            self.rect.move_ip(0, 1)
        if self.rect.left <= 0:
            self.rect.left = 0
        if self.rect.top <= 0:
            self.rect.top = 0
        if pressed_keys[K_SPACE]:
            bullet_sprites.add(player.create_bullet())

    def create_bullet(self):
        return PlayerBullet(self.rect.x + 25, self.rect.y)


class PlayerBullet(pygame.sprite.Sprite):
    def __init__(self, pos_x, pos_y):
        super().__init__()
        self.image = pygame.Surface((10, 30))
        self.image.fill((0, 255, 255))
        self.rect = self.image.get_rect(center=(pos_x, pos_y))

    def update(self):
        self.rect.y -= 5
        if self.rect.y + 30 < 0:
          self.kill()
  

class Enemy(pygame.sprite.Sprite):
    def __init__(self, nice1, nice2):
        super(Enemy, self).__init__()
        self.image = pygame.Surface((35,35))
        self.image.fill((0,0,255))
        self.rect = self.image.get_rect(center = (nice1, nice2))
    def update(self):
        global enemy_speed
        self.rect.x += 3 * enemy_speed
        if self.rect.right >= screen_width:
          enemy_speed = -1
        if self.rect.left <= 0:
          enemy_speed = 1
        if pygame.sprite.spritecollide(self, bullet_sprites, True):
          self.kill()

def createnem(pos1, pos2):
    return Enemy(pos1, pos2)
  

player = Player()


bullet_sprites = pygame.sprite.Group()
enemy_sprites = pygame.sprite.Group()

while True:
    random1 = random.randint(1,100)
    random2 = random.randint(1,100)
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
        if event.type == MOUSEBUTTONDOWN:
            bullet_sprites.add(player.create_bullet())
        if event.type == SPAWNENEMY and len(enemy_sprites) < 3:
            enemy_sprites.add(createnem(random1, random2))

    pressed_keys = pygame.key.get_pressed()
    screen.fill((0, 0, 0))
    screen.blit(player.surf, player.rect)
    bullet_sprites.draw(screen)
    enemy_sprites.draw(screen)
    player.update(pressed_keys)
    enemy_sprites.update()
    bullet_sprites.update()
    pygame.display.update()
    fpsfunc.tick(60)
  • the only error I encountered while playing was that there was no delay between "shots" so You should add that otherwise You can just hold down space and You have won – Matiiss Apr 03 '21 at 21:27
  • as for the borders. try predicting where the enemy rectangle will be and change its direction earlier. that can be done like this `if self.rect.right + (3 * enemy_speed) >= screen_width` and similarly for the other side too – Matiiss Apr 03 '21 at 21:43

0 Answers0