Hi everyone,
I am working on a game with python 3.6 and PYGAME and with the Geany 1.36 text editor.
It is a game where a ball falls randomly from top to bottom and you have to catch it.
The problem is that when loading the image of the ball it is not drawn in the window when executing it.
Help me, find where I am making the mistake?
or I need to add something
catch!.py
I am working on a game with python 3.6 and PYGAME and with the Geany 1.36 text editor.
It is a game where a ball falls randomly from top to bottom and you have to catch it.
The problem is that when loading the image of the ball it is not drawn in the window when executing it.
Help me, find where I am making the mistake?
or I need to add something
catch!.py
import pygame
from pygame.sprite import Group
from settings import Settings
import game_functions as gf
from character import Character
from background import Background
from gamestats import GameStats
from button import Button
from scoreboard import Scoreboard
def run_game():
pygame.init()
c_settings = Settings()
screen = pygame.display.set_mode(
(c_settings.screen_width, c_settings.screen_height))
pygame.display.set_caption("Welcome to Catch")
catch = pygame.mixer.Sound("sounds/jumping2.wav")
end = pygame.mixer.music.load("sounds/end.wav")
pygame.mixer.music.load("sounds/music.ogg")
stats = GameStats(c_settings)
sb = Scoreboard(screen, c_settings, stats)
background = Background(screen)
character = Character(screen)
balls = Group()
gf.create_balls(screen, c_settings, balls)
play_button = Button(c_settings, screen, "Play")
while True:
gf.check_key_events(character, screen, stats, c_settings, balls,
play_button, sb)
if stats.game_active == True:
gf.update_balls(screen, balls, c_settings, character, stats, sb, catch, end)
character.update(c_settings)
gf.update_screen(screen, c_settings, character, balls,
background, stats, play_button, sb)
run_game()
game_functions.pyimport sys
import pygame
from ball import Ball
from time import sleep
def check_key_events(character, screen, stats, c_settings, balls,
play_button, sb):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_play_button(stats, play_button, mouse_x, mouse_y,
character, c_settings, balls, sb)
elif event.type == pygame.KEYDOWN:
keydown_event(event, character, screen, stats, c_settings,
balls, sb)
elif event.type == pygame.KEYUP:
keyup_event(event, character)
def keydown_event(event, character, screen, stats, c_settings, balls,
sb):
if event.key == pygame.K_q:
sys.exit()
if event.key == pygame.K_p:
if not stats.game_active:
start_game(stats, character, c_settings, balls, sb)
if event.key == pygame.K_LEFT:
character.moving_left = True
if event.key == pygame.K_RIGHT:
character.moving_right = True
if event.key == pygame.K_SPACE:
if not stats.game_active:
start_game(stats, character, c_settings, balls, sb)
else:
if character.bottom >= character.screen_rect.bottom:
character.jumping = True
def keyup_event(event, character):
if event.key == pygame.K_LEFT:
character.moving_left = False
if event.key == pygame.K_RIGHT:
character.moving_right = False
if event.key == pygame.K_SPACE:
character.jumping = False
def check_play_button(stats, play_button, mouse_x, mouse_y, character,
c_settings, balls, sb):
button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
if button_clicked and not stats.game_active:
start_game(stats, character, c_settings, balls, sb)
def start_game(stats, character, c_settings, balls, sb):
pygame.mixer.music.set_volume(1.0)
pygame.mixer.music.play(-1, 0.0)
balls.empty()
character.reset_position()
pygame.mouse.set_visible(False)
stats.dynamic_settings()
c_settings.initialize_dynamic_settings()
sb.prep_score()
sb.prep_lives_left()
stats.game_active = True
def create_balls(screen, c_settings, balls):
ball = Ball(screen, c_settings)
balls.add(ball)
def update_balls(screen, balls, c_settings, character, stats, sb, catch,
end):
for ball in balls:
ball.update(c_settings)
if ball.rect.bottom >= c_settings.screen_height:
lose_life(screen, c_settings, balls, character, stats, sb,
end)
if pygame.sprite.spritecollideany(character, balls):
catch.play()
balls.empty()
stats.score += 10 * (c_setting.catch_points +
(character.screen_rect.bottom - character.rect.bottom))
sb.prep_score()
check_high_score(stats, sb)
if len(balls) == 0:
c_settings.increase_speed()
create_balls(screen, c_settings, balls)
def check_high_score(stats, sb):
if stats.score > stats.high_score:
stats.high_score = stats.score
sb.prep_high_score()
filename = 'high_score.txt'
with open(filename, 'w') as file_object:
file_object.write(str(stats.high_score))
def lose_life(screen, c_settings, balls, character, stats, sb, end):
if stats.lives_left > 0:
stats.lives_left -= 1
sb.prep_lives_left()
#lista vacia de bolas
balls.empty()
#crear una nueva bola
create_balls(screen, c_settings, balls)
#reestablecer banderas de movimiento
character.moving_left = False
character.moving_right = False
character.jumping = False
#Establecer su posicion del personaje
character_reset_position()
#Reestablecer la velovidad del juego
c_settings.initialize_dynamic_settings()
#pausa del juego
sleep(0.5)
else:
end.play()
pygame.mixer.music.stop()
stats.game_active = False
pygame.mouse.set_visible(True)
def update_screen(screen, c_settings, character, balls, background,
stats, play_button, sb):
screen.fill(c_settings.bg_color)
background.blitme()
character.blitme()
balls.draw(screen)
sb.show_score()
if not stats.game_active:
play_button.draw_button()
pygame.display.flip() scoreboard.pyimport pygame.font
from pygame.sprite import Group
from character import Character
class Scoreboard():
def __init__(self, screen, c_settings, stats):
self.screen = screen
self.screen_rect = screen.get_rect()
self.c_settings = c_settings
self.stats = stats
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None, 48)
self.prep_score()
self.prep_high_score()
self.prep_lives_left()
def prep_score(self):
rounded_score = round(self.stats.score, -1)
score_str = 'Score: ' + "{:,}".format(rounded_score)
self.score_image = self.font.render(score_str, True,
self.text_color)
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 20
def prep_high_score(self):
high_score = round(self.stats.high_score, -1)
high_score_str = 'High: ' + "{:,}".format(high_score)
self.high_score_image = self.font.render(high_score_str, True,
self.text_color)
self.high_score_rect = self.high_score_image.get_rect()
self.high_score_rect.top = self.score_rect.top
self.high_score_rect.left = 20
def prep_lives_left(self):
self.lives = Group()
for life_number in range(self.stats.lives_left):
life = Character(self.screen)
life.rect.right = self.screen_rect.right - 10 - (life.rect.width * life_number)
life.rect.y = self.score_rect.bottom + 10
self.lives.add(life)
def show_score(self):
self.screen.blit(self.score_image, self.score_rect)
self.screen.blit(self.high_score_image, self.high_score_rect)
self.lives.draw(self.screen) ball.pyimport pygame
from pygame.sprite import Sprite
from random import randint
class Ball(Sprite):
def __init__(self, screen, c_settings):
super().__init__()
self.screen = screen
self.image = pygame.image.load('images/ball.png')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.half_width = self.rect.width / 2
self.rect.top = self.screen_rect.top - self.rect.height
x_position = randint(self.half_width, (self.screen_rect.right -
self.half_width))
self.rect.centerx = x_position
self.y = float(self.rect.centery)
def update(self, c_settings):
self.y += c_settings.drop_speed
self.rect.centery = self.y
def blitme(self):
#Draw the ball to the screen
self.screen.blit(self.image, self.rect)
character.pyimport pygame
from pygame.sprite import Sprite
class Character(Sprite):
def __init__(self, screen):
super().__init__()
self.screen = screen
self.image = pygame.image.load('images/sprite_r.png')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.bottom = self.screen_rect.bottom
self.rect.centerx = self.screen_rect.centerx
self.x = float(self.rect.centerx)
self.bottom = float(self.rect.bottom)
self.moving_left = False
self.moving_right = False
self.jumping = False
self.jump_height = self.screen_rect.bottom - 2 * self.rect.height
def update(self, c_settings):
if self.moving_left and self.rect.left >= 0:
self.image = pygame.image.load('images/sprite_1.png')
if self.jumping:
self.x -= c_settings.jumpx_speed
else:
self.x -= c_settings.movement_speed
if self.moving_right and self.rect.right <= self.screen_rect.right:
self.image = pygame.image.load('images/sprite_r.png')
if self.jumping:
self.x += c_settings.jumpx_speed
else:
self.x += c_settings.movement_speed
self.rect.centerx = self.x
if self.jumping and self.bottom > self.jump_height:
self.bottom -= c_settings.jumpy_speed
if self.jumping and self.bottom <= self.jump_height:
self.jumping = False
if self.jumping == False and self.bottom < self.screen_rect.bottom:
self.bottom += c_settings.jumpy_speed
self.rect.bottom = self.bottom
def reset_position(self):
self.x = self.screen_rect.centerx
self.rect.centerx = self.x
self.bottom = self.screen_rect.bottom
self.rect.bottom = self.bottom
def blitme(self):
self.screen.blit(self.image, self.rect)
button.pyimport pygame.font class Button(): def __init__(self, c_settings, screen, msg): self.screen = screen self.screen_rect = screen.get_rect() self.width, self.height = 200, 50 self.button_color = (0, 255, 0) self.text_color = (255, 255, 255) self.font = pygame.font.SysFont(None, 48) self.rect = pygame.Rect(0, 0, self.width, self.height) self.rect.center = self.screen_rect.center self.prep_msg(msg) def prep_msg(self, msg): self.msg_image = self.font.render(msg, True, self.text_color, self.button_color) self.msg_image_rect = self.msg_image.get_rect() self.msg_image_rect.center = self.rect.center def draw_button(self): self.screen.fill(self.button_color, self.rect) self.screen.blit(self.msg_image, self.msg_image_rect)gamestats.py
class GameStats(): def __init__(self, c_settings): self.c_settings = c_settings filename = 'high_score.txt' with open(filename) as file_object: self.high_score = int(file_object.read()) self.game_active = False self.dynamic_settings() def dynamic_settings(self): self.lives_left = 2 self.score = 0settings.py
import pygame class Settings: def __init__(self): self.screen_width = 1200 self.screen_height = 631 self.bg_color = (0, 0, 255) self.speedup_scale = 1.01 self.initialize_dynamic_settings() def initialize_dynamic_settings(self): self.movement_speed = 20 self.jumpx_speed = 30 self.jumpy_speed = 10 self.drop_speed = 10 self.catch_points = 100 def increase_speed(self): self.movement_speed *= self.speedup_scale self.jumpx_speed *= self.speedup_scale self.jumpy_speed *= self.speedup_scale self.drop_speed *= self.speedup_scalebackground.py
import pygame
class Background():
def __init__(self, screen):
self.screen = screen
self.image = pygame.image.load('images/fondo.png')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.top = 0
self.rect.left = 0
def blitme(self):
self.screen.blit(self.image, self.rect)
