I have four files: main.py, game.py, menu.py and asteroids.py. I have shown the python code for every file apart from the asteroids one which can be found at: https://github.com/araboy24/AsteroidsTut.
I watched a tutorial on how to make the game and need to add in a main menu that shows before the game starts. I have tried adding in the code to the different files to see what happens but I can't figure out what I am doing wrong.
main.py
from game import Game
g = Game()
while g.running:
g.curr_menu.display_menu()
g.game_loop()
game.py
import pygame
from menu import *
from asteroids import *
class Game():
def __init__(self):
pygame.init()
self.running, self.playing = True, False
self.UP_KEY, self.DOWN_KEY, self.START_KEY, self.BACK_KEY = False, False, False, False
self.DISPLAY_W, self.DISPLAY_H = 480, 270
self.display = pygame.Surface((self.DISPLAY_W,self.DISPLAY_H))
self.window = pygame.display.set_mode(((self.DISPLAY_W,self.DISPLAY_H)))
self.font_name = pygame.font.get_default_font()
self.BLACK, self.WHITE = (0, 0, 0), (255, 255, 255)
self.main_menu = MainMenu(self)
self.options = OptionsMenu(self)
self.credits = CreditsMenu(self)
self.curr_menu = self.main_menu
def game_loop(self):
while self.playing:
self.check_events()
if self.START_KEY:
self.playing= False
self.display.fill(self.BLACK)
self.draw_text('Thanks for Playing', 20, self.DISPLAY_W/2, self.DISPLAY_H/2)
self.window.blit(self.display, (0,0))
pygame.display.update()
self.reset_keys()
def check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running, self.playing = False, False
self.curr_menu.run_display = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
self.START_KEY = True
if event.key == pygame.K_BACKSPACE:
self.BACK_KEY = True
if event.key == pygame.K_DOWN:
self.DOWN_KEY = True
if event.key == pygame.K_UP:
self.UP_KEY = True
def reset_keys(self):
self.UP_KEY, self.DOWN_KEY, self.START_KEY, self.BACK_KEY = False, False, False, False
def draw_text(self, text, size, x, y ):
font = pygame.font.Font(self.font_name,size)
text_surface = font.render(text, True, self.WHITE)
text_rect = text_surface.get_rect()
text_rect.center = (x,y)
self.display.blit(text_surface,text_rect)
menu.py
import pygame
class Menu():
def __init__(self, game):
self.game = game
self.mid_w, self.mid_h = self.game.DISPLAY_W / 2, self.game.DISPLAY_H / 2
self.run_display = True
self.cursor_rect = pygame.Rect(0, 0, 20, 20)
self.offset = - 100
def draw_cursor(self):
self.game.draw_text('*', 15, self.cursor_rect.x, self.cursor_rect.y)
def blit_screen(self):
self.game.window.blit(self.game.display, (0, 0))
pygame.display.update()
self.game.reset_keys()
class MainMenu(Menu):
def __init__(self, game):
Menu.__init__(self, game)
self.state = "Start"
self.startx, self.starty = self.mid_w, self.mid_h + 30
self.optionsx, self.optionsy = self.mid_w, self.mid_h + 50
self.creditsx, self.creditsy = self.mid_w, self.mid_h + 70
self.cursor_rect.midtop = (self.startx + self.offset, self.starty)
def display_menu(self):
self.run_display = True
while self.run_display:
self.game.check_events()
self.check_input()
self.game.display.fill(self.game.BLACK)
self.game.draw_text('Main Menu', 20, self.game.DISPLAY_W / 2, self.game.DISPLAY_H
/ 2 - 20)
self.game.draw_text("Start Game", 20, self.startx, self.starty)
self.game.draw_text("Options", 20, self.optionsx, self.optionsy)
self.game.draw_text("Credits", 20, self.creditsx, self.creditsy)
self.draw_cursor()
self.blit_screen()
def move_cursor(self):
if self.game.DOWN_KEY:
if self.state == 'Start':
self.cursor_rect.midtop = (self.optionsx + self.offset, self.optionsy)
self.state = 'Options'
elif self.state == 'Options':
self.cursor_rect.midtop = (self.creditsx + self.offset, self.creditsy)
self.state = 'Credits'
elif self.state == 'Credits':
self.cursor_rect.midtop = (self.startx + self.offset, self.starty)
self.state = 'Start'
elif self.game.UP_KEY:
if self.state == 'Start':
self.cursor_rect.midtop = (self.creditsx + self.offset, self.creditsy)
self.state = 'Credits'
elif self.state == 'Options':
self.cursor_rect.midtop = (self.startx + self.offset, self.starty)
self.state = 'Start'
elif self.state == 'Credits':
self.cursor_rect.midtop = (self.optionsx + self.offset, self.optionsy)
self.state = 'Options'
def check_input(self):
self.move_cursor()
if self.game.START_KEY:
if self.state == 'Start':
self.game.playing = True
elif self.state == 'Options':
self.game.curr_menu = self.game.options
elif self.state == 'Credits':
self.game.curr_menu = self.game.credits
self.run_display = False
class OptionsMenu(Menu):
def __init__(self, game):
Menu.__init__(self, game)
self.state = 'Volume'
self.volx, self.voly = self.mid_w, self.mid_h + 20
self.controlsx, self.controlsy = self.mid_w, self.mid_h + 40
self.cursor_rect.midtop = (self.volx + self.offset, self.voly)
def display_menu(self):
self.run_display = True
while self.run_display:
self.game.check_events()
self.check_input()
self.game.display.fill((0, 0, 0))
self.game.draw_text('Options', 20, self.game.DISPLAY_W / 2, self.game.DISPLAY_H /
2 - 30)
self.game.draw_text("Volume", 15, self.volx, self.voly)
self.game.draw_text("Controls", 15, self.controlsx, self.controlsy)
self.draw_cursor()
self.blit_screen()
def check_input(self):
if self.game.BACK_KEY:
self.game.curr_menu = self.game.main_menu
self.run_display = False
elif self.game.UP_KEY or self.game.DOWN_KEY:
if self.state == 'Volume':
self.state = 'Controls'
self.cursor_rect.midtop = (self.controlsx + self.offset, self.controlsy)
elif self.state == 'Controls':
self.state = 'Volume'
self.cursor_rect.midtop = (self.volx + self.offset, self.voly)
elif self.game.START_KEY:
# TO-DO: Create a Volume Menu and a Controls Menu
pass
class CreditsMenu(Menu):
def __init__(self, game):
Menu.__init__(self, game)
def display_menu(self):
self.run_display = True
while self.run_display:
self.game.check_events()
if self.game.START_KEY or self.game.BACK_KEY:
self.game.curr_menu = self.game.main_menu
self.run_display = False
self.game.display.fill(self.game.BLACK)
self.game.draw_text('Credits', 20, self.game.DISPLAY_W / 2, self.game.DISPLAY_H /
2 - 20)
self.game.draw_text('Made by me', 15, self.game.DISPLAY_W / 2, self.game.DISPLAY_H
/ 2 + 10)
self.blit_screen()
source https://stackoverflow.com/questions/70931564/pygame-main-menu-for-game
Comments
Post a Comment