from math import sin, cos, pi
import pygame
displayWidth = 640displayHeight = 480fpsLimit = 90
def sinInterpolation(start, end, steps=30): values = [start] delta = end
- start for i in range(1, steps): n = (pi / 2.0) * (i / float(steps -
1)) values.append(start + delta * sin(n)) return values
class RotatingMenu: def __init__(self, x, y, radius, arc=pi*2,
defaultAngle=0, wrap=False): """ @param x: The
horizontal center of this menu in pixels. @param y:
The vertical center of this menu in pixels. @param radius:
The radius of this menu in pixels(note that this is the size of
the circular path in which the elements are placed, the actual size
of the menu may vary depending on item sizes. @param arc: The
arc in radians which the menu covers. pi*2 is a full circle.
@param defaultAngle: The angle at which the selected item is found.
@param wrap: Whether the menu should select the first
item after the last one or stop. """ self.x = x
self.y = y self.radius = radius self.arc = arc
self.defaultAngle = defaultAngle self.wrap = wrap
self.rotation = 0 self.rotationTarget = 0 self.rotationSteps = []
#Used for interpolation self.items = [] self.selectedItem
= None self.selectedItemNumber = 0 def addItem(self, item):
self.items.append(item) if len(self.items) == 1:
self.selectedItem = item def selectItem(self, itemNumber): if
self.wrap == True: if itemNumber> len(self.items) - 1: itemNumber =
0 if itemNumber < 0: itemNumber = len(self.items) - 1 else:
itemNumber = min(itemNumber, len(self.items) - 1)
itemNumber = max(itemNumber, 0) self.selectedItem.deselect()
self.selectedItem = self.items[itemNumber] self.selectedItem.select()
self.selectedItemNumber = itemNumber
self.rotationTarget = - self.arc * (itemNumber / float(len(self.items) - 1))
self.rotationSteps = sinInterpolation(self.rotation,
self.rotationTarget, 45) def rotate(self,
angle): """@param angle: The angle in radians by which the menu is
rotated. """ for i in range(len(self.items)): item =
self.items[i] n = i / float(len(self.items) - 1) rot =
self.defaultAngle + angle + self.arc * n item.x = self.x
+ cos(rot) * self.radius item.y = self.y + sin(rot) * self.radius
def update(self): if len(self.rotationSteps)> 0:
self.rotation = self.rotationSteps.pop(0) self.rotate(self.rotation)
def draw(self, display): """@param display: A pyGame display
object """ for item in self.items: item.draw(display)
class MenuItem: def __init__(self, text="Option"): self.text = text
self.defaultColor = (255,255,255) self.selectedColor =
(255,0,0) self.color = self.defaultColor self.x = 0
self.y = 0 #The menu will edit these self.font =
pygame.font.Font(None, 20) self.image = self.font.render(self.text,
True, self.color) size = self.font.size(self.text) self.xOffset =
size[0] / 2 self.yOffset = size[1] / 2 def select(self):
"""Just visual stuff""" self.color = self.selectedColor
self.redrawText() def deselect(self): """Just visual stuff"""
self.color = self.defaultColor self.redrawText() def
redrawText(self): self.font = pygame.font.Font(None, 20)
self.image = self.font.render(self.text, True, self.color) size =
self.font.size(self.text) self.xOffset = size[0] / 2 self.yOffset
= size[1] / 2 def draw(self, display): display.blit(self.image,
(self.x-self.xOffset, self.y-self.yOffset))
def main(): pygame.init() display =
pygame.display.set_mode((displayWidth, displayHeight)) clock =
pygame.time.Clock() menu = RotatingMenu(x=320, y=240, radius=220,
arc=pi, defaultAngle=pi/2.0) for i in range(4):
menu.addItem(MenuItem("Option" + str(i))) menu.selectItem(0) #Loop
while True: #Handle events events = pygame.event.get() for
event in events: if event.type == pygame.QUIT: return
False if event.type == pygame.KEYDOWN: if event.key
== pygame.K_LEFT: menu.selectItem(menu.selectedItemNumber +
1) if event.key == pygame.K_RIGHT:
menu.selectItem(menu.selectedItemNumber - 1) #Update stuff
menu.update() #Draw stuff display.fill((0,0,0))
menu.draw(display) pygame.display.flip() #Show the updated scene
clock.tick(fpsLimit) #Wait a little
if __name__ == "__main__": main()
I want to change this menu so I can use my own background in .png 800x532 and
add 4 buttons 175x40 in .png one that initiates a .py called Guns.pyone that
links you to a highscores.txt file thats read onlyone that links you to another
.png file with the ability to go back to the main menuOne that terminates the
window
_________________________________________________________________
Attention all humans. We are your photos. Free us.
http://go.microsoft.com/?linkid=9666046
_______________________________________________
Tutor maillist - [email protected]
http://mail.python.org/mailman/listinfo/tutor