меню pygame, помогите с кодом
сделал меню и игру в коде, не смог соединить , помогите соединить пожалуйста )
import pygame
import random
import os, sys
from pygame.locals import *
if not pygame.font: print('Warning, fonts disabled')
if not pygame.mixer: print('Warning, sound disabled')
WIDTH = 1600
HEIGHT = 800
FPS = 60
# Задаем цвета
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
# переменные
timer_games = 0
timer_stats = 0
u = 100
boss_life = 100
player_ship_life = 100
player_shield = 100
gg = 100
#разное
pygame.time.set_timer(pygame.USEREVENT, 1000) # таймер , смотреть инструкцию
# Создаем игру и окно
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shmup!")
clock = pygame.time.Clock()
score = "ну чё погнали ?!"
font_name = pygame.font.match_font('arial')
size = screen.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(screen, (0,0,150), menu1)
pygame.draw.rect(screen, (0,0,150), menu2)
pygame.draw.rect(screen, (0,0,150), menu3)
#Draws blue ovals on top of the rectangles.
pygame.draw.ellipse(screen, (0,0,150), title)
pygame.draw.ellipse(screen, (0,0,255), menu1)
pygame.draw.ellipse(screen, (0,0,255), menu2)
pygame.draw.ellipse(screen, (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() #get_rect() is my favorite Pygame function.
rect_title.center = (width/2,(height/4)+3)
surface_new_game = font_menu.render('NEW GAME', True, (0,0,0))
rect_new_game = surface_new_game.get_rect()
rect_new_game.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()
rect_load_game.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()
rect_exit.center = (width/2,(height/2)+(7*height/20)+3)
class Button:
def __init__(self, width,height):
self.width = width
self.height = height
def draw(self,x,y,message,action=None, font_size=30):
mouse = pygame.mouse.get_pos()
click = pygame.mouse.get_pressed()
print_text(message =message,x=x + 10 ,y= y + 10 ,font_size= 50)
def print_text(message, x , y, font_color = (0,0,0), font_type = "XF.ttf", font_size = 30):
font_type = pygame.font.Font(font_type,font_size)
text = font_type.render(message,True, font_color)
screen.blit(text, (x, y))
def draw_text(surf, text, size, x, y):
font = pygame.font.Font(font_name, size)
text_surface = font.render(text, True, WHITE)
text_rect = text_surface.get_rect()
text_rect.midtop = (x, y)
surf.blit(text_surface, text_rect)
def draw_shield_bar(surf, x, y, pct):
if pct < 0:
pct = 0
BAR_LENGTH = 100
BAR_HEIGHT = 10
fill = (pct / 100) * BAR_LENGTH
outline_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)
fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)
pygame.draw.rect(surf, GREEN, fill_rect)
pygame.draw.rect(surf, WHITE, outline_rect, 2)
def shield(surf, x, y, pct_2):
if pct_2 < 0:
pct_2 = 0
BAR_LENGTH_2 = 80
BAR_HEIGHT_2 = 10
fill_2 = (pct_2 / 100) * BAR_LENGTH_2
outline_rect_2 = pygame.Rect(x, y, BAR_LENGTH_2, BAR_HEIGHT_2)
fill_rect_2 = pygame.Rect(x, y, fill_2, BAR_HEIGHT_2)
pygame.draw.rect(surf, YELLOW, fill_rect_2)
pygame.draw.rect(surf, WHITE, outline_rect_2, 2)
class Player(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((40, 50))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 10
self.speedx = 0
self.shield = 100
def update(self):
self.speedx = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -8
if keystate[pygame.K_RIGHT]:
self.speedx = 8
self.rect.x += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites_1.add(bullet)
bullets.add(bullet)
class Mob2(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((40, 40))
self.image.set_colorkey(BLACK)
self.image.set_alpha(200)
self.rect = self.image.get_rect()
self.radius = 20
pygame.draw.circle(self.image, GREEN, self.rect.center, self.radius, 5)
self.rect.centerx = u
self.rect.centery = 1
#self.rect.y = random.randrange(-100, -40)
self.speedy = 4
def update(self):
self.rect.centery += self.speedy
self.rect.centerx += 2
if self.rect.centery == WHITE:
self.kill()
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((20, 20))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
self.speedx = random.randrange(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
class Boss(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((70, 60))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(600,900)
self.rect.y = (HEIGHT / 10)
self.speedx = random.randrange(-10 , 10)
def update(self):
self.rect.x += self.speedx
if self.rect.right > WIDTH:
self.rect.right = WIDTH
self.speedx = random.randrange(-10 ,-1)
if self.rect.left < 0:
self.rect.left = 0
self.speedx = random.randrange(1 , 10)
def draw_boss(self, surf, pct):
if pct < 0:
pct = 0
BAR_LENGTH_1 = 50
BAR_HEIGHT_1 = 10
fill_1 = (pct / 100) * BAR_LENGTH_1
outline_rect_1 = pygame.Rect(self.rect.x + 50, self.rect.y-15, BAR_LENGTH_1, BAR_HEIGHT_1)
fill_rect_1 = pygame.Rect(self.rect.x + 50, self.rect.y-15, fill_1, BAR_HEIGHT_1)
pygame.draw.rect(surf, GREEN, fill_rect_1)
pygame.draw.rect(surf, WHITE, outline_rect_1, 2)
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((10, 20))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x
self.speedy = -10
def update(self):
self.rect.y += self.speedy
# убить, если он заходит за верхнюю часть экрана
if self.rect.bottom < 0:
self.kill()
class Mob3(pygame.sprite.Sprite):
def __init__(self, lll): # +++ lll
super().__init__() # +++
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((60, 900))
c = random.sample([YELLOW, BLUE, GREEN, RED, WHITE], 1)[0] # +
self.image.fill(c) # +
self.image.set_alpha(150)
self.rect = self.image.get_rect()
self.rect.centerx = lll
self.rect.centery = HEIGHT / 2
self.speedy = 4
class first_aid_kit(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((20, 20))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
self.speedx = random.randrange(-3, 3)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 8)
all_sprites = pygame.sprite.Group()
all_sprites_1 = pygame.sprite.Group()
_aid_ = pygame.sprite.Group()
bullets = pygame.sprite.Group()
mobs = pygame.sprite.Group()
player = Player()
all_sprites_1.add(player)
boss = Boss()
all_sprites_1.add(boss)
mobs1 = pygame.sprite.Group()
while True: #main game loop
screen.blit(surface_title, rect_title)
screen.blit(surface_new_game, rect_new_game)
screen.blit(surface_load_game, rect_load_game)
screen.blit(surface_exit, rect_exit)
for event in pygame.event.get():
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.
screen = 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))
#Creates and draws the text.
rect_title = surface_title.get_rect()
rect_title.center = (width/2,(height/4)+3)
rect_new_game = surface_new_game.get_rect()
rect_new_game.center = (width/2,(height/2)+(height/20)+3)
rect_load_game = surface_load_game.get_rect()
rect_load_game.center = (width/2,(height/2)+(4*height/20)+3)
rect_exit = surface_exit.get_rect()
rect_exit.center = (width/2,(height/2)+(7*height/20)+3)
pygame.display.update() #Necessary to update the screen
#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):
False
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, (255,255,255))
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, (255,255,255))
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, (255,255,255))
if event.type == QUIT:
pygame.quit()
sys.exit()
pygame.display.update()
running = True
while running:
clock.tick(FPS)
for e in pygame.event.get(): # запускает таймер ,каждую секунду он считает
if e.type == pygame.USEREVENT: # только в его границах работает таймер
timer_games += 1
timer_stats += 1
# показываем все что нужно в консоли
if timer_stats % 4 == 0: # каждые 4 секунды
#print("mobs:" + str(mobs1))
#print("Mob3:" + str(mobs))
#print("player_ship_life:" + str(player_ship_life))
for i in range(3):
s = Mob()
all_sprites_1.add(s)
mobs.add(s)
for i in range(5):
m = Mob2()
all_sprites_1.add(m)
mobs.add(m)
u += 50
if timer_games % 15 == 0:
for i in range(1):
z = first_aid_kit()
all_sprites_1.add(z)
_aid_.add(z)
all_sprites = pygame.sprite.Group()
'''
что бы запустить повторое появление надо 2 раза запустить all_sprites = pygame.sprite.Group()
за главным циклом и в главное в разделе if e.type == pygame.USEREVENT:
так же переменые надо писать после 2 запуска all_sprites = pygame.sprite.Group()
+++ процент делает так что каждые секунды за ним(k) запускают это число. и сразу его прекращает
+++ lll растояние между ними
+++ mobs1.empty() - удаляет все из группы
'''
lll = 60
k = 2
if timer_games % k == 0:
for i in range(10):
q = Mob3(lll)
all_sprites.add(q)
mobs1.add(q)
lll += 165 # 200
mobs1.empty()
mobs1.add()
if e.type == pygame.QUIT:
running = False
elif e.type == pygame.KEYDOWN:
if e.key == pygame.K_SPACE:
player.shoot()
# Обновление
all_sprites.update()
all_sprites_1.update()
# Найти все спрайты, которые сталкиваются между двумя группами.
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
for hit in hits:
m = Mob()
all_sprites_1.add(m)
mobs.add(m)
# Проверка, не ударил ли моб игрока
hits = pygame.sprite.spritecollide(player, mobs, True)# если ударил то исчезает с экрана
if hits:
player_ship_life -= 10 # за каждое попадание минус хп
if player_ship_life <= 0: # если здоровье меньше нуля...
running = False
hits = pygame.sprite.spritecollide(player, _aid_, True)# если ударил то исчезает с экрана
if hits:
player_ship_life += 10
#BAR_LENGTH += 10
# босс 1 уровня игры
hits = pygame.sprite.spritecollide(boss, bullets, True)# если ударил то исчезает с экрана
if hits:
#running = False
boss_life -= 4 # за каждое попадание минус хп
if boss_life <= 0: # если здоровье меньше нуля...
running = False
# Рендеринг
screen.fill(BLACK)
all_sprites.draw(screen)
all_sprites_1.draw(screen)
draw_text(screen, score, 18, WIDTH / 2, 10)
draw_shield_bar(screen, 5, 5, player_ship_life)
boss.draw_boss(screen, boss_life)
shield(screen, 5, 20, player_shield)
# После отрисовки всего, переворачиваем экран
pygame.display.flip()
pygame.quit()