def show_video_modes(self): self.events.add(Event.KEYUP_Event(key=K_f, callback=self.toggle_fullscreen)) self.events.add(Event.KEYUP_Event(key=K_PAGEUP, callback=self.grow)) self.events.add(Event.KEYUP_Event(key=K_PAGEDOWN, callback=self.shrink)) self.events.add(Event.KEYUP_Event(key=K_RETURN, callback=self._quit)) s = Drawable.String(w=self, message='video', fontSize=40) s.center(y=85) s = Drawable.Stationary(w=self, sprite=s) s.draw() b1 = Widget.SpriteTextButton(self, '640 x 480', callback=self.resize640x480, group=self.events) b1.center(y=125, dx=-100) self.sprites.add(b1) b2 = Widget.SpriteTextButton(self, '800 x 600', callback=self.resize800x600, group=self.events) b2.center(y=125) self.sprites.add(b2) b3 = Widget.SpriteTextButton(self, '1024 x 768', callback=self.resize1024x768, group=self.events) b3.center(y=125, dx=100) self.sprites.add(b3) b4 = Widget.SpriteTextButton(self, 'Full/Window', callback=self.toggle_fullscreen, group=self.events) b4.center(y=165) self.sprites.add(b4) self.pause()
def make_widget(self): self.events.kill() size = self.size w, h = size chars = int(w / 8.0) self.layer = Drawable.Layer(size=size, color=BLACK) self.layer.center(x=10, y=-10) self.terp = InteractiveConsole(self.locals) self.line = TextInput(self.layer, callback=self.run_command, text='', prompt='>>> ', maxLength=chars, length=w, border=0, group=self.events) self.events.add(self.line.events.events()) self.line.center(x=10, y=-10) self.events.add(self.line.events) #self.events.add(Event.KEYUP_Event(key=K_F1, callback=self.toggle_visible)) self.events.add(Event.KEYUP_Event(key=K_UP, callback=self.history_prev)) self.events.add(Event.KEYUP_Event(key=K_DOWN, callback=self.history_next)) self.events.add(Event.KEYUP_Event(key=K_PAGEUP, callback=self.handle_pageup)) self.events.add(Event.KEYUP_Event(key=K_PAGEDOWN, callback=self.handle_pagedown)) self.lines_width = int(0.95 * w) self.lines_height = 5000 self.lines_per_screen = int(0.8 * (h-45)) self.lines = Drawable.Layer(w=self.layer, size=(self.lines_width, self.lines_height), color=BLACK) self.lines.center(x=10, y=15) self.lines_position = h - 52
def gameOver(self): """Show a Game Over message. """ overMsg = Drawable.String(self.window, 'Game Over', fontSize=60, color=LBLUE) overMsg.center() self.overMsg = Drawable.Stationary(self.window, overMsg) self.overMsg.draw() pygame.display.update() pygame.time.wait(1500) self.playAgain()
def makeButton(self): window = self.window text = self.text length = self.length size = self.size color = self.color border = self.border borderColor = self.borderColor padding = self.padding bgColor = self.bgColor t = Drawable.String(message=text, fontSize=size, color=color, bgcolor=bgColor) # use inverse text at cursor position if cursor_pos is set if hasattr(self, 'cursor_pos'): c = self.cursor_pos before = Drawable.String(message=text[:c], fontSize=size, color=color, bgcolor=bgColor) bw, bh = before.image.get_size() cursor = Drawable.String(message=text[c:c+1], fontSize=size, color=bgColor, bgcolor=color) cw, ch = cursor.image.get_size() t.image.blit(cursor.image, (bw, 0)) w, h = t.image.get_size() if length is not None: s = pygame.Surface((length, h)) s.fill(bgColor) s.blit(t.image, (0, 0)) w = length self.length = w bw = w + 2*padding + 2*border bh = h + 2*padding + 2*border if border: #print 'boxing', dir(window) box = Drawable.Rectangle(w=window, width=bw, height=bh, color=borderColor) iw = w + 2*padding ih = h + 2*padding pygame.draw.rect(box.image, bgColor, ((border, border), (iw, ih))) else: #print 'boxing', dir(window) box = Drawable.Rectangle(w=window, width=bw, height=bh, color=bgColor) box.image.blit(t.image, (border+padding, border+padding)) if bgColor == TRANSPARENT: box.image.set_colorkey(TRANSPARENT) self.box = box
def new_line(self, text, prompt=''): save_text = prompt + text s = Drawable.String(w=self.lines, message=save_text, fontSize=22) w, h = s.get_size() # deal with output longer than one line if w > self.lines_width: try: t = Util.render_textrect(save_text, pygame.Rect(0, 0, self.lines_width, 1500), fontSize=22, trim=1) s = Drawable.Image(image=t) except Exception, e: s = Drawable.String(w=self.lines, message='Output too long for this window...', fontSize=22) w, h = s.get_size()
def playAgain(self): """Ask if player wants to play again. """ againMsg = Drawable.String(message='Press [ENTER] to Play Again', fontSize=60, color=LGREEN) againMsg.center() againMsg.nudge(dy=40) self.againMsg = Drawable.Stationary(sprite=againMsg) self.againMsg.draw() self.waitFor() if not self.quit: self.againMsg.clear() self.overMsg.clear() self.restart()
def __init__(self, window=None, size=None, message=None, centertext=1, callback=None): """Initialize dialog @param window: Layer in which to draw the dialog box. @param size: Tuple of C{(width, height)} for dialog box. @param message: String message to be displayed. Text will be wrapped automatically to fit inside the box, but an error will be raised if the text will not fit. @param centertext: Center justify the message by default. @param callback: Function to call when the OK button is clicked or the enter key is pressed. """ Dialog.__init__(self, window, size, callback) if message is None: if self.message is None: message = 'OK ?' else: message = self.message self.events.add(Event.KEYUP_Event(key=K_RETURN, callback=self.ok)) w, h = self.get_size() rect_w = int(0.9 * w) rect_h = int(h - 70) rect = pygame.Rect(0, 0, rect_w, rect_h) textrect = Util.render_textrect(message, rect, fontSize=24, justification=centertext) s = Drawable.Image(w=self, image=textrect) s.center(y=15) s = Drawable.Stationary(w=self, sprite=s) s.draw() ok = SpriteTextButton(self, ' OK ', callback=self.ok, group=self.events) ok.center(y=-30) ok = Drawable.Stationary(w=self, sprite=ok) ok.draw() self.return_ok = None
def __init__(self, window=None, callback=None, group=None): b = Drawable.Square(w=window, side=15, color=WHITE) w, h = b.image.get_size() pygame.draw.line(b.image, BLACK, (0, 0), (w, h)) pygame.draw.line(b.image, BLACK, (w, 0), (0, h)) b.center(-5, 5) #print 'bc', b.center, window.screen.get_size(), b.get_position() StationaryButton.__init__(self, window, b, callback, group) self.draw()
def addLayer(self, size=None): """return a L{Drawable.Layer} and keep track. Each C{Game} has a list (C{.layers}) of all the layers in the game. """ layer = Drawable.Layer(size=size) self.layers.append(layer) return layer
class Actor: drawable = None velocity = (0,0,0) rvAxis = (1,0,0) rvMagnitude = 0 friction = 3 rFriction = 3 def __init__(self): self.drawable = Drawable() def push(self,v): self.velocity = add3(self.velocity,v) def spin(self,mag,axis): newRV = add3(scale3(self.rvAxis,self.rvMagnitude),scale3(axis,mag)) self.rvMagnitude = length3(newRV) self.rvAxis = normalize3(newRV) def update(self,t): self.drawable.draw() self.drawable.move(scale3(self.velocity,t)) if lengthSq3(self.rvAxis)==0: self.rvAxis = (1,0,0) rvInstant = fromAngleAxisQ(self.rvMagnitude*t,self.rvAxis[0],self.rvAxis[1],self.rvAxis[2]) self.drawable.rotate(rvInstant) self.velocity = scale3(self.velocity,1.0-t*self.friction) self.rvMagnitude = self.rvMagnitude*(1.0-t*self.rFriction)
class Actor: drawable = None velocity = (0, 0, 0) rvAxis = (1, 0, 0) rvMagnitude = 0 friction = 3 rFriction = 3 def __init__(self): self.drawable = Drawable() def push(self, v): self.velocity = add3(self.velocity, v) def spin(self, mag, axis): newRV = add3(scale3(self.rvAxis, self.rvMagnitude), scale3(axis, mag)) self.rvMagnitude = length3(newRV) self.rvAxis = normalize3(newRV) def update(self, t): self.drawable.draw() self.drawable.move(scale3(self.velocity, t)) if lengthSq3(self.rvAxis) == 0: self.rvAxis = (1, 0, 0) rvInstant = fromAngleAxisQ(self.rvMagnitude * t, self.rvAxis[0], self.rvAxis[1], self.rvAxis[2]) self.drawable.rotate(rvInstant) self.velocity = scale3(self.velocity, 1.0 - t * self.friction) self.rvMagnitude = self.rvMagnitude * (1.0 - t * self.rFriction)
def __init__(self, window=None): """Initialize the color selector""" Dialog_OK.__init__(self, window=window, size=(400, 380)) self.color_square = Drawable.Square(w=self, side=256) self.color_square.set_position((10, 10)) self.color_square_array = pygame.surfarray.array2d(self.color_square.image) #self.R = 0 self.hue = 0 self.set_color_square() self.color_rect = Drawable.Rectangle(w=self, width=20, height=360) self.color_rect.set_position((370, 10)) self.set_color_rect() self.show_square = Drawable.Square(w=self, side=50) self.show_square.set_position((300, 10)) self.color_chosen = WHITE self.set_color_chosen(self.color_chosen) self.mousebuttonup(None)
def __init__(self, game): self.game = game w, h = conf.WINSIZE w = int(0.5 * w) h = int(0.8 * h) Drawable.Layer.__init__(self, size=(w, h)) GameLooper.__init__(self) self.sprites = self.addGroup(layer=self) self.events.add(Event.KEYUP_Event(key=K_ESCAPE, callback=self._stop)) self.set_background(color=BLACK) self.border(width=3, color=RED) s = Drawable.String(w=self, message='configuration', fontSize=40) s.center(y=15) #print 1, s.get_position() s = Drawable.Stationary(w=self, sprite=s) s.draw() self.center() #print 2, self.get_position() q = Widget.SpriteTextButton(self, 'QUIT', callback=self._quit, group=self.events) q.center(y=50) self.sprites.add(q) cl = Widget.CloseButton(self, callback=self._stop, group=self.events) self.events.add(Event.KEYUP_Event(key=K_s, callback=self.save_config)) save = Widget.SpriteTextButton(self, 'Save', callback=self.save_config, group=self.events) save.center(y=-50) self.sprites.add(save) self.show_video_modes()
def splash_screen(self): """Show the splash screen Called as soon as window is created Game subclasses which do not want a splash screen can override this with a function that just does pass """ if self.splash_filename: self._splash = self.addLayer(size=(200, 100)) self._splash.center() title = Drawable.Image(w=self._splash, filename=self.splash_filename) title.center() title.udraw() self._splash.udraw() else: self._splash = None
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,[0.2, 0.2, 0.2, 1.0]) glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LESS) glShadeModel(GL_FLAT) glCullFace(GL_BACK); glEnable(GL_CULL_FACE); actor = Actor() b = -6 r = 12 scenery = [] for x in range(b,b+r): for y in range(b,b+r): for z in range(b,b+r): flora = Drawable() flora.position = (x*20,y*20,z*20) scenery.append(flora) envlist = glGenLists(1) glNewList(envlist,GL_COMPILE) for flora in scenery: flora.draw() glEndList() glutMainLoop()
def __init__(self): self.drawable = Drawable()
def __init__(self, filename=None, callback=None, group=None): if filename is None: filename = self.filename sprite = Drawable.Image(filename=filename) SpriteButton.__init__(self, sprite=sprite, callback=callback, group=group)
class Console(Widget): def __init__(self, locals={}, size=(600, 200)): self.locals = locals Widget.__init__(self) self.size = size self.history = [] self.history_curr_index = 0 self.buffer = [] self.paged_up = 0 self.save_stdout = sys.stdout self.save_stderr = sys.stderr self.make_widget() def make_widget(self): self.events.kill() size = self.size w, h = size chars = int(w / 8.0) self.layer = Drawable.Layer(size=size, color=BLACK) self.layer.center(x=10, y=-10) self.terp = InteractiveConsole(self.locals) self.line = TextInput(self.layer, callback=self.run_command, text='', prompt='>>> ', maxLength=chars, length=w, border=0, group=self.events) self.events.add(self.line.events.events()) self.line.center(x=10, y=-10) self.events.add(self.line.events) #self.events.add(Event.KEYUP_Event(key=K_F1, callback=self.toggle_visible)) self.events.add(Event.KEYUP_Event(key=K_UP, callback=self.history_prev)) self.events.add(Event.KEYUP_Event(key=K_DOWN, callback=self.history_next)) self.events.add(Event.KEYUP_Event(key=K_PAGEUP, callback=self.handle_pageup)) self.events.add(Event.KEYUP_Event(key=K_PAGEDOWN, callback=self.handle_pagedown)) self.lines_width = int(0.95 * w) self.lines_height = 5000 self.lines_per_screen = int(0.8 * (h-45)) self.lines = Drawable.Layer(w=self.layer, size=(self.lines_width, self.lines_height), color=BLACK) self.lines.center(x=10, y=15) self.lines_position = h - 52 def resize(self, size): self.size = size self.make_widget() self.layer.udraw() def activate(self): Widget.activate(self) self.line.activate() self.layer.udraw() def deactivate(self): Widget.deactivate(self) self.line.deactivate() self.layer.uclear() def new_line(self, text, prompt=''): save_text = prompt + text s = Drawable.String(w=self.lines, message=save_text, fontSize=22) w, h = s.get_size() # deal with output longer than one line if w > self.lines_width: try: t = Util.render_textrect(save_text, pygame.Rect(0, 0, self.lines_width, 1500), fontSize=22, trim=1) s = Drawable.Image(image=t) except Exception, e: s = Drawable.String(w=self.lines, message='Output too long for this window...', fontSize=22) w, h = s.get_size() s.set_position((5, self.lines_position)) self.lines_position += h if self.lines_position > self.lines_height - 50: # starting to run out of room in the lines surface... # i am not sure how large to make this or if i should # bother trying to extend it if it starts to get full. Util.beep() s = Drawable.Stationary(w=self.lines, sprite=s) s.draw() self.lines.clear() self.lines.nudge(dy=-h) self.lines.udraw()