文章标题

pygame官方文档翻译(V1.9.2)——第一部分:历史,介绍


译者注:本文是pygame官方网站文档http://www.pygame.org/docs的翻译,希望能给予那些希望自己制作游戏的朋友们一点帮助,同时我自己也能在翻译中深入学习到Pygame的用法。

正文部分

python pygame 介绍

原作者:Pete Shinners
联系原作者:pete@shinners.org
这篇文章是给那些希望学习pygame的python程序员的一篇介绍.原文发布在Py Zine第三期第一卷上(注:Py Zine是关于Python的由爱好者自发组织发布关于Python文章的网站http://pyzine.com/)。而这篇介绍比原文更完善了一些。pygame是基于SDL库所开发的一个Python的库。

历史

Pygame项目开始于2000年的夏天。作为一个多年使用C语言的程序员,我同时了解到了Python和SDL。你可能对Python已经很熟悉了,但是你可能需要一点对SDL的介绍,它的全称是Simple DirectMedia Layer。由Sam Lantinga所创建。SDL是一个跨平台的C语言库,主要用于操控多媒体元素,跟DirectX的作用相似。SDL已经被用上百个商业游戏或者开源游戏上面。我对它的清晰和简介感到印象深刻。这也使得我很快意识到如果把python和SDL结合起来会是一个有趣的计划。

不过,我发现Mark Baker已经在实施着同样的想法,PySDL.PySDL由SDL库移植到Python而来,它的语法比普通封装更加简洁明了。但是我感觉它太过于强调C语言式的编程语法。它的暴死也推动了我实施自己想法的动力。

我想要的是真正使用Python语言的优势。我的目标就是让它方便入门,而且也具有深度,可以简洁地用于复杂的项目。Pygame开始于2000年10月。六个月后,1.0版本就发布了。

案例

我认为最好的开始学习一个新的库的方式就是直接看一个范例。在Pygame开发的早期,我用7行代码写了一个弹跳球程序。让我们来看看一个更加平易近人的版本,我想它应该能够让你能跟得上学习的节奏。(译者注:如果你的代码报错,说’E1101:Module ‘pygame’ has no ‘init’ member’,或者’quit’ member的话,请在你的执行目录里不要让别的文件或者文件夹叫Pygame)

import sys, pygame
pygame.init()

size = width, height = 320, 240
speed = [2, 2]
black = 0, 0, 0

screen = pygame.display.set_mode(size)

ball = pygame.image.load("ball.bmp")
ballrect = ball.get_rect()

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

    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

    screen.fill(black)
    screen.blit(ball, ballrect)
    pygame.display.flip()

这就是比较通俗的版本,一开头我们可以看见我们import了两个库,import pygame库会导入所有可用的Pygame的模块,而 pygame.init()这行代码则逐一实例化了这些模块。

screen = pygame.display.set_mode(size)这行语法则创建了一个图形窗口。Pygame和SDL库一样,通过使用默认的图形模块使得创建窗口变得容易。当然,你也可以通过修改这一模块来打造自己的图形窗口,而SDL则会根据你的命令来描绘窗口。Pygame秉持着窗口对象就是图片的原则。display.set_mode()创建了一个可以实时反应图像的对象。你对这个对象的任何修改都可以在显示器上实时反映。

ball = pygame.image.load(“ball.bmp”)这行代码我们加载了我们的球的图片。通过SDL_image库,Pygame支持多种图片格式包括JPG,PNG,TGA和GIF。pygame.image.load()会返回一个用图像构建而成的窗口对象。这个窗口对象会保存着图片中所包含的颜色或者Alpha通道信息(译者注:可以用于解决图层堆叠问题)加载图片之后,ballrect = ball.get_rect()我们创建了一个变量叫ballrect。Pygame通过一个方便使用的叫Rect的类型创建了一个长方形区域。稍后,我们会在动画这部分的代码里看看Rect类型能够做什么。

while开头的代码,则是游戏的主循环。在这个无限循环里(while 1总为真)我们检查使用者的输入并且移动球,然后弹球。如果你对GUI项目很熟悉,你应该体验过类似的事件类型以及事件循环。在pygame里面,也是一样的。然后我们检查是否有quit这一事件的发生,来保证如果我们退出了游戏,pygame会确保关掉所有的事件。

ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]

这部分代码主要负责更新球球的位置,通过设定好的速度我们来移动ballrect。如果球球移动到窗口外面则重置该方向的速度,不是很牛顿力学,不过这是我们需要的。

screen.fill(black)这行代码,我们通过填充黑色刷新屏幕。如果你没有图像方面的工作经验,可能看起来很奇怪。你也许会问:“为什么要刷新所有东西,为什么不直接动感弹球?”因为这不是电脑图形处理的方式。图像不过就是一系列单个图片。当它合理运作时,它的连续运动能很好的糊弄人类。如果不刷新屏幕,当我们继续在新的位置描绘球时,我们能明显得看见球运动的轨迹。
screen.blit(ball, ballrect)通过这行代码,我们在屏幕上描绘了球。blit(图形移动)意味着把像素从一个图片复制到另外一个图片。我们传输了screen.blit()方法,屏幕从这里拷贝像素和应该在哪里放置这些像素。

最后一件事情就是,我们需要刷新显示。Pygame通过一个双重缓存区来管理图像。当我们结束绘图后,我们召唤pygame.display.flip() 方法。这使得我们打算向屏幕绘制的图像变得可见。双重缓存区确保了我们只能在屏幕上看见绘制完成的图像。没有它,我们有时可以看见一个绘制到一半的图形。(BUG信条)

以上就是对Pygame的简短介绍。Pygame也有着用于处理鼠标、键盘甚至手柄输入的模组。当然也有音乐模组。你也可以用pygame绘制图形,甚至像numpy arrays库一样实时操纵图片像素。Pygame模块大部分由C语言写就,少数则是由Python完成。

Pygame官方网站上有着完备的介绍每一个Pygame功能的文档和文章,服务于各个使用者们。网站上也有许多用pygame编写的游戏实例供大家参考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值