美文网首页pygame游戏编程
00 Python Pygame 简介

00 Python Pygame 简介

作者: 易景漫游杨晓宏 | 来源:发表于2019-07-16 15:03 被阅读0次

    Python Pygame 简介

    Author: Pete Shinners(pete@shinners.org)

    翻译: 杨晓宏(561071777@qq.com)

    这篇文章为python编程者提供了一个对pygame的一个介绍。pygame是建立的在SDL(Simple DirectMedia Layer)库基础上的一个扩展库 。

    历史

    Pygame出现于2000年夏天。作为一名多年的C程序员,我在大约同一时间发现了Python和SDL。您已经熟悉Python,您可能需要对SDL进行介绍,它是Simple_DirectMedia_Layer的缩写。SDL由SamLantinga创建,是一个用于控制多媒体的跨平台C库,可与DirectX相媲美。它已经被用于数百个商业和开源游戏。将Python和SDL整合在一起,于是有了pygame的诞生。

    Pygame是在2000年10月开始的开发,在6个月后,pygame 1.0版本发布。

    任务

    理解一个新库的最好方法就是直接看一个例子。
    在pygame的早期,我用7行代码创建了一个跳跃的球动画。让我们来看看同样的东西。这是一个更友好的版本。
    这应该足够简单,可以跟随我的解释,完全理解它们。

    ../_images/intro_ball.gif
    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("intro_ball.gif")
    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()
    

    这是一个弹跳球的动画。
    The import pygame 导入了包含所有游戏模块的包,然后调用了pygame.init() 初始化所有这些模块 。

    在第8行,创建了一个图形窗口,其中调用pygame.display.set mode()。
    Pygame和SDL通过默最佳图形模式来实现这一点。你可以重写这个模式,SDL将协调硬件能力。
    Pygame表示图像为表面对象。set_mode()函数创建一个新的Surface对象,它代表实际显示的图形。你对这个表面做的任何改变都会在显示器上看到。

    在第10行,我们加载我们的球图像。
    Pygame通过sdlimage库支持多种图像格式,包括BMP、JPG、PNG、TGA和GIF。py.image.load()函数返回一个带有球图像数据的表面。
    这个表面将保留任何颜色键或alpha透明度。加载完球图像后,我们创建了一个名为ballrect的变量。Pygame附带了一个实用对象类型,名为Rect,它代表一个矩形区域。稍后,在代码的动画部分中,我们将看到Rect对象可以做什么。

    在第13行,我们的程序被初始化并准备运行。
    在一个无限循环中,我们检查用户输入,移动球,然后画出球。如果您熟悉GUI编程,那么您就有过事件和事件循环的经验。
    在pygame中,这没有区别。我们检查是否发生了退出事件。如果我们只是退出程序,pygame将确保清理一切后关闭。
    现在是时候更新我们的球位置了。第17到21行按当前速度移动矩形变量。如果球移到屏幕外,我们就会在这个方向上改变速度。无损失的反弹并不完全符合牛顿物理定律,但这是我们所需要的。

    在第23行,我们通过填充黑色RGB颜色来擦除屏幕。

    如果你从未使做过动画,这可能看起来很奇怪。你可能会问“为什么我们需要擦除任何东西,为什么我们不把球移到屏幕上呢?”
    这并不是电脑动画的工作方式。动画只不过是一系列的单一图像,当它们按顺序显示时,就能很好地欺骗人类的眼睛,感觉到了运动。
    屏幕只是用户看到的单个图像。如果我们没有花时间把球从屏幕上抹去,我们就会看到球的“轨迹”,以前的球不会消失。因为我们不断地在新位置上画出球。
    在第24行,我们把球图像画在屏幕上。图像的绘制是由Surface.blit()方法处理的。一个blit基本上意味着将像素的颜色从一个图像复制到另一个图像。我们通过blit方法将一个源表面复制,并将源放置到目的地。
    我们需要做的最后一件事是更新显示区域。
    Pygame用一个双缓冲来管理显示。当我们完成绘图时,我们调用pygame.display.flip()将完整显示内容更新到屏幕方法。
    这使得我们在屏幕上绘制的所有东西可见。这个缓冲确保我们只看到屏幕上完全绘制的帧。
    如果没有它,用户将会看到屏幕上已经完成的一半。
    这是对pygame的简短介绍。
    Pygame还提供了一些模块来处理键盘、鼠标和游戏操纵杆等问题。它可以混合音频和解码流音乐。有了surface模块,你就可以画出简单的形状,旋转和缩放图片,甚至可以实时地操纵图像像素,就像numpy数组一样。
    Pygame还具有充当PyOpenGL的跨平台显示层的功能。
    大多数pygame模块都是用C编写的,实际上很少是用Python完成的。
    pygame网站(pagame.org)为每个pygame功能和教程提供完整的参考文档。pygame的资源库有很多例子,比如猴子的拳打和飞碟射击。

    PYTHON 与游戏编程

    “Python适合游戏吗?”
    答案是,“这取决于游戏。”
    Python实际上非常擅长于运行游戏。
    它甚至可能会让你惊讶,在30毫秒的时间内,有多少可能。
    不过,一旦你的游戏开始变得更加复杂,你就很难达到这个上限。任何实时运行的游戏都将充分利用电脑的运算能力。

    ../_images/intro_blade.jpg
    在过去几年,游戏开发中出现了一种有趣的趋势,即转向更高层次的语言。
    通常一种游戏被分成两个主要部分。游戏引擎,它必须尽可能快。游戏逻辑,使引擎能做一些事情。
    就在不久之前,游戏的引擎是用汇编语言编写的,现在C已经转移到游戏引擎中,而游戏本身通常是用高级脚本语言编写的。像Quake3和虚幻这样的游戏将这些脚本作为可移植的字节码运行。
    2001年初,开发商Rebel Act Studios工作室完成了他们的游戏Severance: Blade of Darkness。
    此游戏使用他们自己的定制3D引擎,游戏的其余部分都是用Python编写的。
    游戏主角是第三个人视角的战士。在探索地牢和城堡的过程中,你可以控制中世纪的战士,形成复杂的斩首组合攻击。
    您可以下载这个游戏的第三方插件,并且发现它们都是Python源文件。
    最近,Python已经被用于各种各样的游戏,如Freedom_Force,以及Humungous的后院体育系列。 ../_images/intro_freedom.jpg
    Pygame和SDL是2D游戏的优秀C引擎。
    游戏仍然会发现运行时最大的部分是在SDL中处理图形。SDL可以利用图形硬件加速的优势。启用这一功能可以改变游戏的速度,从每秒40帧到每秒200帧。
    当您看到您的Python游戏以每秒200帧的速度运行时,您会意识到Python和游戏可以协同工作。
    Python和SDL在多个平台上的工作表现令人印象深刻。
    例如,在2001年5月,我发布了我自己的完整的pygame项目——SolarWolf,一个街机式动作游戏。
    有一件事让我感到惊讶,一年之后也不需要任何补丁、bug修复或更新。
    这个游戏完全是在windows上开发的,但是在Linux、Mac OSX和许多unix上运行,没有任何额外的配置。
    尽管如此,也有非常明显的限制。
    管理图形硬件加速的最好方法并不总是从软件渲染。
    硬件支持在所有平台上都不可用。当游戏变得更复杂时,它通常必须多人协作。
    SDL有一些设计限制,像全屏播放的图形可以快速地将你的游戏降低到非常低的速度。
    虽然SDL不适合所有类型的游戏,但像Loki这样的公司已经使用SDL来运行各种各样的零售游戏。
    在写游戏的时候,Pygame要求相当低。
    你很快发现需要将通用函数封装到自己的游戏环境中。
    重要的是,在pygame中没有任何东西可以阻挡你的前进道路。你的程序完全控制了一切。
    这样做的副作用是你会发现需要更多代码来得到一个更高级的框架。你需要了解更多的功能

    结束语

    开发游戏是非常有益的,能够与您所编写的代码交互是令人兴奋的。
    Pygame目前有近30个项目在使用它。部分游戏已经上市。
    你在访问pygame网站时,可能对其他用户用Python做了什么感到惊讶的。
    有一件事引起了我的注意,那就是用Python来尝试游戏开发的人员,很多人把游戏当做python的入门。
    我可以理解为什么游戏会吸引新程序员,但从游戏开始可能比较困难,因为创建游戏需要对语言有更深入的理解。
    通过为新用户编写更多示例来理解一些游戏的概念。也让pygame教程来支持这一群用户。

    我最后的建议:保持简单。保持简单。保持简单。
    重要的事情强调三次。
    如果你打算创建你的第一个游戏,你会学到很多东西。
    即使是一个简单的游戏也会挑战你的设计,而复杂的游戏并不一定意味着有趣的游戏。
    当初步理解Python后,你可以用pygame在一到两周内创建一个简单的游戏。
    从此你需要大量的时间来打磨你的作品,才能成为一款相当高大上的游作品!

    Pygame 模块概览

    ------------|------------------------------------------------

    • [ ] - cdrom  |  回放
    • [ ] - cursor  |   指针
    • [ ] - display  |  控制显示屏幕
    • [ ] - draw  |  把图形画到表面
    • [ ] - event  |  管理事件和事件队列
    • [ ] - font  |  创建和渲染字体
    • [ ] - image  |  保存和载入图片
    • [ ] - joystick  |   游戏摇杆
    • [ ] - key  |  键盘管理
    • [ ] - mouse  |   鼠标管理
    • [ ] - sndarray  |  使用numpy调用声音
    • [ ] - surfarray  |  使用numpy调用图像
    • [ ] - time  |  控制时间
    • [ ] - transform  |  旋转、缩放和翻转图片

    翻译:易景互动(panosoft.cn)
    杨晓宏 (561071777@qq.com)

    相关文章

      网友评论

        本文标题:00 Python Pygame 简介

        本文链接:https://www.haomeiwen.com/subject/olhtlctx.html