Pygame入门 2022 2

动画

前面已经知道如何显示图片,只需要改变图片(位置),就可以做出动画的效果了。
首先和前面一样,我们把一只蜗牛显示在窗口中:

snail_surface = pygame.image.load('graphics/snail/snail1.png')
...
screen.blit(snail_surface,(600,250))

snail_static.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rWyPFMCL-1661269394793)(assets/snail_static.png)]

只需要修改蜗牛的位置,就可以让蜗牛动起来了:

snail_surface = pygame.image.load('graphics/snail/snail1.png')
snail_x_pos = 600
...

snail_x_pos -= 1
screen.blit(snail_surface,(snail_x_pos,250))

snail_move.gif

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbPi9DhS-1661269394795)(assets/snail_move.gif)]

很“快”,蜗牛会跑出屏幕外。如果你想让蜗牛一直跑下去,可以用一个if语句,当蜗牛跑出去时,重置蜗牛位置:

if snail_pos_x < -100 : snail_pos_x = 800

这样蜗牛就会一直跑下去了。

拖影

tuoying.gif

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tx9icZsf-1661269394797)(assets/tuoying.gif)]
如果我们把背景注释掉,会发现,蜗牛的移动形成了一个轨迹。
实际上,Pygame每次都会在原来的基础上绘制一次(而不会清空之前的图像),如果没有重新绘制背景将之前的蜗牛遮盖掉,就会出现这种情况。

convert

sky_surface = pygame.image.load('graphics/Sky.png').convert()
ground_surface  = pygame.image.load('graphics/ground.png').convert()
test_font = pygame.font.Font('font/Pixeltype.ttf',50)
text_surface = test_font.render("My game",False,'Black')

snail_surface = pygame.image.load('graphics/snail/snail1.png').convert_alpha()

在加载png后用.convert() 可以将图片转化成Pygame更适合处理的形式,加快运行速度。
对于物体,使用.convert_alpha(),否则会出现奇怪的边框。

长方形

长方形(Rectangles)
作用:
提供surface精确位置;
基本的碰撞

rect.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8hweJcLr-1661269394798)(assets/rect.png)]
可以使用pygame.Rect() 创建长方形,但是一般我们是从图片中创建。这里新建一个人物,并从中创建长方形:

player_surf = pygame.image.load('graphics/Player/player_walk_1.png').convert_alpha()
player_rect = player_surf.get_rect(midbottom=(80,300))

然后,我们就可以通过长方形来修改图片位置:

    ...
    player_rect.left += 1
    screen.blit(player_surf,player_rect)

类似地,我们把之前的蜗牛也用长方形来控制:

snail_surface = pygame.image.load('graphics/snail/snail1.png').convert_alpha()
snail_rect = snail_surface.get_rect(midbottom=(600,300))

    ...
    snail_rect.x -= 4
    if snail_rect.right <= 0: snail_rect.left = 800
    screen.blit(snail_surface,snail_rect)

长方形的碰撞检测

Collsion

两个长方形之间碰撞检测:
rect1.colliderect(rect2)

长方形和点的碰撞检测,这很适合检测鼠标和长方形的碰撞。
rect1.collidepoint((x,y))

获取鼠标位置的方式:

mouse_pos.png

1.通过pygame.mouse
通过get_pos()获取鼠标位置(x,y),
通过get_pressed() 获取鼠标(左,中,右)是否按下。


mouse_pos = pygame.mouse.get_pos()
if player_rect.collidepoint(mouse_pos):
    print(pygame.mouse.get_pressed())

2.通过event

if event.type == pygame.MOUSEMOTION:
    print(event.pos)

长方形的绘制

pygame.draw.xx 可以绘制各种图形,包括长方形,圆形,直线等。可以去官网文档查看,这里只展示长方形:

pygame.draw.rect(screen,'Pink',score_rect)
pygame.draw.rect(screen,'Pink',score_rect,10)

颜色

colors.png


Pygame支持RGB及其16进制形式显示颜色。

RGB.png


RGB 即(Red,Green,Blue) 三原色数组,值为0-255.
hexadecimal(16进制形式)为 #rrggbb
在绘图时,可以通过rgb或其16进制形式指定颜色。

pygame.draw.rect(screen,'#c0e8ec',score_rect)

角色

1.键盘输入

keyboard.png


1.pygame.key
pygame.key.get_pressed()会返回一个字典,记录每个键的是否被按。

keys = pygame.key.get_pressed()
if keys[pygame.K_SPACE]:
    print("JUMP")

2.event loop

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE:
        print("JUMP")

pygame.keys 适合与类相关的控制,
事件循环适合更一般的事情,例如关闭游戏。

2. 跳跃和掉落(重力)

设置和现实中类似的重力,跌落时会加速下降,

player_gravity = 0
...
    player_gravity += 1
    player_rect.y += player_gravity

(这里用词有误,实际上重力是不变的,这里的player_gravity实际是玩家在y轴移动的距离。)
跳跃是掉落的相反方向:

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_SPACE and player_rect.bottom>=300:
        player_gravity -= 20

3. 地板

我们不想人物一直掉落,他应该在掉到地板的时候就停止掉落:

if player_rect.bottom >= 300:
    player_rect.bottom = 300
    player_gravity = 0

jump.gif

附上完整代码:

import pygame
from sys import  exit

# 初始化 引擎
pygame.init()
# 设置屏幕
screen = pygame.display.set_mode((800,400)) # 宽度800,高度400
pygame.display.set_caption('Runner') # 设置标题
# 时钟
clock = pygame.time.Clock()
# surface
sky_surface = pygame.image.load('graphics/Sky.png').convert()
ground_surface  = pygame.image.load('graphics/ground.png').convert()
test_font = pygame.font.Font('font/Pixeltype.ttf',50)
score_surf = test_font.render("My game", False, 'Black')
score_rect = score_surf.get_rect(center=(400,50))

snail_surface = pygame.image.load('graphics/snail/snail1.png').convert_alpha()
snail_rect = snail_surface.get_rect(midbottom=(600,300))

player_surf = pygame.image.load('graphics/Player/player_walk_1.png').convert_alpha()
player_rect = player_surf.get_rect(midbottom=(80,300))
player_gravity = 0

while True:
    # 获取用户输入
    for event in pygame.event.get():
        # 用户点击退出,关闭游戏
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and player_rect.bottom>=300:
                player_gravity -= 20
    # 绘图,更新
    screen.blit(sky_surface, (0, 0))  # 将test_surface放到screen上。(0,0):放置后test_surface的左上角位于screen的(0,0)处
    screen.blit(ground_surface,(0,300))

    pygame.draw.rect(screen,'#c0e8ec',score_rect)
    pygame.draw.rect(screen,'#c0e8ec',score_rect,10)

    screen.blit(score_surf, score_rect)

    snail_rect.x -= 4
    if snail_rect.right <= 0: snail_rect.left = 800
    screen.blit(snail_surface,snail_rect)

    player_gravity += 1
    player_rect.y += player_gravity
    if player_rect.bottom >= 300:
        player_rect.bottom = 300
        player_gravity = 0
    screen.blit(player_surf,player_rect)


    pygame.display.update()
    clock.tick(60) # 不超过60 fps

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340