# -*- coding: utf-8 -*-

# 注意文件编码也必须是utf-8

SCREEN_SIZE = (800, 600)

# 存放音乐文件的位置

MUSIC_PATH = "./MUSIC"

import pygame

from pygame.locals import *

from math import sqrt

import os

import 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()

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:

return

if event.type == MOUSEBUTTONDOWN:

# 判断哪个按钮被按下

for button_name, button in buttons.iteritems():

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 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()

pygame和python的区别_用Python和Pygame写游戏-从入门到精通(22)相关推荐

  1. python游戏开发框架_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块1)...

    游戏是为了什么而存在的?Bingo,是为了娱乐~ 在这个最高主题之前,技术啥的什么都无所谓! 前一段时间,有位姓刘的网友用Pygame写了个俄罗斯方块,在用py2exe打包的时候遇到一些问题,和我交流 ...

  2. python用户界面游戏_用Python和Pygame写游戏-从入门到精通(实战二:恶搞俄罗斯方块2)...

    我们接着来做这个整死人不偿命的俄罗斯方块. 代码组织和名词约定 上一次我们稍微整理了一下游戏运行的框架,这里需要整理一下python代码的框架,一个典型的pygame脚本结构如下: 其中,lib为py ...

  3. python教程是用什么博客写的-用Python和Pygame写游戏-从入门到精通(目录)

    目光博客一开始,就有一个将pygame好好介绍一遍的宏伟计划,历时四个月,在各位朋友的关怀鞭策下,如今(2011/8/26)理论学习的部分似乎已经都完成了,在次列一个目录,方便查询.介绍还不是很全,下 ...

  4. 用Python和Pygame写游戏-从入门到精通(1)

    From: http://eyehere.net/2011/python-pygame-novice-professional-1/ 博客刚开,打算做一个Pygame的系列,翻译自Will McGug ...

  5. 用Python和Pygame写游戏-从入门到精通

    博客刚开,打算做一个Pygame的系列,翻译自Will McGugan的<Beginning Game Development with Python and Pygame –From Novi ...

  6. python游戏代码示例_用Python和Pygame写游戏-从入门到精通(Sprite篇)

    这又是Pygame教程系列的一个--OVA篇,类似于py2exe篇一样,额外写的,也许不是pygame游戏开发必须的东西,但是知道了绝对大有裨益.因此友情大放送~ 看pygame模块介绍的时候,细心的 ...

  7. 用python和pygame写游戏_用Python和Pygame写游戏-从入门到精通(6)

    掌握了小小的像素,我们可以使用更加复杂一点的东西了,对,就是图像,无数的像素的集合~还记得上次我们为了生成的一张图片,花了无数时间,还好一般游戏不会在游戏的过程中动态生成图像,都是将画好的作为资源封装 ...

  8. python编写赛车游戏单机版_用Python和Pygame写游戏-从入门到精通(20)

    声音是游戏中必要的元素之一,音效可以给予用户良好的反馈体验.赛车的时候可以听到振奋人心的启动时的引擎声和刹车时轮胎摩擦声,射击游戏中枪支弹药的音效和呐喊助威的嗓音,无一不是让人热血沸腾的要因. 宛若电 ...

  9. 用Python和Pygame写游戏-从入门到精通(16)

    经历了长年的艰苦卓绝的披星戴月的惨绝人寰的跋山涉水,我们终于接近了AI之旅的尾声(好吧,实际上我们这才是刚刚开始).这一次真正展示一下这几回辛勤工作的结果,最后的画面会是这个样子: 下面给出完整代码( ...

最新文章

  1. selenium工具的安装
  2. 啊~ 五环 你比四环多一环 啊~ 五环 你比六环少一环
  3. 25行代码AC_ 2017年C/C++ A组第四题 方格分割(dfs剪痕+解题报告)
  4. Fedora CentOS Red Hat中让vim支持语法高亮设置
  5. Phoenix 关联查询异常 , MaxServerCacheSizeExceededException phoenix.query.maxServerCacheBytes
  6. 一步一步SharePoint 2007之四十八:实现Excel Service(3)——调用Excel Service
  7. 查看登陆系统用户的信息的三种方法详解
  8. 2018-12-28
  9. 对tensorflow 的BatchNormalization的坑的理解与测试
  10. linux虚拟机模板部署模板,创建和部署基于 Linux 的虚拟机模板
  11. 正确的电源纹波测试方法
  12. ClustalX进行多序列比对流程
  13. matlab求多元函数微积分,中北大学高等数据MATLAB验证性实验7多元函数微积分学MATLAB实验报告格式...
  14. font标签的size属性
  15. python ttk_python-3.x – 为什么导入*然后ttk?
  16. 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...
  17. 个人收藏夹 html,用h1和段落p 写一个三毛语录
  18. java版本与javac版本不一致引起终端无法运行java文件问题
  19. OpenCV 颜色空间RGB 到HSI CMYK的转换 C++
  20. SQL注入漏洞入门介绍

热门文章

  1. 零基础入门Python3-列表list详解
  2. JAVA中关于set()和get()方法的理解及使用
  3. css的一些常见问题处理方法
  4. PHP--去除字符串首尾空格
  5. libevent for android
  6. ibatis.net:第六天,QueryForList
  7. python编程书籍资料整理大全
  8. [HDU4635] Strongly connected
  9. Web端口复用正向后门研究实现与防御
  10. Sublime 格式化代码 快捷键以及插件使用