changed main menu to lib

fixed many bugs in lib
added many needed features to lib
new-menus
Max Lange 8 years ago
parent b62ca398f0
commit faf16641ce

@ -0,0 +1,8 @@
<#box1 = (./assets/sprites/Button1.tif,./assets/sprites/Button2.tif,./assets/sprites/Button3.tif,6)
<#box2 = (./assets/sprites/Button1.tif,./assets/sprites/knob1.tif,6)
<~size = 13
<"typeface = monospace
<*color = (255,255,10)
<%half = 50
<%qrt = 25
<[offon = (OFF, ON)

@ -0,0 +1,7 @@
&./assets/templates/default.vars
<#background = (./assets/sprites/Background1.tif)
@|Start |$size|$typeface|$color|$box1|$half + 0|$qrt + 0|
@|Settings|$size|$typeface|$color|$box1|$half + 0|$qrt + 40|
@|Credits |$size|$typeface|$color|$box1|$half + 0|$qrt + 80|
@|Exit |$size|$typeface|$color|$box1|$half + 0|$qrt + 120|

@ -1,5 +1,6 @@
&default.vars
<#background = (../../assets/sprites/Background1.tif)
-|Volume |$volume |$size|$typeface|$color|$box2|$half + 0|$qrt + 0|
-|Fullscreen|$yesno|$fullscreen|$size|$typeface|$color|$box2|$half + 0|$qrt + 40|
-|Fullscreen|$offon|$fullscreen|$size|$typeface|$color|$box2|$half + 0|$qrt + 40|
@|Exit |$size|$typeface|$color|$box1|$half + 0|$qrt + 80|

@ -0,0 +1,8 @@
from creator import convert2list
from creator import analyse_num
from creator import create_menu
from disp_elem import modrender
from disp_elem import getmaxsize
from disp_elem import button
from disp_elem import inputfield
from disp_elem import slider

@ -2,10 +2,10 @@
import pygame
import disp_elem
from disp_elem import button
from disp_elem import sliders
from disp_elem import slider
#button and sliders would be unsued
button
sliders
slider
def convert2list(string):
@ -50,7 +50,7 @@ class create_menu():
def __init__(self, filename, variables, ref):
self.vars = variables
self.elems = []
self.elems = {"buttons": [], "sliders": [], "surfs": []}
with open(filename) as conf_file:
for line in conf_file:
@ -137,8 +137,9 @@ class create_menu():
line = line[line.index("|") + 1:-1].lstrip()
rel_y, abs_y = analyse_num(line, self.vars)
self.elems.append(disp_elem.button(rel_x, abs_x, rel_y, abs_y, ref,
text, typeface, maxsize, color, img[:3], int(img[3])))
self.elems["buttons"].append(disp_elem.button(rel_x, abs_x, rel_y, abs_y,
ref, text, typeface, maxsize, color, img[:3],
int(img[3])))
if line[0] == "-":
line = line[2:]
@ -209,22 +210,20 @@ class create_menu():
line = line[line.index("|") + 1:-1].lstrip()
rel_y, abs_y = analyse_num(line, self.vars)
self.elems.append(disp_elem.sliders(text, default_value, maxsize, typeface,
color, img, rel_x, abs_x, rel_y, abs_y, ref,
options))
self.elems["sliders"].append(disp_elem.slider(text, default_value,
maxsize, typeface, color, img,
rel_x, abs_x, rel_y, abs_y, ref, options))
if "background" in self.vars:
self.elems.append(pygame.transform.smoothscale(
self.elems["surfs"].append(pygame.transform.smoothscale(
pygame.image.load(self.vars["background"][0]),
ref.size))
self.elems = self.elems[::-1]
def get_klicked(self):
klicked = []
for elem in self.elems:
if isinstance(elem, disp_elem.button):
if elem.klicked:
klicked.append(elem)
for elem in self.elems["buttons"]:
if elem.klicked:
klicked.append(elem)
return klicked
def get_elem(self, name):

@ -35,7 +35,6 @@ def getmaxsize(typeface, size, text, antialias, color, maxsize, borderoff):
class button():
#TODO: Add rel x + y
def __init__(self, rel_x, x, rel_y, y, ref, text, typeface, size,
color, buttons_files, borderoff):
"""Initalises with x and y as center point"""
@ -44,6 +43,7 @@ class button():
self.buttons = (pygame.image.load(buttons_files[0]),
pygame.image.load(buttons_files[1]),
pygame.image.load(buttons_files[2]))
self.img = self.buttons[0]
self.pos = self.buttons[0].get_rect()
self.x = x
self.y = y
@ -79,24 +79,25 @@ class button():
self.textpos = self.text_img.get_rect()
self.textpos.center = self.pos.center
def blit(self, screen, events):
"""Blits the button"""
def update(self, events):
#blitts the button and changes image when hovered over or being clicked
#also posts a menu event to show that a button has been clicked
#to increase performance should be easy to understand
if self.pos.collidepoint(pygame.mouse.get_pos()) and not self.klicked:
screen.blit(self.buttons[1], self.pos)
self.img = self.buttons[1]
for event in events:
if event.type == MOUSEBUTTONDOWN and event.button == 1:
menue = pygame.event.Event(USEREVENT, code="MENU")
pygame.fastevent.post(menue)
self.klicked = True
screen.blit(self.buttons[2], self.pos)
self.img = self.buttons[2]
elif not self.klicked:
screen.blit(self.buttons[0], self.pos)
self.img = self.buttons[0]
else:
screen.blit(self.buttons[2], self.pos)
self.img = self.buttons[2]
def blit(self, screen):
"""Blits the button"""
screen.blit(self.img, self.pos)
screen.blit(self.text_img, self.textpos)
@ -107,10 +108,10 @@ class inputfield():
self.font = pygame.font.SysFont(settings.typeface, 30)
self.header = text
if typ == 1:
self.field = settings.field
self.img = settings.field
elif typ == 2:
self.field = settings.field1
self.pos = settings.field.get_rect()
self.img = settings.field1
self.pos = settings.img.get_rect()
self.pos = self.pos.move(x - (self.pos.w / 2.0), y - (self.pos.h / 2.0))
self.text = ""
self.render_text = settings.modrender(settings.typeface, 30, self.text,
@ -152,7 +153,7 @@ class inputfield():
screen.blit(self.render_text, self.textpos)
class sliders():
class slider():
def __init__(self, name, default_value, size, typeface, color, box,
rel_x, x, rel_y, y, ref, options_list=False):
@ -180,7 +181,7 @@ class sliders():
self.knob_pos.left = self.pos.left + (self.pos.w * self.value)
self.scale = 1.0 / self.pos.w
def modify(self, events):
def update(self, events):
"""Modifies the slider (e.g. pos)"""
for event in events:
if event.type == MOUSEBUTTONUP:
@ -205,10 +206,9 @@ class sliders():
tmp = (self.value * (self.pos.w - self.knob_pos.w))
self.knob_pos.left = self.pos.left + tmp
def blit(self, screen, events):
def blit(self, screen):
#( name, options_list=False):
"""Blits the slider"""
self.modify(events)
if type(self.options_list) == bool:
tmp = self.name + ": " + str(self.value * 100)[:3] + "%"
tmp = tmp.replace("0.0", "0").replace(".", "")

@ -1,8 +0,0 @@
<#box1 = (../../assets/sprites/Button1.tif,../../assets/sprites/Button2.tif,../../assets/sprites/Button3.tif,6)
<#box2 = (../../assets/sprites/Button1.tif,../../assets/sprites/knob1.tif,6)
<~size = 13
<"typeface = monospace
<*color = (255,255,10)
<%half = 50
<%qrt = 25
<[yesno = (OFF, ON)

@ -1,40 +0,0 @@
import creator
import pygame
from creator import disp_elem
#initialize engine ad create window
pygame.init()
pygame.fastevent.init()
screen = pygame.display.set_mode((int(1920 / 2.0), int(1080 / 2.0)))
#read menu config file and print vars and elemens
men = creator.create_menu("./settings.menu", {"volume": 0.3}, screen.get_rect())
print((men.vars))
print((men.elems))
#General loop
while True:
#Updates and blits the elements
events = pygame.fastevent.get()
for elem in men.elems:
if type(elem) == pygame.Surface:
screen.blit(elem, elem.get_rect())
elif isinstance(elem, (disp_elem.button, disp_elem.sliders)):
elem.blit(screen, events)
#Checks for interaction with elements
for event in events:
#This triggers when there has been any interaction
if event.type == pygame.locals.USEREVENT and event.code == "MENU":
#iterates through the clicked elemets
for elem in men.get_klicked():
#if exit button has been pressed , exit
if elem.text == "Exit":
pygame.time.delay(100)
quit()
#returns clicked buttons to normal state after 100ms
pygame.time.delay(100)
elem.klicked = False
#updates the diplay
pygame.display.flip()

@ -1,7 +0,0 @@
&default.vars
<#background = (../../assets/sprites/Background1.tif)
@|Start |$size|$typeface|$color|$box1|$half + 0|%qrt + 0|
@|Settings|$size|$typeface|$color|$box1|$half + 0|%qrt + 40|
@|Credits |$size|$typeface|$color|$box1|$half + 0|%qrt + 80|
@|Exit |$size|$typeface|$color|$box1|$half + 0|%qrt + 120|

@ -1,45 +0,0 @@
# -*- coding: utf-8 -*-
import creator
import pygame
#initialize engine ad create window
pygame.init()
pygame.fastevent.init()
screen = pygame.display.set_mode((int(1920 / 2.0), int(1080 / 2.0)))
fullscreen = True
volume = 0.3
#read menu config file and print vars and elemens
men = creator.create_menu("./settings.menu",
{"fullscreen": str(int(fullscreen)), "volume": str(volume)},
screen.get_rect())
#print((men.vars))-
#print((men.elems))
#General loop
while True:
#Updates and blits the elements
events = pygame.fastevent.get()
for elem in men.elems:
if type(elem) == pygame.Surface:
screen.blit(elem, elem.get_rect())
elif isinstance(elem, (creator.button, creator.sliders)):
elem.blit(screen, events)
#Checks for interaction with elements
for event in events:
#This triggers when there has been any interaction
if event.type == pygame.locals.USEREVENT and event.code == "MENU":
#iterates through the clicked elemets
for elem in men.get_klicked():
#if exit button has been pressed , exit
if elem.text == "Exit":
pygame.time.delay(100)
quit()
#returns clicked buttons to normal state after 100ms
pygame.time.delay(100)
elem.klicked = False
#updates the diplay
pygame.display.flip()

@ -137,8 +137,7 @@ shouldplaynextsong (bool)
events = pygame.event.get()
else:
return
#Playes next song if the last one has ended
# and it should do so.
#Playes next song if the last one has ended.
if self.__endevent in events and shouldplaynextsong:
self.playlist.pop(0)
self._playing = False

@ -21,7 +21,8 @@
".ogg",
".txt",
".sh",
".menu"
".menu",
".vars"
],
"project-type": "",
"postExecScript": "",

@ -27,12 +27,11 @@ sounds.init()
movement.handle()
specials.init()
print(("Loading time: " + str(pygame.time.get_ticks() / 1000.0)))
if not settings.skip:
menu.main()
print(("Loading time:" + str(settings.loading_time / 1000.0)))
#start clock for checking time how long has been played
global clock
clock = settings.clock

@ -6,70 +6,91 @@ from . import sounds
from . import missions
from libs.pyganim import pyganim
import pygame
from libs.menu import creator
from pygame.locals import *
"""Responsible tor the menus"""
def main():
"""Main menu"""
#i hope its easy to understand
screen = settings.screen
"""main menu"""
#import variables
screenx = settings.screenx_current
screeny = settings.screeny_current
fade = settings.fade
fade_pos = settings.fade_pos
color = settings.color
planets = []
background = pygame.image.load("./assets/sprites/Background1.tif")
background = pygame.transform.scale(background, (screenx, screeny))
background_pos = background.get_rect()
src = "./assets/sprites/spinning_planet/planet-"
for num in range(150):
planets.append((src + str(num) + ".png", 0.065))
planet = pyganim.PygAnimation(planets)
planet.rotozoom(20, 0.5)
planet_pos = planet.getRect()
planet_pos = planet_pos.move(int(screenx * 0.65), int(screeny * 0.33))
planet.play()
settings.upd("screenvalues+vol")
screenx /= 2.0
screeny /= 4.0
pygame.mouse.set_visible(True)
run = True
screen = settings.screen
start = objects.button(screenx, screeny, "Start", color)
setting = objects.button(screenx, screeny + 40, "Settings", color)
credit = objects.button(screenx, screeny + 80, "Credits", color)
escape = objects.button(screenx, screeny + 120, "Exit", color)
#set mouse visible
pygame.mouse.set_visible(True)
#create menu
menu = creator.create_menu("./assets/templates/main.menu", {},
pygame.Rect((0, 0), (screenx, screeny)))
#create fade effect
class fade_screen():
def __init__(self, screenx, screeny):
self.fade = pygame.Surface((screenx, screeny))
self.fade.fill((0, 0, 0))
self.fade.set_alpha(0)
self.timer = pygame.time.get_ticks()
self.alpha = 0
def blit(self, screen):
time = pygame.time.get_ticks()
if (time - self.timer) > 70 and self.alpha <= 100:
self.timer = pygame.time.get_ticks()
self.alpha += 1
self.fade.set_alpha(self.alpha)
screen.blit(self.fade, pygame.Rect(0, 0, 0, 0))
fade = fade_screen(screenx, screeny)
menu.elems["externals"] = [fade]
#create the planets animation
class create_planet():
def __init__(self, screenx, screeny):
planets = []
src = "./assets/sprites/spinning_planet/planet-"
for num in range(150):
planets.append((src + str(num) + ".png", 0.065))
planet = pyganim.PygAnimation(planets)
planet.rotate(20)
planet.scale((int(0.2 * screenx), int(0.2 * screenx)))
planet_pos = planet.getRect()
self.planet_pos = planet_pos.move(int(screenx * 0.7), int(screeny * 0.4))
planet.play()
self.planet = planet
def blit(self, screen):
self.planet.blit(screen, self.planet_pos)
planet = create_planet(screenx, screeny)
menu.elems["externals"].insert(0, planet)
#inserts menu music
sounds.music.queue("$not$menue.ogg", 0)
sounds.music.play("stop")
sounds.music.play("play", -1)
alpha = 0.0
while run:
run = True
if alpha < 200:
alpha += 1
fade.set_alpha(alpha / 2)
settings.loading_time = pygame.time.get_ticks()
screen.blit(background, background_pos)
screen.blit(fade, fade_pos)
planet.blit(screen, planet_pos)
screen.blit(fade, fade_pos)
start.blit()
setting.blit()
credit.blit()
escape.blit()
pygame.display.flip()
while run:
settings.upd("get_events")
for surf in menu.elems["surfs"]:
screen.blit(surf, pygame.Rect(0, 0, 0, 0))
for external in menu.elems["externals"]:
external.blit(screen)
for elem in menu.elems["buttons"] + menu.elems["sliders"]:
elem.update(settings.events)
elem.blit(screen)
sounds.music.update(False, False)
for event in settings.events:
if event.type == QUIT:
settings.quit()
@ -82,29 +103,34 @@ def main():
sounds.music.play("next")
run = False
if event.type == USEREVENT and event.code == "MENU":
pygame.time.delay(200)
if start.klicked:
settings.reset()
sounds.music.play("next")
run = False
if setting.klicked:
options()
screenx = settings.screenx_current
screeny = settings.screeny_current
planet_pos.topleft = (int(screenx * 0.65), int(screeny * 0.33))
background = pygame.transform.scale(background,
(int(screenx), int(screeny)))
screenx /= 2.0
screeny /= 4.0
start.move(screenx, screeny)
setting.move(screenx, screeny + 40)
credit.move(screenx, screeny + 80)
escape.move(screenx, screeny + 120)
if credit.klicked:
namings.run()
alpha = 0
if escape.klicked:
settings.quit()
for elem in menu.get_klicked():
elem.klicked = False
if elem.text == "Start":
settings.reset()
sounds.music.play("next")
run = False
if elem.text == "Settings":
options()
screenx = settings.screenx_current
screeny = settings.screeny_current
planet_pos.topleft = (int(screenx * 0.65), int(screeny * 0.33))
for surface in menu.elems["surfs"]:
pos = menu.elems["surfs"].index(surface)
surface = pygame.transform.scale(surface,
(int(screenx), int(screeny)))
menu.elems["surfs"][pos] = surface
menu = creator.create_menu("./assets/templates/main.menu", {},
pygame.Rect((0, 0), (screenx, screeny)))
fade = fade_screen(screenx, screeny)
menu.elems["externals"] = [fade]
planet = create_planet(screenx, screeny)
menu.elems["externals"].insert(0, planet)
if elem.text == "Credits":
namings.run()
if elem.text == "Exit":
settings.quit()
pygame.display.flip()
pygame.mouse.set_visible(False)
@ -112,8 +138,8 @@ def pause():
"""pausing menu"""
#should be easy to understand too
screen = settings.screen
screenx = settings.screenx_current / 2
screeny = settings.screeny_current / 4
screenx = settings.screenx_current
screeny = settings.screeny_current
fade = settings.fade
fade_pos = settings.fade_pos
color = settings.color

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
#Impossible
import pygame
class test():
def __init__(self):
self.img = pygame.Surface((20, 20))
self.img.fill((255, 255, 255))
def __repr__(self):
return self.img
def __call__(self):
return self.img
a = test()
pygame.init()
screen = pygame.display.set_mode((50, 50))
screen.blit(a())
Loading…
Cancel
Save