赞
踩
Pygame是脚本语言Python的一个扩展包就是SDL的封装包,是用Python 和C语言开发;开发人是Pete Shinners。专门用于开发各类游戏。SDL意思是Simple Directmedia Library即“简单媒体类库”,这是一个跨平台的控制多媒体的C语言类库,类似于 DirectX。这里说的媒体包括CDROM即光驱、键盘鼠标、音频视频、操纵杆等输入输出设备,Pygame写了关于这些对象的类库可在官方网站上找到。因为是“面向对象”就是所谓Object-Oriented编程语言,所以我们可以继承这些类的性质来编写我们自己的游戏。
Pygame的官方网站: Pygame.org
可惜中文的Pygame文档还没有。因为Pygame是面向对象脚本编程语言Python的一个扩展,所以在使用Pygame之前要求基本的Python的知识和技术。
不管在什么平台上开发,所有游戏的代码通常会有的结构包含六个部分:
实 际上,游戏的结构是个风格问题,不同的人、从不同的侧重点出发会使用不同的方法组织自己的游戏代码。中 国人学太极拳的时候有这样的一个讲究,刚刚开始学的时候要有严格的“架式”就是动作规范,但是等到悟到用意不用力、用意念引导动作的阶段就可以随心所欲, 不必太拘泥于一招一式细节了。
例如有从完全另外的角度的方法,把代码按照一下四个方面组织:(请查看这里的资源作为参考)
不管使用什么方式组织代码,上 面例子中最主要的结构有两个:一个是主程序即mail() loop;一个是游戏对象的类。主程序是游戏脚本开始时执行的,包括处理Pygame模块本身的初始化和游戏对象的初始化,还包括所谓事件循环就是处理游 戏玩家的输入如鼠标、键盘动作和其他事件的队列;而游戏类对象封装了游戏角色的数据和逻辑。对于初学者来说,先理解这两个结构可收提纲协领的效果。有些简 单的游戏只有一个游戏对象(没办法,我们总是要从最简单的例子开始),可能没有完全按照上面的格式写,但总是包含了这样的模式在里面。
这里有一个Pygame的代码库,各种游戏代码可供研究:Pygame代码库
第一个简单的例程hello.py:
#Find place where Python interpretor located 让游戏脚本找到Python解释器安装的地方
#!/usr/bin/python
#Import using modules 输入要用到的模块
import pygame
from pygame.locals import *
def main():
#Initialise screen 初始化。初始化软件模块、初始化屏幕
pygame.init()
screen = pygame.display.set_mode((150, 50))
pygame.display.set_caption('Basic Pygame program')
#Fill background 添入背景
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))
#Display some text 显示区里显示文本
font = pygame.font.Font(None, 36)
text = font.render("Hello There", 1, (10, 10, 10))
textpos = text.get_rect()
textpos.centerx = background.get_rect().centerx
background.blit(text, textpos)
#Blit everything to the screen 把所有东西画到屏幕上
screen.blit(background, (0, 0))
pygame.display.flip()
#Event loop事件循环
while 1:
for event in pygame.event.get():
if event.type == QUIT:
return
screen.blit(background, (0, 0))
pygame.display.flip()
#start main() 启动脚本时执行主循环
if __name__ == '__main__': main()
把 这段代码用自己的编辑器写入你的一个名字叫py/的目录里,这个目录里只包含作为测试和学习用的代码样例(当然你也可以有其他的安排,你肯定有自己的打 算 。注意你下载这个程序时不要使用中文注释,特别不要使用中文的#号,Python的解释器不能识别。请只下载代码。我这里加中文是为了解释代码的方 便。注意给这个脚本一个名字hello.py。
用这个简单的程序我们完成了一个框架,多数应用程序特别是一个游戏就是写在这上面的,如下图:
不 算空格,加注释行,就是以#号开始的,以上总共31行代码。还有其他的语言能用同样的代码量来完成同样 的工作吗?也许你用可视化工具可以很容易地作出这了来,但那只是“依样画葫芦”!而你用Python写出这个简单的框架,你学会了一种功能强大的语言! 也许你会说Java的Applet能用更少的代码完成这些工作,实际上不是这样的,因为Java/Applet是在用户端的浏览器帮助下完成的,而这个是 stand alone。Python还是一种标准的黑客工具,世界上顶极黑客正在使用她!
是很简单吗?但是你已经开始了!这个简单的程序里已经包含了游戏的主要结构。
首先你要在计算机监视器上创建一个游戏执行的框架区域,一般叫做screen。
***********************************************
课堂实验一
使用命令python进入命令行模式:
>>> import pygame
>>> from pygame.locals import *
>>> screen = pygame.display.set_mode((800,400))
这样你创建了一块屏幕面积,宽800个像素,高400个像素,它的左上角的坐标为(0,0)这样你就完成了屏幕初始化的工作。
********************************************
学 习一种语言最好的办法就是实验,通过观察软件的行为,输入输出的变化来理解代码的功能。跟随我的路线图保证你能在最短时间内顺利掌握语言和技术精髓,不必 从基本教程开始。牛顿说过:“在科学发展上实例比理论更重要!”,我相信在学习技术上也是这样。我们先仔细地研究这个程序样例,深入剖析,彻底理解,举一 反三,触类旁通。
#/usr/bin/env python首 先在代码开始的地方有三重的双括号""" """,括号内的叫docstring就是关于代码的文档说明,规范地说,每个程序代码都应该包含这部分内容,开发者自己或开发团队可以从这里获得关于代 码的功能、许可证等方面的信息。这是Python所特有的所谓“自省”功能,英语叫“Introspection”。这里有必要加以简单的介绍。在命令行 里使用dir( module/function), 在实验中用 Python的模块、函数、方法os、sys、 pygame等等甚至是一个数字如2来代替括号里的斜体字,可以查看对象的性质。因为在Python里,一切都是对象,所以这些都可以使用dir()函数 查看对象的性质,这包括对象的结构、包含的函数和方法、类的继承关系、子类、可以接受的变量、返回的结果等详细信息。另外有同等功能的是在命令行的符号 >>>里使用help( )函数,用法与dir( )相同,但是得到的信息有所不同。这些都内嵌在Python的解释器里所以叫做内省的。非常形象。
"""
This simple example is used for the line-by-line tutorial
that comes with pygame. It is based on a 'popular' web banner.
Note there are comments here, but for the full explanation,
follow along in the tutorial.
"""
#Import Modules
import os, pygame
from pygame.locals import *
if not pygame.font: print 'Warning, fonts disabled'
if not pygame.mixer: print 'Warning, sound disabled'
#functions to create our resources一下是处理资源的函数,如下载图像文件或者声音文件
def load_image(name, colorkey=None):
fullname = os.path.join('data', name)
try:
image = pygame.image.load(fullname)
except pygame.error, message:
print 'Cannot load image:', fullname
raise SystemExit, message
image = image.convert()
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0,0))
image.set_colorkey(colorkey, RLEACCEL)
return image, image.get_rect()
def load_sound(name):
class NoneSound:
def play(self): pass
if not pygame.mixer or not pygame.mixer.get_init():
return NoneSound()
fullname = os.path.join('data', name)
try:
sound = pygame.mixer.Sound(fullname)
except pygame.error, message:
print 'Cannot load sound:', fullname
raise SystemExit, message
return sound
#classes for our game objects以下是本游戏仅有的两个对象的类Fist和Chimp,这是游戏中涉及模拟和动画的部分
class Fist(pygame.sprite.Sprite):
"""moves a clenched fist on the screen, following the mouse"""
def __init__(self):
pygame.sprite.Sprite.__init__(self) #call Sprite initializer
self.image, self.rect = load_image('fist.bmp', -1)
self.punching = 0
def update(self):
"move the fist based on the mouse position"
pos = pygame.mouse.get_pos()
self.rect.midtop = pos
if self.punching:
self.rect.move_ip(5, 10)
def punch(self, target):
"returns true if the fist collides with the target"
if not self.punching:
self.punching = 1
hitbox = self.rect.inflate(-5, -5)
return hitbox.colliderect(target.rect)
def unpunch(self):
"called to pull the fist back"
self.punching = 0
class Chimp(pygame.sprite.Sprite):
"""moves a monkey critter across the screen. it can spin the
monkey when it is punched."""
def __init__(self):
pygame.sprite.Sprite.__init__(self) #call Sprite intializer
self.image, self.rect = load_image('chimp.bmp', -1)
screen = pygame.display.get_surface()
self.area = screen.get_rect()
self.rect.topleft = 10, 10
self.move = 9
self.di = 0
def update(self):
"walk or spin, depending on the monkeys state"
if self.di:
self._spin()
else:
self._walk()
def _walk(self):
"move the monkey across the screen, and turn at the ends"
newpos = self.rect.move((self.move, 0))
if self.rect.left < self.area.left or /
self.rect.right > self.area.right:
self.move = -self.move
newpos = self.rect.move((self.move, 0))
self.image = pygame.transform.flip(self.image, 1, 0)
self.rect = newpos
def _spin(self):
"spin the monkey image"
center = self.rect.center
self.di = self.di + 12
if self.di >= 360:
self.di = 0
self.image = self.original
else:
rotate = pygame.transform.rotate
self.image = rotate(self.original, self.di)
self.rect = self.image.get_rect(center=center)
def punched(self):
"this will cause the monkey to start spinning"
if not self.di:
self.di = 1
self.original = self.image
#主循环开始。当游戏脚本开始这个函数即被调用,并初始化模块和游戏对象,执行事件循环直到返回
def main():
"""this function is called when the program starts.
it initializes everything it needs, then runs in
a loop until the function returns."""
#Initialize Everything初始化
pygame.init()
screen = pygame.display.set_mode((468, 60))
pygame.display.set_caption('Monkey Fever')
pygame.mouse.set_visible(0)
#Create The Backgound创建背景
background = pygame.Surface(screen.get_size())
background = background.convert()
background.fill((250, 250, 250))
#Put Text On The Background, Centered把文本贴在或者拷贝在背景上。第一次出现blit( )函数
if pygame.font:
font = pygame.font.Font(None, 36)
text = font.render("Pummel The Chimp, And Win $$", 1, (10, 10, 10))
textpos = text.get_rect(centerx=background.get_width()/2)
background.blit(text, textpos)
#Display The Background显示背景并更新。第二次出现blit( )函数
screen.blit(background, (0, 0))
pygame.display.flip()
#Prepare Game Objects准备好游戏对象包括时钟控制、模拟的对象、资源对象等
clock = pygame.time.Clock()
whiff_sound = load_sound('whiff.wav')
punch_sound = load_sound('punch.wav')
chimp = Chimp()
fist = Fist()
allsprites = pygame.sprite.RenderPlain((fist, chimp))
#Main Loop 事件循环,鼠标、键盘等的事件队列
while 1:
clock.tick(60)
#Handle Input Events 处理用户输入事件
for event in pygame.event.get():
if event.type == QUIT:
return
elif event.type == KEYDOWN
and event.key == K_ESCAPE:
return
elif event.type == MOUSEBUTTONDOWN:
if fist.punch(chimp):
punch_sound.play() #punch
chimp.punched()
else:
whiff_sound.play() #miss
elif event.type is MOUSEBUTTONUP:
fist.unpunch()
allsprites.update()
#Draw Everything 第三次出现blit( )函数
screen.blit(background, (0, 0))
allsprites.draw(screen)
pygame.display.flip()
#Game Over
#this calls the 'main' function when this script is executed 当本游戏脚本执行时调用main( )函数
if __name__ == '__main__': main()
Pygame的类库:
Cdrom || Cursors || Display || Draw || Event || Font || Image || Joystick || Key || Mixer || Mouse || Movie || Music || Overlay || Pygame || Rect || Sndarray || Sprite || Surface || Surfarray || Time || Transform
这 些库类的功能可以望文生义,如Crom是处理光盘的类,Cursors是处理光标的类,Key是处理键盘的类,Joystick是处理游戏操纵杆的类, Mouse是处理鼠标的,而Music显然是处理音乐的。等大家有了一些基础之后就应该仔细地研究这些类库,熟练地掌握他们做起游戏来得心应手,左右逢 源。下面我们将就最常用的加以说明,在上面的样例涉及到的就是最重要的类库。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。