pygame课程设计使用手册

基本使用

#导入所需的模块
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() #更新屏幕内容

时间模块Time

游戏大致来讲是由动画和人机交互的体验两部分构成,其中动画则是由一系列连续静止的图片,经过一定频率的刷新构成的,这个频率被称为 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()  # 更新全部显示

事件模块Event

人机交互。这个模块中包含了所有常用到游戏事件。

下面列出了 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')     

绘图模块Draw-贪吃蛇

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)      

区域位置模块Rect-拼图

在 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)

声音模块mixer

# 初始化
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和碰撞检测-接苹果

精灵概念:
精灵(英文译为 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()
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值