Pygame入门

这篇具有很好参考价值的文章主要介绍了Pygame入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、初始化pygame环境

(一)在pycharm中新建一个工程

Pygame入门

(二)安装pygame

Pygame入门

(三)测试安装是否成功

在pycharm终端中输入
python -m pygame --version
Pygame入门
在pycharm运行演示程序。
在pycharm终端中输入:python -m pygame.examples.aliens
Pygame入门

二、pygame基础

(一)pygame初始化

导入pygame

import pygame # 导入pygame

pygame初始化

pygame.init()

将pygame.init()赋值给一个变量,并打印它。

n = pygame.init()
print(n)

Pygame入门
n返回一个元组,(5,0)中的5个模块初始化成功,0个模块初始化失败

(二)设置显示界面

pygame绘图思路
Pygame入门
1.设置窗口尺寸
我们使用pygame.display.set_mode(size,flags,depth)来初始化窗口并将其传递给变量,将获得一个surface对象。size是一对元组,用以表示宽度和高度。

screen = pygame.display.set_mode((400,400)) # 第一个400是宽度,单位是像素,第二个400是高度

flags用于设置主窗口样式

pygame.FULLSCREEN 创建一个全屏窗口。
pygame.HWSURFACE 创建一个硬件加速窗口,必须和 FULLSCREEN 同时使用。
pygame.OPENGL 创建一个 OPENGL 渲染窗口。
pygame.RESIZABLE 创建一个可以改变大小的窗口。
pygame.DOUBLEBUF 创建一个双缓冲区窗口,建议在 HWSURFACE 或者 OPENGL 时使用。
pygame.NOFRAME 创建一个没有边框的窗口。

2.设置窗口标题
设置窗口的标题,即游戏名称

pygame.display.set_caption('hello world')

3.更新画面
我们可以将显示界面理解为电影中的画面。在电影中随着时间的推进,画面会不断发生变化。为了将每一幅图像显示到画面上,需要不断的更新页面上显示的内容。
更新屏幕方法一

pygame.display.flip()

pygame.display.flip()的作用是更新整个屏幕的内容。

Update the full display Surface to the screen

在完成以上代码,点击运行会有一闪而过的画面,原因是没有设置任何动作。
下面,我们通过定义事件循环及动作捕获。
完整代码:

import pygame

pygame.init()

screen = pygame.display.set_mode((400, 400))

pygame.display.set_caption('hello world')

while True:
    for event in pygame.event.get():
        pass
    pygame.display.flip()

Pygame入门
更新屏幕方法二:

pygame.display.update()

与flip()的区别是可以通过传递rect值指定更新的区域,如果不传递参数其效果和flip()一样。

如果仅仅是几个物体在移动,那么他只重绘其中移动的部分,没有变化的部分,并不进行重绘。update比flip速度更快。因此在一般的游戏中,如果不是场景变化非常频繁的时候,我们建议使用update函数,而不是flip函数。
4.设置背景
现在的窗口默认使用的是黑色背景,我们可以通过以下两种方式来设置背景样式。
(1)为画面添加一个纯色背景

# 设置背景
screen.fill((255,209,220))
# 或者
screen.fill('pink')

Pygame入门
(2)设置图片背景

background = pygame.image.load('./image/plane/background.png').convert_alpha()
screen.blit(background, (0, 0))

blit(source, dest, area=None, special_flags = 0) -> Rect

Surface对象的blit方法,是将一个surface对象绘制在另一个surface对象的上面,就想油画一样,上面的颜色将把下面的颜色盖住。
source为放在上层的Surface对象;
dest是放置的坐标元组(left,top);如果left和top都为0,则图片的左上角点与背景的左上角点重合;
area:是一个可选参数,通过该参数可设置矩形区域。若设置的矩形区域小于source所设置Surface对象的区域,那么仅绘制Surface对象的部分内容。

Pygame入门
5.添加文字

pygame.font.SysFont()。使用系统字体。
name字体名称,size字体大小,bold是否加粗,italic是否斜体

create a Font object from the system fonts
SysFont(name, size, bold=False, italic=False) -> Font

系统可用字体使用以下语句查询,将获得所有可用字体的列表。

print(pygame.font.get_fonts())

使用下面语句将获得一个字体对象

# 设置字体样式
scores_font = pygame.font.SysFont('仿宋gb_2312', 25)

在pygame中使用render方法将文本变成一个贴图,然后再将图片贴到背景上显示。

draw text on a new Surface
render(text, antialias, color, background=None) -> Surface
text是需要插入的字符串;
antialias设置抗锯齿;
值为True或False;
color是文字的颜色;
background是背景的颜色,默认为无背景。

# 
scores_caption = scores_font.render(f'得分{score}', True, (255, 255, 255), (0, 0, 0))

使用和之前贴背景图片一样的方法blit,将文字surface贴上去。

screen.blit(scores_capiton,(100,100))

Pygame入门

(三)定义事件循环

前面为了让游戏窗口正常显示,我们定义一个while循环。

while True:
    # 循环获取事件,监听事件状态
    for event in pygame.event.get():
        pass
    pygame.display.update()

pygame.event.get()函数用于捕获用户使用键盘、鼠标设备的任何操作。
在for循环中只有一个pass语句,没有设置任何实际动作。
通过添加一个print(event),我们可以观察到捕捉了哪些动作。

while True:
    # 循环获取事件,监听事件状态
    for event in pygame.event.get():
    	print(event)
    pygame.display.update()

Pygame入门
实际上,我们目前的代码一直有一个Bug,就是在程序运行后,没办法通过点击窗口坐上角的x来关闭窗口。接下来我们对程序进行一些改动来解决这个问题。

while True:
    # 循环获取事件,监听事件状态
    for event in pygame.event.get():
    	if event.type == pygame.QUIT:
    	    pygame.quit()
    	    sys.exit()
    pygame.display.update()

event.type用以返回事件的类型,在pygame中定义了以下基础事件类型。
pygame.QUIT用以判断是否按下了窗口坐上方的x按钮。如果“是”的话,则会执行pygame.quit(),它与pygame.init()的作用相反,用于停止Pygame库的工作,之后再执行sys.exit()关闭程序。

QUIT              none
ACTIVEEVENT       gain, state
KEYDOWN           key, mod, unicode, scancode
KEYUP             key, mod, unicode, scancode
MOUSEMOTION       pos, rel, buttons, touch
MOUSEBUTTONUP     pos, button, touch
MOUSEBUTTONDOWN   pos, button, touch
JOYAXISMOTION     joy (deprecated), instance_id, axis, value
JOYBALLMOTION     joy (deprecated), instance_id, ball, rel
JOYHATMOTION      joy (deprecated), instance_id, hat, value
JOYBUTTONUP       joy (deprecated), instance_id, button
JOYBUTTONDOWN     joy (deprecated), instance_id, button
VIDEORESIZE       size, w, h
VIDEOEXPOSE       none
USEREVENT         code

再举例说明:KEYDOWN、KEYUP分别指的是键盘按钮的按下和释放两种状态;MOUSEMOTION指的是鼠标的移动;JOYAXISMOTION手柄移动;JOYBALLMOTION手柄滚球移动;VIDEORESIZE窗口缩放。
然而,以上只是事件类型的冰山一角,在后面的实例中我们还将丰富对这一部分的了解。你也可以在pygame官网文档查询更多的内容:https://www.pygame.org/docs/ref/event.html

(四)事件实例

实例1:在窗口中显示动态时间
如下图所示在窗口中动态显示时间
Pygame入门
游戏初始化

import pygame
import sys
import time

pygame.init() # pygame初始化

fpsclock = pygame.time.Clock() # 创建一个对象用于追踪时间

screen = pygame.display.set_mode((400, 400)) # 初始化一个屏幕用以显示

pygame.display.set_caption('hello world') # 设置窗口标题

background = pygame.image.load('./image/plane/background.png').convert_alpha() # 载入背景图片

screen.blit(background, (0, 0)) # 将背景图片放到屏幕上

clock_font = pygame.font.SysFont('仿宋gb_2312', 25) # 创建一个文字对象

设置更新动作

def clock_update():
    clock = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime()) # 将本地时间按照年-月-日 时:分:秒的格式存入clock
    clock_caption = clock_font.render(f'现在时间:{clock}', True, (255, 0, 0), (0, 0, 0)) # 将文本绘制到一个新的Surface对象上
    clock_caption_rect = clock_caption.get_rect() # 获得文本所在Surface对象的rect
    clock_caption_rect.center = screen.get_rect().center # 将文本Surface对象的rect中心与屏幕的中心对齐
    screen.blit(clock_caption, clock_caption_rect.topleft) # 将文本Surface绘制到屏幕上

设置循环事件

while True:
    fpsclock.tick(60) # 调用时间对象的tick方法设置屏幕刷新屏幕,每秒循环的次数
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    clock_update() # 调用时间更新事件
    pygame.display.update() # 更新屏幕,实现动态显示

实例2:键盘操作移动图片到指定位置
如下图所示,程序运行后,小汽车位于窗口的左上角,通过键盘的上下左右按键操作小汽车移动,当小汽车移动到红色框框,屏幕提示“well done”。
Pygame入门
1.游戏初始化

import pygame
import sys

pygame.init()  # pygame初始化

screen = pygame.display.set_mode((500,500))  # 设置窗口大小width,height都为500

pic = pygame.image.load('./image/driver/car1.png').convert_alpha() # 插入小车图片

pic = pygame.transform.scale(pic, (50, 50)) # 将图片大小缩放为width,height都为50

pic_rect = pic.get_rect() # 获得图片的rect对象

screen.blit(pic, (0, 0)) # 设置pic初始位置,(0,0)也可以缺省。如果不提供,默认就是插入到(0,0)

speed = 10  # 移动速度

fpsticks = pygame.time.Clock() # 创建一个时间对象

font = pygame.font.SysFont('仿宋gb_2312', 25) # 创建一个系统字体对象

msg = font.render('Go to the target...', True, (255, 255, 255)) # 生成文本Surface

msg_rect = msg.get_rect() # 获得msg的rect

msg_rect.topleft = (100, 100) # 设置msg信息的位置

pygame.Rect
Rect对象是pygame用于存储矩形坐标的对象,它决定了游戏中图像的位置和大小,是pygame中非常核心的内容。

pygame object for storing rectangular coordinates
Rect(left, top, width, height) -> Rect
Rect((left, top), (width, height)) -> Rect
Rect(object) -> Rect

Rect对象有许多虚拟属性用于移动和与对齐其他的Rect。

The Rect object has several virtual attributes which can be used to move and align the Rect

以下是Rect对象具有的属性

x,y
top, left, bottom, right
topleft, bottomleft, topright, bottomright
midtop, midleft, midbottom, midright
center, centerx, centery
size, width, height
w,h

Pygame入门

print(pic_rect)
# 当输出pic_rect时,将获得pic的rect值,(0, 0, 50, 50)
print(pic_rect.center)
# 同样,当输出pic_rect.center时,将获得这个矩形中心点的坐标,其他属性以此类推。
print(pic_rect.x,pic_rect.y)
# 背景的坐上角是原点的位置,x代表在水平方向上离原点的距离,y代表在垂直方向上离原点的距离。

Pygame入门
通过修改Rect将实现对图像的移动。

# 如上图所示,下面代码将把矩形向上刚好移除屏幕
pic_rect.y = - pic_rect.height
# 我们还可以先定义一个移动速度,然后使用一个循环使Rect的x或y值按一定的速度移动
speed = 1
while True:
    pic_rect.x += speed

设置游戏循环

while True:
    fpsticks.tick(60) # 设置游戏刷新频率,每秒循环的次数
    for event in pygame.event.get():
        if pic_rect.topleft == (300, 200): # 判断小车是否进入目标区域
            msg = font.render('Well done', True, (255, 255, 255))
        else:
            msg = font.render('Go to the target...', True, (255, 255, 255))
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        keys = pygame.key.get_pressed() # 返回一个布尔值序列代表键盘上每个键被按下状态
        if keys[pygame.K_UP]:  # 意思是判断键盘上的Up键是否被按下
            pic_rect.y -= speed # 代表每按下一次,小车的y坐标减去速度,等同于小车按照speed向上移动一次
        elif keys[pygame.K_DOWN]:
            pic_rect.y += speed # 小车向下移动,小车的y坐标增大
        elif keys[pygame.K_LEFT]:
            pic_rect.x -= speed # 小车向左移动,小车的x坐标减小
        elif keys[pygame.K_RIGHT]:
            pic_rect.x += speed # 小车向右移动,小车的x坐标增大
    screen.fill((0, 0, 0))  # 背景不断刷行,从而隐藏小车移动过程中留下的痕迹
    screen.fill((255, 0, 0),(300, 200, 50, 50)) # 此处绘制的是目标位置,背景刷新的同时,刷新目标位置,如果不刷新,目标位置将被背景覆盖住
    screen.blit(msg, msg_rect.topleft) # 刷新消息框信息
    screen.blit(pic, pic_rect.topleft) # 刷新小车位置
    pygame.display.update() # 重新显示屏幕内容

本篇到此结束,在下一篇中将对上述代码的结构和方法进行优化,随后以实例引入精灵的相关介绍。文章来源地址https://www.toymoban.com/news/detail-487634.html

到了这里,关于Pygame入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang入门教程】Go语言变量的初始化

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站: 人工智能工具 引言 在Go语言中,变量

    2024年04月17日
    浏览(58)
  • 【Vue + TS】项目架构、环境搭建 -------(Vite)安装初始化(一)

    前言 “学习能力也好,执行力也罢,核心只有一个:在刚开始的时候,平静地接受自己的笨拙。” 本篇文章是 Vue项目基于 Vite初始化的过程,借此记录一下,巩固基础! 第一章 安装 Vite,本篇基于npm进行(请检测自己的node版本) 具体可看:Vite官方中文文档 全局安装vite,

    2024年02月03日
    浏览(44)
  • mac系统之集成环境phpwebstudy初始化mysql数据库

    PhpWebStudy是使用electron开发的桌面应用.目前支持的软件, nginx, apache, mysql, mariaDB, php, memcached, redis, mongoDB. 安装和卸载, 全部都是通过调用homebrew和macports的内置功能. 事实上, 使用homebrew或macports自行安装卸载和在软件里操作是一样的.对于习惯使用brew或port命令的用户, 依然可以继

    2024年02月01日
    浏览(45)
  • 【树莓派初始化】教你从0开始搭建树莓派的使用环境

    为了完善本专栏的内容,这次我把树莓派的初始化配置也给大家加上。 干货满满,跟着我一步一步配置,从无到有玩转树莓派!😋 当然前提是你要有一个树莓派,2022年的树莓派价格可太魔幻了,涨价1倍,堪比显卡市场…… 不扯这些没用的了,本篇博客,带你走入树莓派这

    2024年02月04日
    浏览(31)
  • 全网最全,在Linux下安装Git与初始化Git 环境(详细)

    Linux 安装 Git 1、wget方式 下载Git安装包: 直接执行以下命令 解压安装包: 安装编译源码所需依赖: 卸载旧版本Git: 编译: 安装Git: 配置环境变量: 在底部的path变量结尾加上相关配置信息即可 随后保存并更新环境配置 验证: 再来看看git的版本号 到此为止,大功告成了

    2024年02月07日
    浏览(42)
  • 4.【CPP】入门(初始化列表||explicit||static||友元||静态成员变量/函数)

    我们知道在c++11中才能在成员对象声明时初始化,像下面这样。 注意:构造函数不是初始化,而是赋初始值。那么在c++11以前该怎么初始化成员变量呢? 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 类中包含以下成员,必须放在初始化列表位置进行初始

    2024年01月20日
    浏览(33)
  • 物联网Lora模块从入门到精通(四)对某些端口的初始化

            由于程序设计开发具有的不确定性,我们常常需要初始化某些特定的引脚,并读取引脚电平状态或向引脚输出高低电平。         快速找到端口的初始化语句:         首先,找到board.c文件,在下图的位置,我们可以看到关于LED灯的端口的初始化语句。        

    2024年02月08日
    浏览(36)
  • Flutter入门教程(一),2023最新版包含安装,初始化!简单易懂!

    首先,在一切的开始之前我们来介绍一下什么是Flutter,Flutter 是一个由 Google 开发的开源移动应用程序开发框架,可以让开发者使用单一代码库构建高质量的、高性能的 Android 和 iOS 应用程序。Flutter 的主要优势之一是其快速的开发周期,因为它使用了热重载技术,这意味着开

    2024年02月16日
    浏览(44)
  • linux centos7环境下初始化hive时报错*** schemaTool failed ***

    执行下面初始化命令时失败 [zxx@node1 bin]$ schematool -dbType mysql -initSchema  从报错信息来看,是因为拒绝访问node1 解决办法: 为node1进行授权,执行以下命令 结果如下图所示 重新初始化,发现加载驱动报错:failed to load driver 原来是忘记重新启动mysql服务了 启动服务之后重新初始

    2024年02月12日
    浏览(37)
  • 【Megatron-DeepSpeed】张量并行工具代码mpu详解(一):并行环境初始化

    相关博客 【深度学习】【分布式训练】一文捋顺千亿模型训练技术:流水线并行、张量并行和3D并行 【Megatron-DeepSpeed】张量并行工具代码mpu详解(四):张量并行版Embedding层及交叉熵的实现及测试 【Megatron-DeepSpeed】张量并行工具代码mpu详解(三):张量并行层的实现及测试 【Me

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包