X-Git-Url: https://scm.cri.ensmp.fr/git/minwii.git/blobdiff_plain/a7c9d1fda4c70e7213db409ca66b1555e6539c21..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 0c5e2a4..0000000 --- a/src/app/widgets/playingscreen.py +++ /dev/null @@ -1,171 +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 cursors import WarpingCursor -from eventutils import event_handler, EventDispatcher, EventHandlerMixin -from math import floor -import types -# TODO : positionner cette constance en fonction de la résolution d'affichage -# externaliser la conf. -BORDER = 0 # 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 - - -class _PlayingScreenBase(pygame.sprite.OrderedUpdates, EventHandlerMixin) : - - 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.cursor = None - self._initRects() - self._initColumns() - self._running = False - self.draw(pygame.display.get_surface()) - self._initCursor() - - - - 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 - c = Column(hue, rect) - self.add(c) - - def _initCursor(self) : - self.cursor = WarpingCursor(blinkMode=True) - self.add(self.cursor) - - - 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 - clock = pygame.time.Clock() - pygame.display.flip() - while self._running : - EventDispatcher.dispatchEvents() - dirty = self.draw(pygame.display.get_surface()) - pygame.display.update(dirty) - clock.tick(50) - - @event_handler(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)) - - @event_handler(pygame.MOUSEMOTION) - def handleMouseMotion(self, event) : - pass - - - - -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, EventHandlerMixin) : - - 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 - - @event_handler(pygame.MOUSEBUTTONDOWN) - def onMouseDown(self, event) : - if self.rect.collidepoint(*event.pos) : - self.update(True) - - @event_handler(pygame.MOUSEBUTTONUP) - def onMouseUp(self, event) : - self.update(False) - -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)