def __init__(self, data, fs=None, loop=False, api=None, name=None, fixed_delay=None, api_options=None): assert AudioFormat is not None if any(x is not None for x in (api, name, fixed_delay, api_options)): raise ValueError('The Pyglet backend does not support specifying ' 'api, name, fixed_delay, or api_options') # We could maybe let Pyglet make this decision, but hopefully # people won't need to tweak the Pyglet backend anyway self.fs = 44100 if fs is None else fs super(SoundPlayer, self).__init__() _check_pyglet_audio() sms = _as_static(data, self.fs) if _new_pyglet(): self.queue(sms) self.loop = bool(loop) else: group = SourceGroup(sms.audio_format, None) group.loop = bool(loop) group.queue(sms) self.queue(group) self._ec_duration = sms._duration
def __init__(self, data, fs, loop=False): assert AudioFormat is not None super(SoundPlayer, self).__init__() _check_pyglet_audio() sms = _as_static(data, fs) group = SourceGroup(sms.audio_format, None) group.loop = bool(loop) group.queue(sms) self.queue(group)
def play_sound_once(self,soundfile,volume): if self.config.sound_switch>0: play_sound = Player() play_sound_source = load(soundfile) play_sound_group = SourceGroup(play_sound_source.audio_format, None) play_sound_group.loop = False play_sound_group.queue(play_sound_source) play_sound.queue(play_sound_group) play_sound.volume=float(volume) * self.config.sound_switch play_sound.play()
def __init__(self, data, fs=None, loop=False, api=None, name=None): assert AudioFormat is not None if api is not None or name is not None: raise ValueError('The Pyglet backend does not support specifying ' 'api or name') # We could maybe let Pyglet make this decision, but hopefully # people won't need to tweak the Pyglet backend anyway self.fs = 44100 if fs is None else fs super(SoundPlayer, self).__init__() _check_pyglet_audio() sms = _as_static(data, self.fs) group = SourceGroup(sms.audio_format, None) group.loop = bool(loop) group.queue(sms) self.queue(group) self._ec_duration = sms._duration
def __init__(self): super(App, self).__init__(width=1920, height=1200, caption=G.APP_NAME + ' / ' + G.APP_VERSION, resizable=False, fullscreen=G.FULLSCREEN) # Initialisation des variables importantes self.music_player = pyglet.media.Player() self.batch = Batch() self.secondPatch = Batch() self.keyboard = key.KeyStateHandler() self.pad = PAD() # Initialisation des labels de scores self.player1_score = Label('0', x=(self.width // 2) // 2 + 200, y=1100, font_size=60, font_name='Roboto Mono') self.player2_score = Label('0', x=self.width // 2 + (self.width // 2) // 2 - 200, y=1100, font_size=60, font_name='Roboto Mono') # Initialisation des 4 joueurs, 2 pour la difficulté "Moyen" et "Difficile" et 2 pour la difficulté "Facile" self.P1 = Player(0, paddle, 0, self.height // 2 - paddle.height // 2, self.batch, self) self.P2 = Player(1, paddle, self.width - paddle.width, self.height // 2 - paddle.height // 2, self.batch, self) self.P3 = Player(0, paddleSimple, 0, self.height // 2 - paddleSimple.height // 2, self.secondPatch, self) self.P4 = Player(1, paddleSimple, self.width - paddleSimple.width, self.height // 2 - paddleSimple.height // 2, self.secondPatch, self) # Initilialisation de la balle et du menu de jeu self.ball = Ball(ball, self.width // 2 - (ball.width // 2), self.height // 2 - (ball.height // 2)) self.level = Label('Choisissez le niveau', x=self.width // 2, y=self.height // 2 + 300, anchor_x='center', anchor_y='center', font_size=70) self.simple = Label('Facile', x=self.width // 2 - 400, y=self.height // 2, anchor_x='center', anchor_y='center', font_size=50, color=(0, 255, 0, 255)) self.medium = Label('Moyen', x=self.width // 2, y=self.height // 2, anchor_x='center', anchor_y='center', font_size=50, color=(255, 191, 0, 255)) self.hard = Label('Difficile', x=self.width // 2 + 400, y=self.height // 2, anchor_x='center', anchor_y='center', font_size=50, color=(255, 0, 0, 255)) self.players = [self.P1, self.P2] self.push_handlers(self.keyboard) self.pad.midiIn.callback = self.callback # Initialise la musique et la lance self.looper = SourceGroup(music.audio_format, None) self.looper.loop = True self.looper.queue(music) self.music_player.volume = 1.0 self.music_player.queue(self.looper) self.music_player.play() # Initialisation de variables importantes au jeu self.niveau = 2 self.start = False self.freeze = True self.mysterious = False self.canClick = False self.ball.radius = 25 self.init_led() # Lance la boucle du jeu pyglet.clock.schedule_interval(self.update, 1 / G.MAX_FPS)
def queue(self, source): source_group = SourceGroup(source.audio_format, source.video_format) source_group.queue(source) Player.queue(self, source_group) source_group.loop = self.loop
class App(pyglet.window.Window): "Logique du jeu et classe principale" # Constructeur def __init__(self): super(App, self).__init__(width=1920, height=1200, caption=G.APP_NAME + ' / ' + G.APP_VERSION, resizable=False, fullscreen=G.FULLSCREEN) # Initialisation des variables importantes self.music_player = pyglet.media.Player() self.batch = Batch() self.secondPatch = Batch() self.keyboard = key.KeyStateHandler() self.pad = PAD() # Initialisation des labels de scores self.player1_score = Label('0', x=(self.width // 2) // 2 + 200, y=1100, font_size=60, font_name='Roboto Mono') self.player2_score = Label('0', x=self.width // 2 + (self.width // 2) // 2 - 200, y=1100, font_size=60, font_name='Roboto Mono') # Initialisation des 4 joueurs, 2 pour la difficulté "Moyen" et "Difficile" et 2 pour la difficulté "Facile" self.P1 = Player(0, paddle, 0, self.height // 2 - paddle.height // 2, self.batch, self) self.P2 = Player(1, paddle, self.width - paddle.width, self.height // 2 - paddle.height // 2, self.batch, self) self.P3 = Player(0, paddleSimple, 0, self.height // 2 - paddleSimple.height // 2, self.secondPatch, self) self.P4 = Player(1, paddleSimple, self.width - paddleSimple.width, self.height // 2 - paddleSimple.height // 2, self.secondPatch, self) # Initilialisation de la balle et du menu de jeu self.ball = Ball(ball, self.width // 2 - (ball.width // 2), self.height // 2 - (ball.height // 2)) self.level = Label('Choisissez le niveau', x=self.width // 2, y=self.height // 2 + 300, anchor_x='center', anchor_y='center', font_size=70) self.simple = Label('Facile', x=self.width // 2 - 400, y=self.height // 2, anchor_x='center', anchor_y='center', font_size=50, color=(0, 255, 0, 255)) self.medium = Label('Moyen', x=self.width // 2, y=self.height // 2, anchor_x='center', anchor_y='center', font_size=50, color=(255, 191, 0, 255)) self.hard = Label('Difficile', x=self.width // 2 + 400, y=self.height // 2, anchor_x='center', anchor_y='center', font_size=50, color=(255, 0, 0, 255)) self.players = [self.P1, self.P2] self.push_handlers(self.keyboard) self.pad.midiIn.callback = self.callback # Initialise la musique et la lance self.looper = SourceGroup(music.audio_format, None) self.looper.loop = True self.looper.queue(music) self.music_player.volume = 1.0 self.music_player.queue(self.looper) self.music_player.play() # Initialisation de variables importantes au jeu self.niveau = 2 self.start = False self.freeze = True self.mysterious = False self.canClick = False self.ball.radius = 25 self.init_led() # Lance la boucle du jeu pyglet.clock.schedule_interval(self.update, 1 / G.MAX_FPS) # Reset du plateau du PAD def reset_pad_button(self): for i in range(0, 8): for j in range(0, 8): self.pad.send_message([128, i * 16 + j, 0]) # Logique du niveau 1 pour déplacer les barres def level_1(self, message): nbrButton = 4 if message[0] == 144: x = message[1] // 16 y = message[1] - (16 * x) if y > 7: return 0 if y < 1: self.players[0].x, self.players[0].y = self.players[0].positions[(x * nbrButton) + y] if y > 6: self.players[1].x, self.players[1].y = self.players[1].positions[(x * nbrButton) + nbrButton + (nbrButton - y) - 1] # Logique du niveau 2 pour déplacer les barres def level_2(self, message): nbrButton = 4 if message[0] == 144: x = message[1] // 16 y = message[1] - (16 * x) if y > 7: return 0 if y < 1: self.players[0].x, self.players[0].y = self.players[0].positions[(x * nbrButton) + y] if y > 6: self.players[1].x, self.players[1].y = self.players[1].positions[(x * nbrButton) + nbrButton + (nbrButton - y) - 1] # Logique du niveau 3 pour déplacer les barres def level_3(self, message): nbrButton = 4 if message[0] == 144: x = message[1] // 16 y = message[1] - (16 * x) if y > 7: return 0 if y < 3: self.players[0].x, self.players[0].y = self.players[0].positions[(x * nbrButton) + y] if y > 4: self.players[1].x, self.players[1].y = self.players[1].positions[(x * nbrButton) + nbrButton + (nbrButton - y) - 1] # Fonction qui est appelé lorsqu'un évenement est déclenché sur le PAD def callback(self, message, dt): if self.start: if self.freeze is not True: if self.niveau == 1: self.level_1(message) if self.niveau == 2: self.level_2(message) elif self.niveau == 3: self.level_3(message) if message[1] == 111 and message[0] == 176: self.reset_game() else: for b in self.pad.buttonLevel: if message[1] == b: if b == 104: self.niveau = 1 self.init_led_lvl() self.players = [self.P3, self.P4] elif b == 105: self.niveau = 2 self.init_led_lvl() self.players = [self.P1, self.P2] else: self.niveau = 3 self.init_led_lvl3() self.players = [self.P1, self.P2] self.start = True self.freeze = False # Reset de la balle def reset_ball(self, winner=2): self.ball.x, self.ball.y = self.width / 2 - self.ball.width / 2, self.height / 2 - self.ball.height / 2 if winner == 2: r = randint(0, 2) if r == 0: self.ball.dx = 800 / 1000 elif r == 1: self.ball.dx = -800 / 1000 elif winner == 1: self.ball.dx = 800 / 1000 elif winner == 0: self.ball.dx = -800 / 1000 self.ball.dy = 0 / 1000 self.reset_paddle() # Reset des barres def reset_paddle(self): for p in self.players: if p.NUMBER == 0: p.x, p.y = 0, self.height // 2 - p.height // 2 else: p.x, p.y = self.width - p.width, self.height // 2 - p.height // 2 # Reset du plateau de jeu def reset_game(self): self.start = False self.players[0].score = 0 self.players[1].score = 0 self.reset_ball() self.pad.resetButton() self.init_led() self.freeze = True # Fonction qui met à jour le jeu, l'affichage def update(self, dt): if self.freeze: return 0 # Calcul le nouveau X et Y par rapport au FPS dt *= 1000 b = self.ball b.newX = b.x + b.dx * dt b.newY = b.y + b.dy * dt paddle1 = self.players[0] paddle2 = self.players[1] # Relance le jeu si le score est plus grand ou égale à 7 if self.players[0].score >= 7: self.reset_game() if self.players[1].score >= 7: self.reset_game() # Teste les rebonds en Y et renvoie la balle if b.newY < 0: b.newY = -b.newY b.dy = -b.dy elif b.newY + b.width > self.height: b.newY -= 2 * ((b.newY + b.width) - self.height) b.dy = -b.dy # Collisions Balle - Barre gauche if b.newX < paddle1.x + paddle1.width <= b.x: intersectX = paddle1.x + paddle1.width intersectY = b.y - ((b.x - (paddle1.x + paddle1.width)) * (b.y - b.newY)) / (b.x - b.newX) if paddle1.y - 50 <= intersectY <= paddle1.y + paddle1.height: relativeIntersectY = (paddle1.y + (paddle1.height / 2)) - intersectY b.bounceAngle = (relativeIntersectY / (paddle1.height / 2)) * (math.pi / 2 - b.maxBounceAngle) ballSpeed = math.sqrt(b.dx * b.dx + b.dy * b.dy) if b.newY - b.y != 0: ballTravelLeft = (b.newY - intersectY) / (b.newY - b.y) else: ballTravelLeft = 0 b.dx = ballSpeed * math.cos(b.bounceAngle) b.dy = ballSpeed * -math.sin(b.bounceAngle) b.newX = intersectX + ballTravelLeft * ballSpeed * math.cos(b.bounceAngle) b.newY = intersectY + ballTravelLeft * ballSpeed * math.sin(b.bounceAngle) # Augmente la vitesse à chaque fois que la barre touche la balle b.dx += 0.07 # Collisions Balle - Barre droite if b.newX > paddle2.x - paddle2.width >= b.x: intersectX = paddle2.x - paddle2.width intersectY = b.y - ((b.x - (paddle2.x - paddle2.width)) * (b.y - b.newY)) / (b.x - b.newX) if paddle2.y - 50 <= intersectY <= paddle2.y + paddle2.height: relativeIntersectY = (paddle2.y + (paddle2.height / 2)) - intersectY b.bounceAngle = (relativeIntersectY / (paddle2.height / 2)) * (math.pi / 2 - b.maxBounceAngle) ballSpeed = math.sqrt(b.dx * b.dx + b.dy * b.dy) if b.newY - b.y != 0: ballTravelLeft = (b.newY - intersectY) / (b.newY - b.y) else: ballTravelLeft = 0 b.dx = ballSpeed * math.cos(b.bounceAngle) * -1 b.dy = ballSpeed * math.sin(b.bounceAngle) * -1 b.newX = intersectX - ballTravelLeft * ballSpeed * math.cos(b.bounceAngle) b.newY = intersectY - ballTravelLeft * ballSpeed * math.sin(b.bounceAngle) # Augmente la vitesse à chaque fois que la barre touche la balle b.dx -= 0.07 # Teste si la balle a dépassé la barre gauche et ajoute un point ou le contraire if b.newX < -100: paddle2.score += 1 self.reset_ball(0) return elif b.newX + b.width > self.width + 100: paddle1.score += 1 self.reset_ball(1) return self.player1_score.text = str(self.players[0].score) self.player2_score.text = str(self.players[1].score) b.x = b.newX b.y = b.newY # Méthode appelé pour faire un rendu sur la fenêtre def on_draw(self): window.clear() background.blit(0, 0) if self.start: self.player1_score.draw() self.player2_score.draw() self.ball.draw() if self.niveau == 1: self.secondPatch.draw() else: self.batch.draw() else: self.level.draw() self.simple.draw() self.medium.draw() self.hard.draw() #Méthode qui initialise le niveau 1 et 2 sur le PAD def init_led_lvl(self): for i in range(8): for j in range(1): note = i * 16 + j self.pad.send_message([self.pad.turnOnLed, note, self.pad.colorLedFlash['Green']]) for i in range(8): for j in range(1): note = i * 16 + (7 - j) self.pad.send_message([self.pad.turnOnLed, note, self.pad.colorLedFlash['Red']]) #Méthode qui initialise le niveau 3 sur le PAD def init_led_lvl3(self): for i in range(8): for j in range(3): note = i * 16 + j self.pad.send_message([self.pad.turnOnLed, note, self.pad.colorLedFlash['Green']]) for i in range(8): for j in range(3): note = i * 16 + (7 - j) self.pad.send_message([self.pad.turnOnLed, note, self.pad.colorLedFlash['Red']]) # Initialisation des lumières pour choisir le niveau def init_led(self): i = 0 for b in self.pad.buttonLevel: if i == 0: color = self.pad.colorLed['Green'] elif i == 1: color = self.pad.colorLed['Amber'] else: color = self.pad.colorLed['Red'] self.pad.send_message([self.pad.turnOnAutomap, b, color]) i += 1
def queue(self, source): source = self.engine[source] looper = SourceGroup(source.audio_format, None) looper.loop = True looper.queue(source) super(AmbientPlayer, self).queue(looper)