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

By | 2011/04/11

博客刚开,打算做一个Pygame的系列,翻译自Will McGugan的《Beginning Game Development with Python and Pygame –From Novice to Professional》,有兴趣的朋友可以搜一下,有英文版的PDF可以下载。其实也不是翻译,把精华摘出来,共同学习。

看这个系列需要有Python的基础知识,虽然一开始想写一篇Python概要的,实在是很庞杂,而且有那么多好的Python基础教程,自己就不多插一脚了吧。入门的话,有Python入门,详尽的话,可以看看Python核心编程或者Python编程金典,然后IBM上的“可爱的Python”系列也很不错,可以扩展一下思维。

OK,让我们开始吧~

Pygame的历史



Pygame是一个利用SDL库的写就的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的,据说他为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,可惜已经倒闭,唉好人不长命啊……)更有效的工作,创造了这个东东。

SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。Pygame已经存在很多时间了,许多优秀的程序员加入其中,把Pygame做得越来越好。

安装Pygame

你可以从www.pygame.org下载Pygame,选择合适你的操作系统和合适的版本,然后安装就可以了(什么,你连Python都没有?您可能是不适合看这个系列了,不过如果执意要学,很好!快去www.python.org下载吧!)。 一旦你安装好,你可以用下面的方法确认下有没有安装成功:

你的版本可能和我不同,这没关系。我所翻译的这本书上的版本还是1.7.1的……所以如果有些过时的不合时宜的东西,千万不要客气请指出来!

若说为什么要介绍这么一个“过时”的东西,真正的知识是不会过时的,只有技术才会。这里主要是依靠Pygame来介绍的游戏开发的方方面面,并不是说咱就可以靠这个做出什么伟大的游戏了(当然也不是说不可以)!

另外说一下,就产品而言,Pygame更致力于2D游戏的开发,也就是说,你可以用Pygame写一个植物大战僵尸,但是写一个魔兽世界则相当困难……请不要做出鄙夷的目光,底层的东西永远是相通的,而且对于新手而言,从简单的2D入手才是正途。

使用Pygame

Pygame有很多的模块,下面是一张一览表:

模块名 功能
pygame.cdrom 访问光驱
pygame.cursors 加载光标
pygame.display 访问显示设备
pygame.draw 绘制形状、线和点
pygame.event 管理事件
pygame.font 使用字体
pygame.image 加载和存储图片
pygame.joystick 使用游戏手柄或者 类似的东西
pygame.key 读取键盘按键
pygame.mixer 声音
pygame.mouse 鼠标
pygame.movie 播放视频
pygame.music 播放音频
pygame.overlay 访问高级视频叠加
pygame 就是我们在学的这个东西了……
pygame.rect 管理矩形区域
pygame.sndarray 操作声音数据
pygame.sprite 操作移动图像
pygame.surface 管理图像和屏幕
pygame.surfarray 管理点阵图像数据
pygame.time 管理时间和帧信息
pygame.transform 缩放和移动图像

有些模块可能在某些平台上不存在,你可以用None来测试一下。

新的Hello World

学程序一开始我们总会写一个Hello world程序,但那只是在屏幕上写了两个字,现在我们来点更帅的!写好以后会是这样的效果:

这个程序需要两张图片,你可以在这篇文章最后的地方找到下载地址,虽然你也可以随便找两张。为了达到最佳效果,背景的 sushiplate.jpg应要有640×480的分辨率,而光标的fugu.png大约应为80×80,而且要有Alpha通道(如果你不知道这是 什么,还是下载吧……)。
注意:代码中的注释我使用的是中文,如果执行报错,可以直接删除。

游戏中我已经为每一行写了注释,另外如果打算学习,强烈建议自己动手输入一遍而不是复制粘贴!

稍微讲解一下比较重要的几个部分:

set_mode会返回一个Surface对象,代表了在桌面上出现的那个窗口,三个参数第一个为元祖,代表分 辨率(必须);第二个是一个标志位,具体意思见下表,如果不用什么特性,就指定0;第三个为色深。

标志位 功能
FULLSCREEN 创建一个全屏窗口
DOUBLEBUF 创建一个“双缓冲”窗口,建议在HWSURFACE或者OPENGL时使用
HWSURFACE 创建一个硬件加速的窗口,必须和FULLSCREEN同时使用
OPENGL 创建一个OPENGL渲染的窗口
RESIZABLE 创建一个可以改变大小的窗口
NOFRAME 创建一个没有边框的窗口

convert函数是将图像数据都转化为Surface对象,每次加载完图像以后就应该做这件事件(事实上因为 它太常用了,如果你不写pygame也会帮你做);convert_alpha相比convert,保留了Alpha 通道信息(可以简单理解为透明的部分),这样我们的光标才可以是不规则的形状。

游戏的主循环是一个无限循环,直到用户跳出。在这个主循环里做的事情就是不停地画背景和更新光标位置,虽然背景是不动的,我们还是需要每次都画它, 否则鼠标覆盖过的位置就不能恢复正常了。

blit是个重要函数,第一个参数为一个Surface对象,第二个为左上角位置。画完以后一定记得用update更新一下,否则画面一片漆黑。

这是一个最最大概的Pygame程序的印象,接下来我们会学习更多深层次的东西,并且把各条语句都真正读懂。

>> 用Python和Pygame写游戏-从入门到精通(2)

本次使用的两张图片资源:

背景:sushiplate.jpg

光标:fugu.png

210 thoughts on “用Python和Pygame写游戏-从入门到精通(1)

  1. Jame

    Love the new design. I was pleased with the content. Thanks for your excellent blog.

    Reply
    1. xishui Post author

      Oh, the 1st comment on my blog. The first time is always sweet(although it doesn’t look like posted by a people…), thanks and I will do better~

      Reply
  2. cipki

    You got a really useful blog I have been here reading for about half an hour. I am a newbie and your post is valuable for me.

    Reply
  3. Dante

    留名,以后详细看
    一直在用django,但很少用python写游戏。之前看到讲pygame的也都是英文版。多谢博主分享~

    Reply
  4. Kingson

    Hi
    1.我用你的图片后,运行程序,发现背景没有被填充满
    查看Backgroup image的大小发现不是640*480的,而是580*435
    2.看你的图片,在fugu.png上没有显示鼠标,而我运行时,在fugu.png上还显示了一个鼠标,这个是为什么?

    Reply
    1. xishui Post author

      看来您是第一个真正实践的啊~伟大!
      1: 图片被WP自动缩放了下……现在更新了,谢谢提醒;
      2: 这是正常的,因为截图的时候鼠标不被截取,后期会讲到如何隐藏光标用Python和Pygame写游戏-从入门到精通(11),使用pygame.mouse.set_visible。

      Reply
      1. python新手

        您好我想问下就是比如其中的一些方法 例如pygame.display.set_caption()这些方法我应该如何查询知道该模块中的类中有这个方法。感觉直接help中也无法查询到就很纠结。而且比如在检测案件的返回值的时候也不知道要检测什么按键怎么输入检测按键名,这些东西的查询不知道何处查询 谢谢指导

        Reply
  5. Kingson

    @xishui:
    1.呵呵,实践出真理嘛
    2.关于第2个问题,那就是截图工具配置的问题了,我使用HyperSnap截图工具,默认是不隐藏鼠标的
    3.另外一个问题,在你的图片上,Title的左边有一个小人的图标,而在我的程序上没有显示该图标,显示的是未指定的那种图标,但将其最小化时,可以在任务栏上看到那个图标。

    Reply
  6. xishui Post author

    @Kingson: 真是观察入微,不过图标显示仅仅是因为操作系统和pygame的版本的关系,和我们的程序无关不用在意,我们也可以在最终作品中手动指定一个自己喜欢的图标,见py2exe编。

    Reply
  7. CoreFix

    这个真的很好!一定要顶,留着学习!

    Reply
  8. tangly

    楼主 谢谢你的共享,以后我会和你一样 谢谢

    Reply
  9. tangly

    你好 感觉pygame开发个小列子,感觉cpu占用很多 ,这个helloworld 我允许的时候 cpu占用了25%啊!
    我是酷睿i3啊

    Reply
    1. xishui Post author

      首先,Python的执行效率肯定是不能和C、C++相比的。不过这个helloworld这么猛并不是因为有多大的运算量,而是急速的刷新引起的。游戏与一般程序不同,一旦启动了,就会用光CPU资源(如果您是单核CPU的话,就是100%了……)来保证画面,这是正常的。在这种情况下,我们可以限制帧率,参考用Python和Pygame写游戏-从入门到精通(8)中的tick(最大帧率),比如设成30,在我的破机器上都可以把CPU占用率有效的控制在5%以下。

      Reply
  10. zxh

    十分感谢楼的教程,但我遇到点问题,我下载的是pygame 1.9.2pre程序运行起来提示

    Traceback (most recent call last):
    File “D:/py/first.py”, line 27, in
    x-= mouse_cursor.get_width() / 2
    NameError: name ‘mouse_cursor’ is not defined

    没有定义mouse_cursor

    Reply
    1. xishui Post author

      这事情很神奇…… 确认mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()执行成功了?名字没有拼错?查找mouse_cursor确认一下吧。

      Reply
  11. shie

    你好楼主,我在做测试的时候,显示没有问题,在点击X关闭窗口时,出现如下提示,再按一次窗口又可以退出了
    Traceback (most recent call last):
    File “C:python-codeHelloWorldHelloWorld.py”, line 29, in
    exit()
    SystemExit

    Reply
    1. 胖华璨

      大神,还麻烦问下。如果Ubuntu下不在终端通过sudo python ***.py 能够执行已经引入 pygame的py程序么? 在我的程序里既用到了pygame又用到了caffe,可sudo python ***.py无法找到caffe,而python ***.py无法找到pygame,求大神帮忙指点方向。

      Reply
    2. LK

      我试了下,在exit()前面加上pygame.quit()语句就可以正常关闭了,win10

      Reply
  12. bone

    楼主出现这个是什么为题呢:
    Traceback (most recent call last):
    File “C:/Python27/程序/game1.py”, line 17, in
    x-=mouse_cursor.get_width() /2
    AttributeError: ‘builtin_function_or_method’ object has no attribute ‘get_width’

    Reply
    1. xishui Post author

      神奇~这样简单的脚本也会出现莫名其妙的错误,这个世界真是充满了无限的未知……
      试一下在“mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()”
      后面加一句print type(mouse_cursor), dir(mouse_cursor)
      看看输出是什么?

      Reply
  13. bone

    为什么先背景,后鼠标,可以看到鼠标:如下
    screen.blit(background, (0,0))
    screen.blit(mouse_cursor, (x, y))

    但是先鼠标,后背景,就看不到鼠标呢?如下:
    screen.blit(mouse_cursor, (x, y))
    screen.blit(background, (0,0))

    Reply
    1. xishui Post author

      真的,为什么呢……
      我在白纸上用颜料画好背景,然后再画个小人,嗯,很漂亮;我先画个小人,然后再用颜料把背景涂满画面,人呢?人怎么看不到了?! :) Just the same

      Reply
  14. 小福

    楼主~ 当我关闭窗口的时候控制台显示SystemExit但窗口并不关闭而程序无响应.然后再关闭一次才能关闭,每次都这样的.请问是怎么回事吖~菜鸟问~

    Reply
  15. Ken

    有没有发现窗体闪烁的情况!?

    就是当前窗体(Pygame生成的)被别的窗体部分覆盖以后,被覆盖窗体的偶尔会闪烁一下。

    screen = pygame.display.set_mode(size)
    screen = pygame.display.set_mode(size,DOUBLEBUF)
    screen = pygame.display.set_mode(size,HWSURFACE|DOUBLEBUF)
    都一样

    Reply
    1. xishui Post author

      很可惜没有,要想学好计算机,必须把英语熟练掌握……

      Reply
  16. halo

    你好啊
    有个问题 我在win7上做开发的没有合适的pygame版本啊
    我的是py2.5.5 64位win7 怎么解决啊 !

    Reply
    1. xishui Post author

      你好,虽然64位如日中天,不过有些python库只有32位,还有些64位的库运作起来似乎有些问题,所以Windows上我现在还是只用32位的python……

      Reply
  17. Aprilis

    >>> Traceback (most recent call last):
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccorenetref.py”, line 123, in __call__
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccorenetref.py”, line 45, in syncreq
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccoreprotocol.py”, line 341, in sync_request
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccoreprotocol.py”, line 158, in _send_request
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccoreprotocol.py”, line 153, in _send
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccorechannel.py”, line 50, in send
    File “D:Program FilesPyScripterLibrpyc-python2x.ziprpyccorestream.py”, line 119, in write
    EOFError: [Errno 10054] An existing connection was forcibly closed by the remote host

    大神…我每次运行完都有这些东西…是怎么回事?

    Reply
    1. xishui Post author

      看起来阁下是使用IDLE里运行的?IDLE对初学者是不错,不过运行复杂程序的时候,可能会有各种神奇的问题……试着只用console看看?

      Reply
  18. purplestonel

    请问下博主,Alpha 通道是什么呢? 我的系统告诉我error: Couldn’t open sushiplate.jpg

    Reply
    1. xishui Post author

      抱歉,这个有些复杂了,请自行搜索,简单说是(不)透明度,但是实际还是需要很多东西来理解;至于错误,你是不是没有把图片放到代码文件的目录下呢?

      Reply
  19. houling

    我根据大师的代码实践了一篇,只是显示一个窗口,就是不显示图片和背景 也没有提示错误(我用的是WINpython3.1) 希望大师能指导一下 我用的系统是WINDOWS7 32位 QQ:657804682 帮我解答一下 谢谢诶

    Reply
  20. houling

    Traceback (most recent call last):
    File “”, line 1, in
    pygame.error: Couldn’t open sushiplate.jpg

    没有找到图片 你是把图片放到哪里? 我是放到Windows7 桌面 我用的是PythonWin 3.1.2

    Reply
    1. xishui Post author

      很显然,我们要把图片和代码放在同一个目录下。不过如果单纯放在桌面上,有可能会受到中文文件名(如果你的用户名是中文的话)的影响,建议放到纯粹的英文目录下。版本的话,只有安装有合适的pygame,是没有关系的。

      Reply
      1. mhc9348

        博主你好,确定代码无误之后还是存在这个问题:
        Traceback (most recent call last):
        File “C:\Python27\py.py”, line 20, in
        background = pygame.image.load(background_image_filename).convert()
        pygame.error: Couldn’t open sushiplate.png
        检查了好久问题还是存在,py.py文件和图片都是放在一个文件夹内的,求赐教,谢谢

        Reply
        1. AceCandy

          你的代码有错吧,sushiplate应该是jpg。。。

          Reply
  21. Aprilis

    @xishui:
    好吧..表示不知道大神在说什么…自行去google了…

    Reply
  22. yuy

    我按照大师的方法实践了一下,不过把背景换了个图片,O(∩_∩)O哈哈~

    Reply
  23. tyt

    请教下为什么PYTHON2.6不能运行?是格式问题么?至少需要哪个版本的?

    Reply
    1. xishui Post author

      2.6可以啊,我的就是2.6,请确认安装了python2.6和对应版本的pygame。可以把错误log贴出来看看。

      Reply
  24. seven

    非常感谢楼主送出这么优秀的教程

    我是一个新手 请问你用的是什么编辑器

    Reply
      1. amitayus

        also vim is my favorite, could you share your .vimrc and recommand some plugins for vim about python?

        Reply
  25. rabbitfan

    在哪里可以下到python2.7对应的版本 ?

    Reply
  26. rabbitfan

    >>>

    Traceback (most recent call last):
    File “C:UsersAdministratorDesktoptry.py”, line 13, in
    screen.blit(background,(0,0))
    TypeError: argument 1 must be pygame.Surface, not builtin_function_or_method
    >>>
    为什么会显示这样?我就把第一行改了一下,会影响么?我就改成s=’slumdank.jpg’这样不可以么?

    Reply
    1. blue_gem

      mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
      没看到你的源代码,但我觉得你应该是这行代码出问题了。看看是不是哪里写错了,比如最后是不是没写上()之类的。

      Reply
    2. blue_gem

      啊。。。。我去,没看时间,过了这么多年了都。。。。囧死了!

      Reply
    1. xishui Post author

      当然没什么不可以,不过请先试着把例程运行一遍再修改。我看错误信息,猜是不是“background = ..” 那一行,最后没有加括号?

      Reply
  27. rabbitfan

    大神啊,我检查了一下 ,应该没有问题,运行时他出现了窗口,但是没有图片,而且程序就不响应了!是不是因为图片大小的问题呢?
    s=’slumdank.jpg’
    import pygame
    from pygame.locals import*
    from sys import exit
    pygame.init()
    screen=pygame.display.set_mode((640,480),0,32)
    background=pygame.image.load(s).convert()
    mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
    while True :
    for event in pygame.event.get():
    if event.type==QUIT:
    exit()

    screen.blit(background,(0,0))
    x,y=pygame.mouse.get_pos()

    x-=mouse_cursor.get_width()/2
    y-=mouse_cursor.get_height()/2
    screen.blit(mouse_cursor,(x,y))
    pygame.display.update()

    Reply
  28. rabbitfan

    screen = pygame.display.set_mode((640, 480), 0, 32)这个表示窗口的大小是640*480的,然后0,32 表示什么呢?(请大神解答一下我这个弱智问题……)
    其实我是因为大作业要写一个程序,编一个游戏,所以才来学这个的,所以什么都不会(我们只讲了graphics)所以请不要见怪~

    Reply
  29. rabbitfan

    楼主 就算不把光标画上去,也会有光标出现的呀 为什么一定要写这句呢“screen.blit(mouse_cursor, (x, y))” ?

    Reply
    1. xishui Post author

      这都开起同学会了啊,挺好,这两天我们同学也聚会了~~
      分别回答你的问题:

      set_mode的参数,文中也写了,第一个是分辨率,第二个是标志位,含义在表中,可以看本系列第三部分有稍详细一点的,第三个是色深,也就是32位色。
      自定义函数退出的话,你可以写成

      def gameover():
          pygame.quit()
          sys.exit()

      应该有效。
      鼠标的事情,不这么写确实也有光标出现,但那是默认的,比较难看不是么,游戏中我们可能希望光标是一把剑、一只眼睛等等,这时候就需要这样的技术,这里是一条鱼。
      最后你的那个程序,除了mouse_image_filename的定义漏了以外,其他都是正确的,如果图片什么的没问题,那可能是你安装的python和pygame有问题了,请试用32位2.6版的python和对应的pygame,一定要配套。

      祝你成功!有问题再留言。

      Reply
  30. rabbitfan

    k = pygame.image.load(k).convert()
    error: Can’t seek in this data source

    大神~~如果我用上面的句法打开gif格式的图片会报错啊 那要怎么打开gif格式的图片呢?

    Reply
    1. xishui Post author

      理论上来说,gif和其他格式的图片没什么区别,看error信息,你确实将k定义成一个gif文件了吗?换两张gif图试试(另外,不要想着直接在pygame中加载能动的gif,绝大多数游戏引擎都不支持,要使用“精灵”来实现)?

      Reply
  31. rabbitfan

    @xishui: 算了 我重新找了jpg格式的 (我试了这个确实不能运行gif格式的!)
    还有啊~def gameover():
    pygame.quit()
    sys.exit()
    大神你定义的这个函数 随时点击关闭窗口随时都可以关闭么?貌似每次直接点关闭就会出现“ File “C:UsersAdministratorDesktoppython大作页新建文件夹main.py”, line 152, in move
    exit()
    SystemExit”这样~~,那要怎么合法关闭呢……?

    Reply
  32. joe

    大师。。我直接复制了你的代码运行。运行结果很奇怪:鱼的图片一直处于鼠标的初始位置,而移动鼠标时,会有一个黑色的鼠标光标出现。也就是说鱼一直处于固定的位置,而当我移动鼠标时,程序中显示的是另一个黑色光标的移动。

    Reply
  33. 走流沙

    @xishui: 我的win7也是,退出时卡住,必须强行才能退出。然后试了你建议的那个方法,可以了。。

    Reply
  34. 有了没

    建议在screen.blit(background, (0,0)) 进行一次 display.update() 要不然会发现是个黑框框,没有图片神马的。。。

    还有就是 #!/usr/bin/python 这句 windows用户就不用加了,
    中文的话可以在第一行(必须是第一行)加入#-*-coding:utf8 -*-

    Reply
  35. Jthon

    你好, 我是刚接触pygame的菜鸟。我按照你的代码并下载了你的两张图片在ubuntu环境下运行了这个hello world。程序能运行但是运行的时候会很卡,有时候甚至会导致ubuntu系统hang住。(ubuntu版本是11.04 ; python 版本是2.7.1+ ;pygame 是1.9.1)。主机是高配置。请问导致这样的现象会是什么原因?按理说这个入门程序是不会导致拥有16G内存的系统hang住的。有点迷惑了,望指点,谢谢 。

    Reply
  36. KidSc

    非常好的资料~~~非常感谢~~~

    Reply
  37. KidSc

    忽然发现,今天恰好是这篇帖子发表一周年的日子~~好巧~~

    Reply
  38. Pingback: ZOE's Blog

  39. pycxz

    为什么我的总是打不开,试了不下20次了,请教下,
    Traceback (most recent call last):
    File “C:Documents and SettingsOwner桌面hello.py”, line 22, in
    background = pygame.image.load(background_image_filename).convert()
    error: Couldn’t open sushiplate

    Reply
  40. pycxz

    我用的是python-2.6.6和pygame-1.9.1win32-py2.6

    Reply
  41. pycxz

    Traceback (most recent call last):
    File “C:Documents and SettingsOwner桌面勿删hello.py”, line 32, in
    exit()
    SystemExit

    Reply
  42. lexi

    这么多问题?! 博主好耐心, 偶学了python一个多月, 虽然代码还好多看不懂, 不过自个儿敲一遍下来是神马问题也木有~~~好吧, 其实是有问题的, 退不出来”. . . SystemExit. . .”~~(python3.2+pygame1.9.2pre+万恶的vista)

    还是要感谢博主的文, 收藏了, 慢慢看~ 🙂

    Reply
  43. pycxz

    将循环改成最下面的就可以解决了,偶然找得到。http://blog.csdn.net/soasme/article/details/4381737
    while True:
    #游戏主循环

    for event in pygame.event.get():
    if event.type == QUIT:
    #接收到退出事件后退出程序
    exit()
    while Ture:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()

    Reply
  44. pycxz

    @pycxz: 将循环改成最下面的就可以解决了,偶然找得到。http://blog.csdn.net/soasme/article/details/4381737
    while True:
    #游戏主循环
    for event in pygame.event.get():
    if event.type == QUIT:
    #接收到退出事件后退出程序
    exit()
    while Ture:
    for event in pygame.event.get():
    if event.type == pygame.QUIT:
    pygame.quit()

    Reply
  45. 月符

    我的环境:win7_64bit python_3.2.3_32bit pygame_1.9.2a0

    退出程序一定要先调用pygame.quit(),不然进程会挂住,不知为何。看前面有个ubuntu环境的同学也是这个情况。

    前面评论里的的SystemExit是正常现象
    sys模块exit()方法的文档是这么说的:Exit the interpreter by raising SystemExit(status).

    只调用pygame.quit(),窗口是关闭了,但是解释器进程还在向下执行,一样有错误信息:
    Traceback (most recent call last):
    File “D:新建文件夹testpygame.py”, line 32, in
    screen.blit(background, (0,0))
    pygame.error: display Surface quit

    退出部分我想还是要这么写:

    for event in pygame.event.get():
    if event.type == QUIT:
    #接收到退出事件后退出程序
    pygame.quit()
    sys.exit()

    或者在while里break

    Reply
  46. 月符

    播放音频的模块是不是应该是 pygame.mixer.music ?

    Reply
  47. Zero

    to use Chinese comment, you can place a magic comment into the source files either as first or second line in the file, such as:
    #coding=utf-8
    or
    #!/usr/bin/env python
    #coding=utf-8

    ref: PEP 0263

    Reply
  48. pigsoldier

    请问mac下的QUIT事件是用什么快捷键触发的呢 虽然pygame定义的QUIT事件是12 但是貌似除了点击窗口上的关闭外其他快捷键都不能发送出关闭的消息

    Reply
    1. xishui Post author

      穷人米有Mac… 试试Command + Q或者 Command + W?

      Reply
  49. xueruo

    请问怎么退出啊?一直在无限循环,不知道按什么键可以终止循环啊,python命令窗一直在返回执行的信息,也没办法输命令。只能强制关闭python命令窗。

    Reply
  50. C墨

    应该在文章中加一句:不要把代码文件放到中文目录下!

    Reply
  51. oberstein

    请教大师,我敲了一边代码之后,在我这里一直都是黑框框,背景图片和鼠标图片都没有显示。已经检查过多遍,没有中文目录,图片和代码在一个文件夹内,python2.7 win32和 pygame-1.9.1.win32-py2.7 一致。可就是图片load不上来。

    # -*- coding: utf-8 -*-
    background_image_filename = 'sushiplate.jpg'
    mouse_image_filename = 'fugu.png'
    
    import pygame
    from pygame.locals import *
    from sys import exit
    
    pygame.init()
    screen = pygame.display.set_mode((640,480),0,32)
    pygame.display.set_caption('Hello World!')
    
    background = pygame.image.load(background_image_filename).convert()
    mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()
    
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                exit()
                
    # pygame.display.update()            
    screen.blit(background, (0,0))
    pygame.display.update()
    
    x,y = pygame.mouse.get_pos()
    x-=mouse_cursor.get_width()/2
    y-=mouse_cursor.get_height()/2
    
    screen.blit(mouse_cursor, (x,y))
    
    pygame.display.update()
    Reply
    1. xishui Post author

      没看出来么?exit()下面的所有语句,是隶属于while True:的呀,您没有缩进那几行代码,所以代码一直在循环,根本没有执行下面的绘制代码~

      Reply
  52. 叶子

    我一开始也是一直终止不了,后来把from sys import exit 改为 import sys 就可以了

    Reply
  53. 天天

    楼主牛人呀,我是初学者,遇到了问题
    1.你程序中的第九行,运行起来错误提示:no module named locals 是我的库没装全么?(python2.7,在IDEL中编写cmd命令下运行) ;
    2.在我删除了from pygame.locals import * 以后再运行,提示我图片打不开。图片在其他目录下放着,试着用了图片的完整目录(相对路径,绝对路径都用了)也不行,后来我尝试把图片跟程序放在同一目录下就可以了。

    Reply
  54. cqq626

    @xishui
    import pygame后再from pygame.locals import *是不是有些多余呢?

    Reply
  55. yuwen

    中文注释会报错,删掉就可以了,感谢作者,这文章真是太棒了

    Reply
  56. godia

    @cqq626:
    如果不写from pygame.locals import *,那么line30中if event.type == QUIT:就应该写成if event.type == pygame.QUIT:
    为了方便而已

    Reply
  57. 疯人院主任

    稍微改进一下代码

    #!python
    import pygame
    from pygame.locals import *

    background_img = ‘bg.jpg’
    mouse_img = ‘mouse.png’

    pygame.init()
    screen = pygame.display.set_mode((800, 500), 0 , 32)
    pygame.display.set_caption(“Hello, World!”)

    background = pygame.image.load(background_img).convert()
    mouse = pygame.image.load(mouse_img).convert_alpha()

    while True:
    for event in pygame.event.get():
    if event.type == QUIT:
    pygame.quit()
    else:
    screen.blit(background, (0, 0))

    x, y = pygame.mouse.get_pos()
    x -= mouse.get_width() / 2
    y -= mouse.get_height() / 2
    screen.blit(mouse, (x, y))

    pygame.display.update()

    Reply
  58. pg1

    #! /usr/bin/env python
    #coding=utf-8
    import pygame
    from pygame.locals import *

    background_img = ‘bg.jpg’
    mouse_img = ‘mouse.png’

    pygame.init()
    screen = pygame.display.set_mode((800, 500), 0 , 32)
    pygame.display.set_caption(“Hello, World!”)

    background = pygame.image.load(background_img).convert()
    mouse = pygame.image.load(mouse_img).convert_alpha()

    while True:
    for event in pygame.event.get():
    if event.type == QUIT:
    pygame.quit()
    exit(0)

    screen.fill(0)
    screen.blit(background, (0, 0))

    x, y = pygame.mouse.get_pos()
    x -= mouse.get_width() / 2
    y -= mouse.get_height() / 2
    screen.blit(mouse, (x, y))

    pygame.display.update()

    Reply
  59. Pingback: [大学]那些年,与我一起纠缠过的代码们 | 汪海的实验室

  60. 拘束

    我要说的是…能详细解释一下set_mode()里的第二和第三个参数么。我的教程里没说啊。

    Reply
  61. ChenMG

    我编程基础比较差,请问楼主个问题:

    关于 查询命令分离的,

    这里代码当中有一行是:
    screen = pygame.display.set_mode((640, 480), 0, 32)

    按我的理解来看,这行应该是一个 命令,也就是返回值应该是None,但是我试了下这段代码,返回的也就是你说的窗口。这类似于 Image.open(),返回的是个Image,但这个是“打开”动作,所以应该算查询,请问你对 查询命令分离,怎么区分,有什么建议吗?

    Reply
    1. oij

      谁规定了打开不能返回对象的? 不要太死板好不啦…
      pygame是包名,display是类名,set_mode是函数名,该函数返回一个display对象…

      Reply
  62. pythoner

    感谢楼主的分享。
    程序运行的时候有个问题,无法关闭,楼主可以详细说下下面的代码吗?
    QUIT 不用双引号的?在我的程序里面如果不用会报错,undefined variable:QUIT

    if event.type == QUIT:
    exit()

    Reply
  63. pythoner

    我改成这样就可以关闭了

    if event.type == pygame.QUIT:
    exit()

    Reply
  64. Amu

    在win7 中pygame.music不存在,是用pygame.mixer来载入音频的

    Reply
  65. 杨哲

    Traceback (most recent call last):
    File “E:/22”, line 14, in
    mouse_cursor = pygame.image.load(mouse_image_filename).convert_alphc
    AttributeError: ‘pygame.Surface’ object has no attribute ‘convert_alphc’
    总是报错,不知道错误在哪,求解?

    Reply
  66. d607

    我跑出來無法執行 跳出這個錯誤
    Traceback (most recent call last):
    File “C:/Python27/env.py”, line 7, in
    import pygame
    ImportError: No module named pygame

    請問是?

    剛新手入門很多都不懂 是否可以加個line 指導一下?

    Reply
    1. 洪腾吟

      我也刚学,我想是你的pygame没装正确吧,要对应好python和pygame的版本号 以及注意机子的位数(32位还是64位)

      Reply
  67. superroy

    看了楼主的博客,觉得学到了好多东西,谢谢

    Reply
  68. 六星币

    楼主,你好幽默啊!
    恩,我遇到了一个小白问题,程序运行一切正常,但如何退出呢? 我是win7 64 位系统,貌似只能任务管理器终结了。

    Reply
    1. 六星币

      改为以下代码就可以了:
      if event.type == pygame.QUIT:
      pygame.quit()
      exit()
      补充:我用的是IDLE

      Reply
      1. staroid

        谢谢,原来关闭一直会显示程序未响应,现在好了。

        Reply
  69. 于筱

    原来在自己的机子上运行没问题,但是在另一台XP机子上运行时出现:File is not a Windows BMP file,提示在图片加载background = pygame.image.load(background_img).convert()时有问题。

    Reply
  70. 眉川喾訾

    error: video system not initialized
    这是神马节奏??!!
    求指点

    Reply
  71. 静心沉淀

    最近对pygame有点感兴趣, 今天部好环境试了下。
    程序跑起来之后抛出:
    pygame.error: File is not a Windows BMP file
    异常。
    请问博主,如何为pygame添加其他格式图片的支持?
    我的操作系统是centos6.5。
    感谢

    Reply
    1. xishui Post author

      这个恐怕颇为困难,需要修改源码吧?我觉得事先转一下格式不是很好么?还能减小体积。

      Reply
  72. GYLheihei

    完美强迫症一下,可以用 pygame.mouse.set_visible(False) 隐藏鼠标图画

    Reply
  73. chensi

    我直接复制试了一下,但是是黑屏,求教

    Reply
  74. chensi

    # -*- coding: utf-8 -*-
    background_image_filename=’sushiplate.jpg’
    mouse_image_filename=’fugu.ng’

    import pygame

    from pygame.locals import *

    import sys

    pygame.init()

    screen= pygame.display.set_mode((640,480),0,32)

    pygame.display.set_caption(‘Hello,World!’)

    background=pygame.image.load(background_image_filename).convert()
    mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()

    while True:
    for event in pyagme.event.get():
    if event.type==pygame.QUIT:
    pygame.quit()
    exit()
    screen.blit(background,(0,0))

    x, y=pygame.mouse.get_pos()
    x-=mouse_cursor.get_width()/2
    y-=mouse_cursor.get_height()/2
    screen.blit(mouse_cursor,(x,y))
    pygame.display.update()

    求解为什么黑屏,关闭时还会让pythonwin关闭

    Reply
  75. chensi

    但是编译的时候问题在background=pygame.image.load(background_image_filename).convert()上,到这里逐步编译会发生如下结果exception raised while running the script

    Reply
  76. 姐夫别这样

    老大 按你的程序弄得 screen.blit(bacground,(0,0)) 后面也加了 pygame.display.update() 为什么我一运行就是黑背景啊
    而且程序就会无响应 win7 64位

    Reply
  77. 姐夫别这样

    弄好了 另外我想知道 怎么加一句 回车键就关闭程序 初学者

    Reply
  78. jason

    对于代码,我有几点建议,同时也是可以解决上面及格网友的问题:

    Reply
      1. jason

        4.对于 ”回车键就关闭程序“ 这个问题可以用一种方法来获取事件的值,然后可以在”for event in pygame.event.get()” 后加上 “if event.type == (事件的值)” 来控制,

        至于实现方法,如下:

        while True:
        for event in pygame.event.get():
        if event.type :
        print event.type

        然后就可以在程序里敲回车键,看其打印出来的数值就行了,

        Reply
    1. jason

      3.建议把”form sys import exit”去掉(不去掉也无所谓~)

      Reply
  79. YY

    你好,我运行时有一个问题……鱼的图片一直处于固定的位置,而移动鼠标时,会有一个另一个黑色的鼠标光标出现。也就是鱼的图片并没有成为鼠标光标。
    下面是我自己敲的代码,到底是哪里出问题了,谢谢~
    a=’sushiplate.jpg’
    mouse_image_filename=’fugu.png’
    import pygame
    from pygame.locals import *
    from sys import exit

    pygame.init()

    screen=pygame.display.set_mode((640,480),0,32)
    pygame.display.set_caption(‘homework’)

    background=pygame.image.load(a).convert()
    mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()

    mainloop=True
    while mainloop:
    ## for event in pygame.event.get():
    #####if event.type==pygame.QUIT:
    ####### mainloop=False
    #######pygame.quit()

    ###screen.blit(background,(0,0))
    ###x,y=pygame.mouse.get_pos()
    ###x-=mouse_cursor.get_width()/2
    ### y-=mouse_cursor.get_height()/2
    ###screen.blit(mouse_cursor,(x,y))

    ### pygame.display.update

    用#表示缩进了……缩进应该没有问题,因为运行的时候没有报错

    Reply
    1. YY

      自己检查出来了 ………………羞耻……不该那么早问的……

      Reply
  80. zeux

    我想在python3上安装pygame,mac osx 10下
    ——————————————

    • sudo port install smpeg
    • sudo port install PORTMIDI
    • sudo port install JPEG
    ————————————
    Hunting dependencies…
    Framework SDL not found
    Framework SDL_ttf not found
    Framework SDL_image not found
    Framework SDL_mixer not found
    Framework smpeg not found
    PNG : not found
    JPEG : found
    SCRAP : not found
    PORTMIDI: not found
    Framework CoreMidi found

    If you get compiler errors during install, doublecheck
    the compiler flags in the “Setup” file.
    ——————————————————————
    bla~ bla~
    p.macosx-10.6-x86_64-3.4/src/gfxdraw.o
    unable to execute /usr/bin/gcc-4.2: No such file or directory
    error: command ‘/usr/bin/gcc-4.2’ failed with exit status 1
    :pygame-1.9.1release zenghb$ cd ~
    :~ zeng$ /usr/bin/
    -bash: /usr/bin/: is a directory

    Reply
  81. 李Young

    exit()前应该加pygame.quit(),可以解决退出时的问题

    Reply
  82. 我热衷于写游戏

    pygame.error: counldn’t open sushiplate.jpg
    第二天还是这个样子~~我的天!!!求助

    Reply
    1. NI_BH

      我也一样。。。不知道是什么原因。。。

      Reply
  83. NI_BH

    运行时显示错误:error: Couldn’t open chouyu.png。昨天还能正常打开,今天就打开失败了,麻烦楼主看看。。。。。

    Reply
      1. NI_BH

        今天又能正常打开了,真是奇怪。。。。
        同样的问题在我打开一个音乐文件的时候也出现过,明天头一天还能打开那个文件,第二天就打不开了,而且我肯定没把那个文件移动到别处。

        Reply
  84. xujin

    background_image_filename=’sushiplate.jpg’
    mouse_image_filename=’fugu.png’

    import pygame

    from pygame.locals import *

    from sys import exit

    pygame.init()

    screen=pygame.display.set_mode((640,480),0,32)

    pygame.display.set_caption(“Hello, World!”)

    background=pygame.image.load(background_image_filename).convert()

    mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()

    while True:

    for event in pygame.event.get():

    if event.type==QUIT:

    exit()

    screen.blit(background, (0,0))

    x,y=pygame.mouse.get_pos()

    x-=mouse_cursor.get_width()/2

    y-=mouse_cursor.get_height()/2

    screen.blit(mouse_cursor,(x,y))

    pygame.display.update()

    这是全部代码,不知道哪里缩进有问题,总显示IndentationError: unindent does not match any outer indentation level。查了全部字符,也没有不正常的呀,请楼主帮忙找一下~谢谢

    Reply
    1. xujin

      background_image_filename=’sushiplate.jpg’
      mouse_image_filename=’fugu.png’

      import pygame

      from pygame.locals import *

      from sys import exit

      pygame.init()

      screen=pygame.display.set_mode((640,480),0,32)

      pygame.display.set_caption(“Hello, World!”)

      background=pygame.image.load(background_image_filename).convert()

      mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()

      while True:

      for event in pygame.event.get():

      if event.type==QUIT:

      exit()

      screen.blit(background, (0,0))

      x,y=pygame.mouse.get_pos()

      x-=mouse_cursor.get_width()/2

      y-=mouse_cursor.get_height()/2

      screen.blit(mouse_cursor,(x,y))

      pygame.display.update()

      刚才的格式不对,不好意思

      Reply
  85. xujin

    background_image_filename=’sushiplate.jpg’
    mouse_image_filename=’fugu.png’

    import pygame

    from pygame.locals import *

    from sys import exit

    pygame.init()

    screen=pygame.display.set_mode((640,480),0,32)

    pygame.display.set_caption(“Hello, World!”)

    background=pygame.image.load(background_image_filename).convert()

    mouse_cursor=pygame.image.load(mouse_image_filename).convert_alpha()

    while True:

    ****for event in pygame.event.get():

    ********if event.type==QUIT:

    ************exit()

    ****screen.blit(background, (0,0))

    ****x,y=pygame.mouse.get_pos()

    ****x-=mouse_cursor.get_width()/2

    ****y-=mouse_cursor.get_height()/2

    ****screen.blit(mouse_cursor,(x,y))

    ****pygame.display.update()

    不好意思啊,太蠢了,是这样子的

    Reply
  86. 潘成飞

    如何实现这个窗口可变大小呢,resizable怎么用 ,求告知

    Reply
  87. yang123

    我本来都看到第8篇了,突然发现第一篇还有问题没有解决。在鱼的那个矩形除了鱼之外的部分怎么没有显示,和透明度有关吗。请各位赐教啊

    Reply
    1. xishui Post author

      应该如此,要么用了不透明的背景,要么没有加载alpha通道

      Reply
  88. Su

    pygame.error: Couldn’t open sunshiplate.jpg 图片和程序放在同一个目录下了,还是不行啊 求楼主解答

    Reply
    1. Su

      pygame.error: Couldn’t open sunshiplate.jpg 图片和程序放在同一个目录下了,还是不行啊 求楼主解答

      background_image_filename = ‘sunshiplate.jpg’
      mouse_miage_filename = ‘fugu.png’

      import pygame
      from pygame.locals import *
      from sys import exit

      pygame.init()

      screen = pygame.display.set_mode((640,480),0,32)
      pygame.display.set_caption(“Hello,World!”)

      background = pygame.image.load(background_image_filename).convert()
      mouse_cursor = pygame.image.load(mouse_miage_filename).convert_alpha()

      while True:
      for event in pygame.event.get():
      if event.type == QUIT:
      exit()

      screen.blit(background,(0,0))

      x,y = pygame.mouse.get_pos()
      x-= mouse_cursor.get_width() / 2
      y-= mouse_cursor.get_height() / 2
      screen.blit(mouse_cursor,(x,Y))

      pygame.display.update()

      Reply
      1. xishui Post author

        那么,您是在什么地方执行这个py文件的呢?直接双击?还是cmd到所在目录下然后”python xxxx.py”的?

        Reply
        1. allen

          在cmd里面执行的,一直报这个错。照片和代码是在同一个文件夹下呀

          Reply
  89. mason

    你好,在第一部分我有两个问题:(1)我用的是windows平台和pythonwin工具,直接执行脚本的时候 from pygame.locals import *这句出错了,意思是没有locals这个模块;但是我在交互窗口输入这句话可以执行,之后再执行脚本的 时候就通过了。网上没有搜到相关的解释,烦劳你给解释下。(2)窗口不知道如何正常关闭,如果点击小“x”退出,整个程序就会异常退出。不知道你设置的那个QUIT是在什么事件的标志呢?

    Reply
    1. 刘元

      我建议你换pycharge这个IDE,pythonwin不如pycharge强大。
      能够自动补全一些符合,很方便。

      Reply
  90. 一个求知者

    读取的图片不需要文件地址吗?电脑怎么找到图片在哪里

    Reply
    1. 小丸子

      把图片和文件放在同一个文件夹下就可以了

      Reply
  91. 小丸子

    这么好的文章我今天才看到,刚看了一篇就忍不住来赞,感谢博主,文章注释写的很详细,很适合我们初学的人学习,博客的风格也很简洁,我很喜欢。

    Reply
  92. ljw6cs

    新手求助
    看了第一节之后试着跟着做,然后在画面上显示了一个背景一个光标,还有几个按键,几个对话框(想做一个类似游戏界面的东西)然后,按键什么的看了后面几节做出来了,也可以用
    但是有个很大的问题是当画面显示的东西多的时候老是有闪烁的现象。一开始我以为是我没能及时跟新,于是我每一次blit的后面都加了句pygame.display.flip(),发现还是不行,于是我换了pygame.display.update(),结果还是没解决闪烁问题,求解

    Reply
    1. x=x+1

      flip()好像是和双缓冲显示配套的吧,可能不太好用……抱歉,其实我也是不太懂……

      Reply
      1. xishui Post author

        双缓冲还是很好用的一个技术,放心现在是块显卡都支持,只管用吧。

        Reply
  93. 奥特慢慢慢

    在最上面写上一行#-*-coding:utf-8-*-就可以了,主要是不支持中文的缘故

    Reply
    1. 奥特慢慢慢

      我说的是输入注释报错加上#-*-coding:utf-8-*-就可以了。。。。

      Reply
      1. 奥特慢慢慢

        我说的是输入注释报错加上#-*-coding:utf-8-*-就可以了。。。。

        Reply
  94. 大头

    我退出时,显示
    Traceback (most recent call last):
    File “E:\python\pygame\hello_word.py”, line 19, in
    exit();
    SystemExit

    不知道是什么原因?

    Reply
  95. johnny

    非常感谢你的博客,希望能给初学者解释的更清楚些,比如我在使用您代码时候,就遇到一个问题,我不知道该把图片放在哪里,呵呵。这是真的。因为没接触过。后来翻看下面的评论看见一位朋友介绍说,把图片放在和代码相同的文件夹即可。(如果图片很多,该怎么归类才比较有顺序,还是一股脑都放在一个文件夹下呢)

    谢谢你。

    Reply
    1. xishui Post author

      可以根据类型分几个文件夹,文件名里写路径。而且估计pyyhon中读取gzip的方法也可能能用(只是猜测),这样就更好看了。

      Reply
  96. 玉刚

    第一次学习,换了背景图,确实能运行,但是还不懂原理

    支持楼主

    Reply
  97. 北方的绵羊

    请教一个问题:在代码:screen = pygame.display.set_mode((640, 480), 0, 32),如果报mode((640, 480), 0, 32)更改为更高的分辨率,如mode((1280, 960), 0, 32)的话,如何使背景图片能够自动填充整个背景? 也就是说,像我们打开浏览器一样,背景随鼠标拖动窗口大小的改变而改变。其用到的函数和方法是哪些?谢谢。

    Reply
      1. 北方的绵羊

        谢谢楼主,楼主好人,你的文章很好。

        Reply
  98. GaoPeng

    谢谢楼主的讲解!非常精彩!
    受教了!

    Reply
  99. Pingback: what is python - IceLanz

  100. 何丰辰

    Traceback (most recent call last):
    File “C:/Users/Hacker/Desktop/程序/pygame.py”, line 6, in
    import pygame
    File “C:/Users/Hacker/Desktop/程序\pygame.py”, line 7, in
    from pygame.locals import *
    ImportError: No module named locals

    #!/usr/bin/env python

    background_image_filename = ‘sushiplate.jpg’
    mouse_image_filename = ‘fugu.png’

    import pygame
    from pygame.locals import *
    from sys import exit

    pygame.init()

    screen = pygame.display.set_mode((640, 480), 0, 32)
    pygame.display.set_caption(“Hello, World!”)

    background = pygame.image.load(background_image_filename).convert()
    mouse_cursor = pygame.image.load(mouse_image_filename).convert_alpha()

    while True:
    for event in pygame.event.get():
    if event.type == QUIT:
    exit()

    screen.blit(background, (0,0))

    x, y = pygame.mouse.get_pos()

    x-= mouse_cursor.get_width() / 2
    y-= mouse_cursor.get_height() / 2
    screen.blit(mouse_cursor, (x, y))

    pygame.display.update()

    Reply
  101. 黄先生

    [root@localhost python]# python pygame_hello_world.py
    Traceback (most recent call last):
    File “pygame_hello_world.py”, line 22, in
    background = pygame.image.load(background_image_filename).convert()
    pygame.error: File is not a Windows BMP file

    linux下提示不是BMP
    图片和代码是放在一起的

    Reply
  102. bww

    楼主求教:
    执行代码出现如下错误,我用load总是告诉我找不到文件,那个failed loading libjpeg,dylib:dlopen(linjpeg,dylib是啥意思?
    background = pygame.image.load(background_image_filename).convert()
    pygame.error: Failed loading libjpeg.dylib: dlopen(libjpeg.dylib, 2): image not found

    Reply
  103. Pingback: 某些有趣的链接 – welcome to doubledna

  104. Pingback: 用Python和Pygame写游戏-从入门到精通(1) | 演道网

  105. 陈一道

    Traceback (most recent call last):
    File “C:/Users/����/Desktop/Pythontest/test2/test2.1.py”, line 19, in
    if event.type() == 12:
    TypeError: ‘int’ object is not callable
    请问楼主这是什么问题 运行的时候 黑屏 闪退 谢谢!

    Reply
  106. a

    程序不能直接运行,运行条件为python2.7.11 ,pygame 1.92
    if event.type == QUIT: #这句出错
    修改为 if event.type == ‘QUIT’: #可以运行

    Reply
  107. vovo

    大神,我直接双击运行文件,但是那个窗口一闪而过,怎么办,我是新手,刚接触,不知道怎么办,应该怎么样才能运行起来

    Reply
  108. XiaoZe

    作者您好,我自己修改了一下源码,让这个小demo能支持鼠标或者键盘控制,一开始用键盘控制,当控制光标移到边缘在移动会出现图片移到窗口外面,我限制了一下x和y的值来控制光标不到外面。但是用鼠标控制的时候,用之前限制数值的方法就失效了,请问该怎么处理?
    while True:
    pygame.mouse.set_visible(False)
    screen.blit(shubiao, (0, 0))
    if config.control[‘move’]==’key’:
    for event in pygame.event.get():
    if event.type == QUIT:exit()
    if event.type == KEYDOWN:
    if event.key in move:move[event.key] = 1
    elif event.type == KEYUP:
    if event.key in move:move[event.key] = 0
    if (1434-99>x>=0 and 1030-118>y>=0):
    x -= move[K_LEFT]
    x += move[K_RIGHT]
    y -= move[K_UP]
    y += move[K_DOWN]
    else:
    x=x+1 if x<1434-99 else 1433-99
    y=y+1 if ybackground.get_width() /2) >0.0 else xx
    yy -= background.get_height() / 2 if (1030-118>background.get_height() / 2) >0.0 else yy
    screen.blit(background, (xx, yy))
    pygame.display.update()

    Reply
  109. XiaoZe

    修改一下之前评论的代码格式
    while True:
    pygame.mouse.set_visible(False)
    screen.blit(shubiao, (0, 0))
    if config.control[‘move’]==’key’:
    for event in pygame.event.get():
    if event.type == QUIT:exit()
    if event.type == KEYDOWN:
    if event.key in move:move[event.key] = 1
    elif event.type == KEYUP:
    if event.key in move:move[event.key] = 0
    if (1434-99>x>=0 and 1030-118>y>=0):
    x -= move[K_LEFT]
    x += move[K_RIGHT]
    y -= move[K_UP]
    y += move[K_DOWN]
    else:
    x=x+1 if x<1434-99 else 1433-99
    y=y+1 if ybackground.get_width() /2) >0.0 else xx
    yy -= background.get_height() / 2 if (1030-118>background.get_height() / 2) >0.0 else yy
    screen.blit(background, (xx, yy))
    pygame.display.update()

    Reply
  110. GROTHEN

    python 3.5.2 pygame 1.9.3
    可以运行,但窗口无法正常关闭
    建议在exist()前面加上pygame.quit()

    Reply
  111. python新手

    您好我想问下就是比如其中的一些方法 例如pygame.display.set_caption()这些方法我应该如何查询知道该模块中的类中有这个方法。感觉直接help中也无法查询到就很纠结。而且比如在检测案件的返回值的时候也不知道要检测什么按键怎么输入检测按键名,这些东西的查询不知道何处查询 谢谢指导

    Reply
  112. 霜泽

    您好,请问会不会更新3.x的教程呢
    非常感谢

    Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注