So, I am a beginner, I am trying to create game where u evade objects and all but I have been having a very big problem with drawing obstacles repeatedly in my loop, I am currently using draw function for it, and it doesn't seem to be working.
Can anyone please enlighten me?
This is my full code:
import pygame
from sys import exit
from random import randint, choice
from pygame.math import Vector2
pygame.init()
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
clock = pygame.time.Clock()
pygame.display.set_caption("Game")
test_font = pygame.font.Font("Snake/Font/PoetsenOne-Regular.ttf",50)
running = False
class OBJECT(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.x = 600
self.y = 300
self.pos = Vector2(self.x,self.y)
self.gravity = -20
self.rect = pygame.rect.Rect(self.pos.x, self.pos.y, 40, 40)
def object_movement(self):
key = pygame.key.get_pressed()
if key[pygame.K_d]:
self.rect.move_ip(8, 0)
if key[pygame.K_a]:
self.rect.move_ip(-8, 0)
def draw(self, surface):
pygame.draw.rect(surface, "red", self.rect)
def apply_gravity(self):
self.gravity += 0.8
self.rect.y += self.gravity
if self.rect.x >= 1152:
self.rect.x = 1152
if self.rect.x <= 8:
self.rect.x = 8
if self.rect.y <= 0:
self.rect.y = 0
def game_over(self):
if self.rect.y >= 1000:
self.rect.y = 300
self.gravity = - 20
return False
else:
return True
def update(self):
self.apply_gravity()
self.object_movement()
self.draw(screen)
class OBSTACLE(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.x = randint(50,1150)
self.y = -300
self.pos = Vector2(self.x,self.y)
self.obstacle_rect = pygame.rect.Rect(self.pos.x,self.pos.y,5,20)
def draw(self):
pygame.draw.rect(screen,"white",self.obstacle_rect)
def obstacle_movement(self):
self.obstacle_rect.y += 7
if self.obstacle_rect.y >= 700:
self.kill()
def update(self):
self.obstacle_movement()
object = OBJECT()
obstacle = OBSTACLE()
def Background():
screen.fill((102,205,170))
def Game_message():
enter = test_font.render("Press ENTER To Start", False, "white")
enter_rect = enter.get_rect(center = (600,280))
jump = test_font.render("SPACE For Jump", False, "white")
jump_rect = jump.get_rect(center = (600,350))
screen.blit(enter,enter_rect)
screen.blit(jump,jump_rect)
obstacle_timer = pygame.USEREVENT + 1
pygame.time.set_timer(obstacle_timer,200)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if running:
if event.type == obstacle_timer:
obstacle.draw()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
object.gravity = -10
else:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
running = True
obstacle.kill()
if running:
Background()
object.update()
obstacle.update()
running = object.game_over()
else:
screen.fill((102,205,170))
Game_message()
pygame.display.update()
clock.tick(60)
I tried using obstacle = pygame.sprite.Group()
yes, that made drawing class repeatedly much easier using obstacle.add(OBSTACLE())
function in a loop however other much big problems kept popping off in my code (collisions) so I sort of gave up on that.