Edit: I realize that you may be interested in seeing the code separately:
import os, pygame, sys
from pygame.locals import *
if not pygame.font: print('Warning, fonts disabled')
if not pygame.mixer: print('Warning, sound disabled')
UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3
MENU_SCREEN = 0
GAME_SCREEN = 1
LOAD_SCREEN = 2
class GameObject:
def __init__(self, image, size, speed, x, y, rot):
self.image = image
self.size = size
self.speed = speed
self.pos = image.get_rect().move(x,y)
self.rot = rot
def move(self,surface,direction):
if direction == UP:
self.pos = self.pos.move(0,-1)
if direction == RIGHT:
self.pos = self.pos.move(1,0)
if direction == DOWN:
self.pos = self.pos.move(0,1)
if direction == LEFT:
self.pos = self.pos.move(-1,0)
if self.pos.right > surface.get_size()[0]:
self.pos.left = 0
if self.pos.top < 0:
self.pos.bottom = surface.get_size()[1]
#Initialize screen
pygame.init()
DISPLAY_SURFACE = pygame.display.set_mode((960, 540),RESIZABLE)
pygame.display.set_caption('Space Shooter!') #I'll think of a more creative name later.
screen_indicator = MENU_SCREEN
size = DISPLAY_SURFACE.get_size()
width = size[0]
height = size[1]
title = pygame.Rect(((width/16)+1, (height/8)+1, 7*width/8, height/4))
menu1 = pygame.Rect(((width/4)+1, (height/2)+1, 2*width/4, height/10))
menu2 = pygame.Rect(((width/4)+1, (height/2)+1+(3*height/20), 2*width/4, height/10))
menu3 = pygame.Rect(((width/4)+1, (height/2)+1+(6*height/20), 2*width/4, height/10))
#Draws dark blue rectangles.
pygame.draw.rect(DISPLAY_SURFACE, (0,0,150), menu1)
pygame.draw.rect(DISPLAY_SURFACE, (0,0,150), menu2)
pygame.draw.rect(DISPLAY_SURFACE, (0,0,150), menu3)
#Draws blue ovals on top of the rectangles.
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,150), title)
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,255), menu1)
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,255), menu2)
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,255), menu3)
#pygame.font.Font takes in a font name and an integer for its size.
#Free Sans Bold comes with Pygame (Sweigart 2012 p. 30).
font_title = pygame.font.Font('freesansbold.ttf', 64)
font_menu = pygame.font.Font('freesansbold.ttf', 32)
#Creates and draws the text.
surface_title = font_title.render('SPACE SHOOTER!', True, (0,255,0))
rect_title = surface_title.get_rect(center=(width/2,(height/4)+3)) #get_rect() is my favorite Pygame function.
surface_new_game = font_menu.render('NEW GAME', True, (0,0,0))
rect_new_game = surface_new_game.get_rect(center=(width/2,(height/2)+(height/20)+3))
surface_load_game = font_menu.render('LOAD GAME', True, (0,0,0))
rect_load_game = surface_load_game.get_rect(center=(width/2,(height/2)+(4*height/20)+3))
surface_exit = font_menu.render('EXIT', True, (0,0,0))
rect_exit = surface_exit.get_rect(center=(width/2,(height/2)+(7*height/20)+3))
background = pygame.image.load('background.png').convert() #http://www.pygame.org/docs/tut/MoveIt.html
player = pygame.image.load('player.png').convert_alpha() #player.png is in the same folder as this module, which is C:\Python32 for me.
p = GameObject(player, 100, 1, 400, 400, 1)
while True: #main game loop
for event in pygame.event.get():
if screen_indicator == MENU_SCREEN:
DISPLAY_SURFACE.blit(surface_title, rect_title)
DISPLAY_SURFACE.blit(surface_new_game, rect_new_game)
DISPLAY_SURFACE.blit(surface_load_game, rect_load_game)
DISPLAY_SURFACE.blit(surface_exit, rect_exit)
if event.type == VIDEORESIZE:
#This line creates a new display in order to clear the screen.
#I figured this out myself, so if you know of a better way to do this, let me know.
DISPLAY_SURFACE = pygame.display.set_mode((event.w, event.h),RESIZABLE)
width = event.w
height = event.h
#Creates the rectangle objects that will be behind the title and menu buttons.
title = pygame.Rect(((width/16)+1, (height/8)+1, 7*width/8, height/4))
menu1 = pygame.Rect(((width/4)+1, (height/2)+1, 2*width/4, height/10))
menu2 = pygame.Rect(((width/4)+1, (height/2)+1+(3*height/20), 2*width/4, height/10))
menu3 = pygame.Rect(((width/4)+1, (height/2)+1+(6*height/20), 2*width/4, height/10))
#Draws dark blue rectangles.
pygame.draw.rect(DISPLAY_SURFACE, (0,0,150), menu1)
pygame.draw.rect(DISPLAY_SURFACE, (0,0,150), menu2)
pygame.draw.rect(DISPLAY_SURFACE, (0,0,150), menu3)
#Draws blue ovals on top of the rectangles.
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,150), title)
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,255), menu1)
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,255), menu2)
pygame.draw.ellipse(DISPLAY_SURFACE, (0,0,255), menu3)
#Creates and draws the text.
rect_title = surface_title.get_rect(center=(width/2,(height/4)+3)) #get_rect() is my favorite Pygame function.
rect_new_game = surface_new_game.get_rect(center=(width/2,(height/2)+(height/20)+3))
rect_load_game = surface_load_game.get_rect(center=(width/2,(height/2)+(4*height/20)+3))
rect_exit = surface_exit.get_rect(center=(width/2,(height/2)+(7*height/20)+3))
#When you let go of the left mouse button in the area of a button, the button does something.
if event.type == MOUSEBUTTONUP:
if event.button == 1:
if (menu1.left < event.pos[0] < menu1.right) and (menu1.top < event.pos[1] < menu1.bottom):
screen_indicator = GAME_SCREEN
DISPLAY_SURFACE = pygame.display.set_mode((width, height),RESIZABLE)
if (menu2.left < event.pos[0] < menu2.right) and (menu2.top < event.pos[1] < menu2.bottom):
print("LOAD GAME") #Placeholder
if (menu3.left < event.pos[0] < menu3.right) and (menu3.top < event.pos[1] < menu3.bottom):
pygame.event.post(pygame.event.Event(QUIT)) #Exits the game
#When you mouse-over a button, the text turns green.
if event.type == MOUSEMOTION:
if (menu1.left < event.pos[0] < menu1.right) and (menu1.top < event.pos[1] < menu1.bottom):
surface_new_game = font_menu.render('NEW GAME', True, (0,255,0))
else:
surface_new_game = font_menu.render('NEW GAME', True, (0,0,0))
if (menu2.left < event.pos[0] < menu2.right) and (menu2.top < event.pos[1] < menu2.bottom):
surface_load_game = font_menu.render('LOAD GAME', True, (0,255,0))
else:
surface_load_game = font_menu.render('LOAD GAME', True, (0,0,0))
if (menu3.left < event.pos[0] < menu3.right) and (menu3.top < event.pos[1] < menu3.bottom):
surface_exit = font_menu.render('EXIT', True, (0,255,0))
else:
surface_exit = font_menu.render('EXIT', True, (0,0,0))
if screen_indicator == GAME_SCREEN:
DISPLAY_SURFACE.blit(background, (0, 0))
#For now, the controls are built-in. Later controls will be changeable via a settings menu.
if event.type == KEYDOWN:
while pygame.event.peek(KEYUP) == False:
print(event.key)
if event.key == 273:
DISPLAY_SURFACE.blit(background, (0, 0))
p.move(DISPLAY_SURFACE,UP)
DISPLAY_SURFACE.blit(p.image, p.pos)
pygame.display.update()
pygame.time.delay(2)
if event.key == 275:
DISPLAY_SURFACE.blit(background, (0, 0))
p.move(DISPLAY_SURFACE,RIGHT)
DISPLAY_SURFACE.blit(p.image, p.pos)
pygame.display.update()
pygame.time.delay(2)
if event.key == 274:
DISPLAY_SURFACE.blit(background, (0, 0))
p.move(DISPLAY_SURFACE,DOWN)
DISPLAY_SURFACE.blit(p.image, p.pos)
pygame.display.update()
pygame.time.delay(2)
if event.key == 276:
DISPLAY_SURFACE.blit(background, (0, 0))
p.move(DISPLAY_SURFACE,LEFT)
DISPLAY_SURFACE.blit(p.image, p.pos)
pygame.display.update()
pygame.time.delay(2)
DISPLAY_SURFACE.blit(p.image, p.pos)
if event.type == VIDEORESIZE:
DISPLAY_SURFACE = pygame.display.set_mode((event.w, event.h),RESIZABLE)
DISPLAY_SURFACE.blit(background, (0, 0))
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
No comments:
Post a Comment