X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/a08d887d02d2ba5f61f3c7b0eeb8dae1ba4deddf..46f3ffd7fdde386f41020171b5733e55a8e64a85:/src/app/widgets/playingscreen.py?ds=inline diff --git a/src/app/widgets/playingscreen.py b/src/app/widgets/playingscreen.py deleted file mode 100755 index 955a3ab..0000000 --- a/src/app/widgets/playingscreen.py +++ /dev/null @@ -1,172 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Écran de jeu MinWii : -bandes arc-en-ciel représentant un clavier. - -$Id$ -$URL$ -""" -import pygame -from colorsys import hls_to_rgb -from gradients import gradients -from math import floor -import types -# TODO : positionner cette constance en fonction de la résolution d'affichage -# externaliser la conf. -BORDER = 5 # 5px -FIRST_HUE = 0.6 -OFF_LUMINANCE = 0.2 -OFF_SATURATION = 1 -ON_TOP_LUMINANCE = 0.6 -ON_BOTTOM_LUMINANCE = 0.9 -ON_SATURATION = 1 -ON_COLUMN_OVERSIZING = 1.5 - - -def rename_method(newName) : - def doRename(m) : - m.__name__ = newName - return m - return doRename - - -class MetaRenamer(type): - def __new__(mcs, name, bases, dict) : - for k, v in dict.items() : - if isinstance(v, types.FunctionType) : - if k != v.__name__ : - print 'renommage de %s en %s' % (k, v.__name__) - dict[v.__name__] = v - del dict[k] - return type.__new__(mcs, name, bases, dict) - - -class _PlayingScreenBase(pygame.sprite.OrderedUpdates) : - - __metaclass__ = MetaRenamer - - def __init__(self, distinctNotes=[]) : - """ - distinctNotes : notes disctinctes présentes dans la chanson - triées du plus grave au plus aigu. - """ - super(_PlayingScreenBase, self).__init__() - self.distinctNotes = distinctNotes - self.keyboardLength = 0 - self.keyboardRects = [] - self._initRects() - self._initColumns() - self._running = False - - - - def _initRects(self) : - """ création des espaces réservés pour - afficher les colonnes. - """ - ambitus = self.distinctNotes[-1].midi - self.distinctNotes[0].midi - if ambitus <= 12 : - self.keyboardLength = 8 - else : - self.keyboardLength = 11 - - screen = pygame.display.get_surface() - - # taille de la zone d'affichage utile (bordure autour) - dispWidth = screen.get_width() - 2 * BORDER - dispHeight = screen.get_height() - 2 * BORDER - - columnWidth = int(round(float(dispWidth) / self.keyboardLength)) - - rects = [] - for i in range(self.keyboardLength) : - upperLeftCorner = (i*columnWidth + BORDER, BORDER) - rect = pygame.Rect(upperLeftCorner, (columnWidth, dispHeight)) - rects.append(rect) - - self.keyboardRects = rects - - def _initColumns(self) : - - hueStep = FIRST_HUE / (self.keyboardLength - 1) - for i, rect in enumerate(self.keyboardRects) : - hue = FIRST_HUE - hueStep * i - print hue - c = Column(hue, rect) - self.add(c) - - - def highlightColumn(self, index) : - for i, sprite in enumerate(self.sprites()) : - sprite.update(i==index) - self.draw(pygame.display.get_surface()) - - def run(self): - self._running = True - while self._running : - pygame.display.flip() - events = pygame.event.get() - for event in events: - self.input(event) - - def input(self, event) : - handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None) - handler(event) - - @rename_method('eventHandler%s' % pygame.KEYDOWN) - def handleKeyDown(self, event) : - if event.key == pygame.K_q: - self._running = False - uni = event.unicode - - if uni.isdigit() and int(uni) <=8 : - self.highlightColumn(int(uni)) - - - - -class SongPlayingScreen(_PlayingScreenBase) : - - def __init__(self, song) : - super(SongPlayingScreen, self).__init__(song.distinctNotes) - self.song = song - -class SongPlayingScreenTest(_PlayingScreenBase) : - def __init__(self) : - class C:pass - o = C() - o.midi=1 - super(SongPlayingScreenTest, self).__init__([o]) - - -class Column(pygame.sprite.Sprite) : - - def __init__(self, hue, rect) : - pygame.sprite.Sprite.__init__(self) - sur = pygame.surface.Surface(rect.size) - rgba = hls_to_rgba_8bits(hue, OFF_LUMINANCE, OFF_SATURATION) - sur.fill(rgba) - self.stateOff = sur - self.rectOff = rect - - topRgba = hls_to_rgba_8bits(hue, ON_TOP_LUMINANCE, ON_SATURATION) - bottomRgba = hls_to_rgba_8bits(hue, ON_BOTTOM_LUMINANCE, ON_SATURATION) - rectOn = rect.inflate(ON_COLUMN_OVERSIZING * rect.width, 0) - self.stateOn = gradients.vertical(rectOn.size, topRgba, bottomRgba) - self.rectOn = rectOn - - self.image = self.stateOff - self.rect = rect - - def update(self, state) : - if state : - self.image = self.stateOn - self.rect = self.rectOn - else : - self.image = self.stateOff - self.rect = self.rectOff - -def hls_to_rgba_8bits(h, l, s) : - #convert to rgb ranging from 0 to 255 - rgba = [floor(255 * i) for i in hls_to_rgb(h, l, s) + (1,)] - return tuple(rgba)