用Python和Pygame写游戏-从入门到精通(22) 简单的音乐放映实例

来源:互联网 发布:青少年网瘾数据2016年 编辑:程序博客网 时间:2024/05/16 14:50
SCREEN_SIZE = (800, 600)# 存放音乐文件的位置MUSIC_PATH = "./MUSIC"import pygamefrom pygame.locals import *from math import sqrtimport osimport os.path def get_music(path):     # 从文件夹来读取所有的音乐文件    raw_filenames = os.listdir(path)     music_files = []    for filename in raw_filenames:        # 不是Windows的话,还是去掉mp3吧        if filename.lower().endswith('.ogg') or filename.lower().endswith('.mp3'):            music_files.append(os.path.join(MUSIC_PATH, filename))     return sorted(music_files) class Button(object):    """这个类是一个按钮,具有自我渲染和判断是否被按上的功能"""    def __init__(self, image_filename, position):         self.position = position        self.image = pygame.image.load(image_filename)     def render(self, surface):        # 家常便饭的代码了        x, y = self.position        w, h = self.image.get_size()        x -= w / 2        y -= h / 2        surface.blit(self.image, (x, y))     def is_over(self, point):        # 如果point在自身范围内,返回True        point_x, point_y = point        x, y = self.position        w, h = self.image.get_size()        x -= w /2        y -= h / 2         in_x = point_x >= x and point_x < x + w        in_y = point_y >= y and point_y < y + h        return in_x and in_y def run():     pygame.mixer.pre_init(44100, 16, 2, 1024*4)    pygame.init()    close = False    screen = pygame.display.set_mode(SCREEN_SIZE, 0)          #font = pygame.font.SysFont("default_font", 50, False)    # 为了显示中文,我这里使用了这个字体,具体自己机器上的中文字体请自己查询    # 详见本系列第四部分://eyehere.net/2011/python-pygame-novice-professional-4/    font = pygame.font.SysFont("simsunnsimsun", 50, False)         x = 100    y = 240    button_width = 150    buttons = {}    buttons["prev"] = Button("prev.png", (x, y))    buttons["pause"] = Button("pause.png", (x+button_width*1, y))    buttons["stop"] = Button("stop.png", (x+button_width*2, y))    buttons["play"] = Button("play.png", (x+button_width*3, y))    buttons["next"] = Button("next.png", (x+button_width*4, y))     music_filenames = get_music(MUSIC_PATH)    if len(music_filenames) == 0:        print ("No music files found in ", MUSIC_PATH)        return     white = (255, 255, 255)    label_surfaces = []    # 一系列的文件名render    for filename in music_filenames:        txt = os.path.split(filename)[-1]        print("Track:", txt)        # 这是简体中文Windows下的文件编码,根据自己系统情况请酌情更改#        txt = txt.split('.')[0].decode('gb2312')        surface = font.render(txt, True, (100, 0, 100))        label_surfaces.append(surface)     current_track = 0    max_tracks = len(music_filenames)    pygame.mixer.music.load( music_filenames[current_track] )       clock = pygame.time.Clock()    playing = False    paused = False     # USEREVENT是什么?请参考本系列第二部分:    # //eyehere.net/2011/python-pygame-novice-professional-2/    TRACK_END = USEREVENT + 1    pygame.mixer.music.set_endevent(TRACK_END)     while True:         button_pressed = None         for event in pygame.event.get():             if event.type == QUIT:                pygame.quit()                exit                close = True             if event.type == MOUSEBUTTONDOWN:                 # 判断哪个按钮被按下                for button_name, button in buttons.items():                    if button.is_over(event.pos):                        print(button_name, "pressed")                        button_pressed = button_name                        break             if event.type == TRACK_END:                # 如果一曲播放结束,就“模拟”按下"next"                button_pressed = "next"        if close:            break                        if button_pressed is not None:             if button_pressed == "next":                current_track = (current_track + 1) % max_tracks                pygame.mixer.music.load( music_filenames[current_track] )                if playing:                    pygame.mixer.music.play()             elif button_pressed == "prev":                 # prev的处理方法:                # 已经播放超过3秒,从头开始,否则就播放上一曲                if pygame.mixer.music.get_pos() > 3000:                    pygame.mixer.music.stop()                    pygame.mixer.music.play()                else:                    current_track = (current_track - 1) % max_tracks                    pygame.mixer.music.load( music_filenames[current_track] )                    if playing:                        pygame.mixer.music.play()             elif button_pressed == "pause":                if paused:                    pygame.mixer.music.unpause()                    paused = False                else:                    pygame.mixer.music.pause()                    paused = True             elif button_pressed == "stop":                pygame.mixer.music.stop()                playing = False             elif button_pressed == "play":                if paused:                    pygame.mixer.music.unpause()                    paused = False                else:                    if not playing:                        pygame.mixer.music.play()                        playing = True         screen.fill(white)         # 写一下当前歌名        label = label_surfaces[current_track]        w, h = label.get_size()        screen_w = SCREEN_SIZE[0]        screen.blit(label, ((screen_w - w)/2, 450))         # 画所有按钮        for button in buttons.values():            button.render(screen)         # 因为基本是不动的,这里帧率设的很低        clock.tick(5)        pygame.display.update() if __name__ == "__main__":     run()

阅读全文
0 0