Can you try that again? Kent
On Sat, Jun 6, 2009 at 4:20 PM, Essah Mitges<[email protected]> wrote: > > 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. > _______________________________________________ > Tutor maillist - [email protected] > http://mail.python.org/mailman/listinfo/tutor > > _______________________________________________ Tutor maillist - [email protected] http://mail.python.org/mailman/listinfo/tutor
