赞
踩
#导入所需的模块 import sys import pygame # 使用pygame之前必须初始化 pygame.init() # 设置主屏窗口 screen = pygame.display.set_mode((400,400)) # 设置窗口的标题,即游戏名称 pygame.display.set_caption('hello world') # 引入字体类型 f = pygame.font.Font('C:/Windows/Fonts/simhei.ttf',50) # 生成文本信息,第一个参数文本内容;第二个参数,字体是否平滑; # 第三个参数,RGB模式的字体颜色;第四个参数,RGB模式字体背景颜色; text = f.render("达内教育",True,(255,0,0),(0,0,0)) #获得显示对象的rect区域坐标 textRect =text.get_rect() # 设置显示对象居中 textRect.center = (200,200) # 将准备好的文本信息,绘制到主屏幕 Screen 上。 screen.blit(text,textRect) # 固定代码段,实现点击"X"号退出界面的功能,几乎所有的pygame都会使用该段代码 while True: # 循环获取事件,监听事件状态 for event in pygame.event.get(): # 判断用户是否点了"X"关闭按钮,并执行if代码段 if event.type == pygame.QUIT: #卸载所有模块 pygame.quit() #终止程序,确保退出程序 sys.exit() pygame.display.flip() #更新屏幕内容
游戏大致来讲是由动画和人机交互的体验两部分构成,其中动画则是由一系列连续静止的图片,经过一定频率的刷新构成的,这个频率被称为 FPS,如果频率值越大则画面越流畅;如果频率值越小则画面会出现卡顿
设置游戏FPS 若想设置游戏的帧数率(FPS)可以通过 Clock() 方法来实现 import sys # 导入sys模块 import pygame # 导入pygame模块 pygame.init() # 初始化pygame width = 640 height = 480 # 设置窗口 screen = pygame.display.set_mode((width, height)) # 显示窗口 color = (0, 0, 0) # 设置颜色 ball = pygame.image.load("1.jpg") # 加载图片 ballrect = ball.get_rect() # 获取矩形区域 speed = [5, 5] # 设置移动的X轴、Y轴距离 clock = pygame.time.Clock() # 设置时钟 # 执行死循环,确保窗口一直显示 while True: clock.tick(60) # 每秒执行60次 # 检查事件 for event in pygame.event.get(): if event.type == pygame.QUIT: # 如果点击关闭窗口,则退出 pygame.quit() # 退出pygame 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(color) # 填充颜色 screen.blit(ball, ballrect) # 将图片画到窗口上 pygame.display.flip() # 更新全部显示
人机交互。这个模块中包含了所有常用到游戏事件。
下面列出了 Pygame 中常用的游戏事件: 事件类型 描述 成员属性 QUIT 用户按下窗口的关闭按钮 none ATIVEEVENT Pygame被激活或者隐藏 gain,state KEYDOWN 键盘按下 unicode、key、mod KEYUP 键盘放开 key、mod MOUSEMOTION 鼠标移动 pos, rel, buttons MOUSEBUTTONDOWN 鼠标按下 pos, button MOUSEBUTTONUP 鼠标放开 pos, button JOYAXISMOTION 游戏手柄(Joystick or pad) 移动 joy, axis, value JOYBALLMOTION 游戏球(Joy ball) 移动 joy, axis, value JOYHATMOTION 游戏手柄(Joystick) 移动 joy, axis, value JOYBUTTONDOWN 游戏手柄按下 joy, button JOYBUTTONUP 游戏手柄放开 joy, button VIDEORESIZE Pygame窗口缩放 size, w, h VIDEOEXPOSE Pygame窗口部分公开(expose) none USEREVENT 触发一个用户事件 事件代码
示例
# 1.事件循环 # 循环获取事件,监听事件状态,使用get()获取事件 for event in pygame.event.get(): if event.type == pygame.QUIT: # 判断事件类型,用户是否点了"X"关闭按钮 exit() # 鼠标事件 if event.type == pygame.MOUSEBUTTONDOWN: # 判断事件类型,鼠标按下 print('鼠标按下',event.pos) # event.pos-->鼠标当前的坐标值 if event.type == pygame.MOUSEBUTTONUP: print('鼠标弹起') if event.type == pygame.MOUSEMOTION: print('鼠标移动') # 键盘事件 if event.type ==pygame.KEYDOWN: print('键盘按下',chr(event.key)) # 打印按键的英文字符 # 根据不同的按键我们可以做不同的操作 if event.key in(K_RIGHT, K_d): # 按下的是右方向键或d键 print('向右移动') if event.key in(K_LEFT, K_a): # 左箭头或者是a print('向左移动') if event.key == K_UP or event.key == K_w: print('向上移动') if event.key == K_DOWN or event.key == K_s: print('向下移动') if event.type == pygame.KEYUP: print('键盘弹起') # 2.pygame.key:适合与类相关的控制 # pygame.key.get_pressed()会返回一个字典,记录每个键的是否被按。 keys = pygame.key.get_pressed() if keys[K_DOWN]: print('DOWN')
1.绘制一条宽度为 3 的红色对角线 pygame.draw.line(screen, (0, 255, 0), [0, 0], (500, 450), 3) 2.绘制多条蓝色的直线(连续直线,非抗锯齿),False 表示首尾不相连 pygame.draw.lines(screen, (0, 0, 255), False, [[0, 80], [50, 90], [200, 80], [220, 30]], 1) 3.绘制一个灰色的矩形区域,以灰色填充区域 pygame.draw.rect(screen, (155, 155, 155), (75, 10, 50, 20), 0) 4.绘制一个线框宽度为2的矩形区域 pygame.draw.rect(screen, (0, 0, 0), [150, 10, 50, 20],2) 7.绘制一个绿色边框(宽度为2)三角形 pygame.draw.polygon(screen, (100, 200, 45), [[100, 100], [0, 200], [200, 200]], 2) 5.绘制一个椭圆形,其线宽为2 pygame.draw.ellipse(screen, (255, 0, 0), (225, 10, 50, 20), 2) 6.绘制一个实心的红色椭圆形 pygame.draw.ellipse(screen, (255, 0, 0), (300, 10, 50, 20)) 8.绘制一个蓝色实心的圆形,其中[60,250]表示圆心的位置,40为半径,width默认为0 pygame.draw.circle(screen, (0, 0, 255), [60, 250], 40) 9.绘制一个圆弧,其中0表示弧线的开始位置,pi/2表示弧线的结束位置,2表示线宽 pygame.draw.arc(screen, (255, 10, 0), (210, 75, 150, 125), 0, pi / 2, 2)
在 Pygame 中有许多函数都提供了rect属性,比如有下列函数:
surface.fill((0,0,255),rect=(100,100,100,50))
上述代码会在 surface 对象的区域内选定一个 rect 区域,并将该区域填充为蓝色(RGB(0,0,255))。
除了使用rect属性来构建一个矩形区域之外,我们还可以通过 Rect 对象来构造一个矩形区域。
Rect(rectangle[ˈrektæŋɡl])指的是矩形,或者长方形,在 Pygame 中我们使用 Rect() 方法来创建一个指定位置,大小的矩形区域。函数的语法格式如下:
rect =pygame.Rect(left,top,width,height)
Rect 表示的区域必须位于一个 Surface 对象之上,比如游戏的主窗口(screen)。上述方法由四个关键参数值构成,分别是 left、top、width、height
注意:在 Pygame 中以游戏主窗口的左上角为坐标原点。
示例: import pygame pygame.init() screen = pygame.display.set_mode((500,300)) pygame.display.set_caption('拼图') image_surface = pygame.image.load("1.jpg") rect1 = pygame.Rect(50,50,100,100) # 在原图的基础上创建一个新的子图(surface对象) image_child= image_surface.subsurface(rect1) rect2 = image_child.get_rect() #输出的矩形大小为 100*100 print(rect2) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() #在屏幕上显示子图的区域 screen.blit(image_child,rect1) pygame.display.update()
常用方法:
方法 说明
pygame.Rect.copy() 复制矩形
pygame.Rect.move() 移动矩形区域,接受一个列表参数
pygame.Rect.move_ip() 移动矩形(无返回)
pygame.Rect.inflate() 增大或缩小矩形大小
pygame.Rect.clamp() 将矩形移到另一个矩形内
pygame.Rect.union() 返回一个两个矩形合并后的矩形。
pygame.Rect.fit() 按纵横比调整矩形的大小或移动矩形。
pygame.Rect.contains() 测试一个矩形是否在另一个矩形内
pygame.Rect.collidepoint() 测试点是否在矩形内
pygame.Rect.colliderect() 测试两个矩形是否重叠
同时 Rect 对象也提供了一些关于矩形大小的常用的属性 示例: import pygame # 对应left/top/width/height rect1 = pygame.Rect(0,0,100,100) print('x的值是{};y的值是{}'.format(rect1.x,rect1.y)) # x,y 表示矩形距离 x、y 轴的距离 print('bottom的值是{};right的值是{}'.format(rect1.bottom,rect1.right)) # top, left, bottom, right #在坐标系内描述矩形的大小 # 设置居中的距离 print(rect1.center,rect1.centerx,rect1.centery) # center, centerx, centery #(centerx,centery)表示矩形中央坐标(x,y)的值 # 返回值为 (centerx,top) print(rect1.midtop) # midtop, midleft, midbottom, midright 矩形上、右、下、左边中点坐标 # 返回值为 (right,centery)的元组 print(rect1.midright) # 返回值为(left,bottom) print(rect1.bottomleft) # topleft, bottomleft, topright, bottomright #矩形左下角坐标 # 返回矩形区域大小,元组格式 print(rect1.size) #size, width, height ,w,h #用于描述矩形的width、height 可以通过属性对来设置,或者者更改矩形区域的大小,如下所示: rect1.left = 100 rect1.center = (200,200)
# 初始化
pygame.init()
WIDTH = 800
HEIGHT = 600
screen = pygame.display.set_mode([WIDTH, HEIGHT])
pygame.display.set_caption('接苹果')
# 音乐
pygame.mixer.init() # 初始化mixer(声音)模块
pygame.mixer.music.load("./audios/DasBeste.mp3") # 导入背景音乐
pygame.mixer.music.set_volume(0.4) # 设置音量 范围0.0-1.0
pygame.mixer.music.play(-1) # 无限循环播放(默认为0,表示播放一次;loops=5可播放6次)
get_sound = pygame.mixer.Sound("./audios/get.wav") # 根据文件或缓存区创建sound对象(想要在频道播放的声音上再调用一个声音时)
get_sound.set_volume(1) # 设置音量
精灵概念:
精灵(英文译为 Sprite),其实在一个游戏程序中,精灵本质指的是一张张小尺寸的图片,比如游戏中的各种道具、人物、场景装饰等,它们都可以看做成一张张小的“精灵”图。除此之外,人物的移动也可以看做是一系列小精灵图构成的序列(按帧组成的序列),
如果将逐帧分解后的动作,按照一定的频率播放,那么就形成了动画精灵(雄鹰展翅高飞、人在策马奔腾、运动员奋力跳远)。
碰撞:
精灵之间进行交互,称之为碰撞,而碰撞检测,指的就是检测两个精灵之间是否发生了碰撞。当检测到碰撞发生后,接下来会触发某些事件,比如农民接到了金币,金币就会消失,玩家的得分也会随之增加,并且在游戏屏幕上又会出现一个金币或者苹果。
Pygame 专门提供了一个处理精灵的模块- sprite模块。通常情况下,我们使用pygame.sprite模块的基类 Sprite 来创建一个子类,从而达到处理精灵的目的,该子类提供了操作精灵的常用属性和方法,如下所示:
import pygame # 定义接苹果/金币的人类精灵 class FarmerSprite(pygame.sprite.Sprite): #定义构造函数 def __init__(self,filename,location): # 调父类来初始化子类 super().__init__(self) # 加载图片 self.image = pygame.image.load(filename) # 获取图片rect区域 self.rect = self.image.get_rect() # 设置位置 self.rect.topleft=location 属性&方法 说明 self.image 加载要显示的精灵图片,控制图片大小和填充色 self.rect 精灵图片显示在哪个位置 Sprite.update() 刷新精灵图,使其相应效果生效 Sprite.add() 添加精灵图到精灵组中(groups) Sprite.remove() 从精灵组中删除选中的精灵图 Sprite.kill() 删除精灵组中全部的精灵 Sprite.alive() 判断某个精灵是否属于精灵组
注意,当游戏中有大量的精灵时,操作它们将变得复杂,此时通过构建精灵容器(group 类)也就是精灵组来统一管理这些精灵。构建方法如下:
# 创建精灵组
group = pygame.sprite.Group()
# 向组内添加一个精灵
group.add(box)
于此同时pygame.sprite模块也提供了多种检测精灵是否碰撞的方法,如下所示:
方法 说明
pygame.sprite.collide_rect() 两个精灵之间的矩形检测,即矩形区域是否有交汇,返回一个布尔值。
pygame.sprite.collide_circle() 两个精灵之间的圆形检测,即圆形区域是否有交汇,返回一个布尔值。
pygame.sprite.collide_mask() 两个精灵之间的像素蒙版检测,更为精准的一种检测方式。
pygame.sprite.spritecollide() 精灵和精灵组之间的矩形碰撞检测,一个组内的所有精灵会逐一地对另外一个单个精灵进行碰撞检测,返回值是一个列表,包含了发生碰撞的所有精灵。
pygame.sprite.spritecollideany() 精灵和精灵组之间的矩形碰撞检测,上述函数的变体,当发生碰撞时,返回组内的一个精灵,无碰撞发生时,返回 None。
pygame.sprite.groupcollide() 检测在两个组之间发生碰撞的所有精灵,它返回值是一个字典,将第一组中发生碰撞的精灵作为键,第二个组中发生碰撞的精灵作为值。
下面看一组简单的示例,代码如下所示:
import pygame class FarmerSprite(pygame.sprite.Sprite): #定义构造函数 def __init__(self,filename,location): # 调父类来初始化子类 pygame.sprite.Sprite.__init__(self) # 加载图片 self.image = pygame.image.load(filename) # 获取图片rect区域 self.rect = self.image.get_rect() # 设置位置 self.rect.topleft=location # 初始化pygame pygame.init() screen = pygame.display.set_mode((500,400)) pygame.display.set_caption('接苹果') # 填充为白色屏幕 screen.fill((255,255,255)) # 定义一些必要的参数并实例化农民 filename = './imgs/farmer.png' location = (WIDTH, HEIGHT) farmer = FarmerSprite(filename, location) # 碰撞检测,必须有两个精灵,因此再创建一个精灵,并使用location来控制第二个精灵的位置 filename2 = './imgs/apple.png' location2 = (100, 100) apple = FarmerSprite(filename2, location2) # 调用 collide_rect()进行矩形区域检测,返回一个布尔值,碰撞返回True,否则返回False crash_result = pygame.sprite.collide_rect(farmer, apple) if crash_result: print("精灵碰撞了!") else: print('精灵没碰撞') while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 绘制精灵到屏幕上 screen.blit(farmer.image, farmer.rect) screen.blit(apple.image, apple.rect) # 刷新显示屏幕 pygame.display.update()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。