pygame 二次 hello world 项目感知

460 阅读3分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

本系列专栏将通过不断编写游戏的方式,带你夯实 Python 知识。

本专栏追求迅速掌握 pygame 的同时,夯实 python 知识,所以一起来吧。

先阅读代码

下面的代码用来实现键盘控制物体运动,分析类的内容参见后文。

import pygame

pygame.init()

w, h = 500, 300
pygame.display.set_mode((w, h))

screen = pygame.display.get_surface()

# 加载背景图片
bg = pygame.image.load("./imgs/bg.png")

# 图片进行调整
bg = pygame.transform.scale(bg, (w, h))

# 加载小球
ball_img = pygame.image.load("./imgs/ball.png")

# 创建精灵
ball = pygame.sprite.Sprite()
ball.image = ball_img
ball.rect = ball.image.get_rect()
ball.rect.x, ball.rect.y = w / 2, h / 2

# 精灵组
player_group = pygame.sprite.Group()
player_group.add(ball)

# 游戏开始
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.display.quit()
            quit()

        if event.type == pygame.KEYDOWN:
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                ball.rect.x -= 10
            elif keys[pygame.K_RIGHT]:
                ball.rect.x += 10
            elif keys[pygame.K_UP]:
                ball.rect.y -= 10
            elif keys[pygame.K_DOWN]:
                ball.rect.y += 10

    # 界面绘制
    screen.blit(bg, (0, 0))
    player_group.draw(screen)
    pygame.display.update()

** pygame.display.get_surface()** 获取当前游戏窗口,返回一个 Surface 对象,一般在写的时候更多的作者喜欢写成下面的样子。

screen = pygame.display.set_mode((500, 300))

bg = pygame.transform.scale(bg, (w, h))

对素材图片进行缩放,使用的是快速缩放,对像素的处理不够细致,如果希望产生比较平滑的图像,建议使用 pygame.transform.smoothscale() 函数。

pygame.image.load("./imgs/ball.png") 很容易理解,加载一张图片素材。

pygame.sprite.Sprite() 首次接触到,pygame 非常核心的一个概念,精灵类,后面会反复用到。 用到精灵类,就无法避免的涉及精灵图,这些在下一篇博客进行详细说明,先对其有一些基本的印象。 Sprite 对象用到的属性和方法主要有以下几个:

  • self.image:显示的图片,如果设置为 pygame.Surface([40,40]),那表示该精灵对象是一个 40x40 的矩形;
  • self.image.fill([color]):着色;
  • self.rect:显示位置,设置该值时需要先获取 image 的矩形区域,self.rect = self.image.get_rect(),然后在对其进行设定,例如 self.rect.topleft=(0,0) 表示左上角 (0,0)topleft 等价的属性有 toprightbottomleftbottomright 都是直接设置角坐标,还可以通过 self.rect.topself.rect.bottomself.rect.rightself.rect.left 分别进行设置。
  • self.update:使精灵行为更新。

ball.image.get_rect() 获取图片素材的的矩形区域,返回的数据格式如下:

ball.rect = ball.image.get_rect()
print(ball.rect)
ball.rect.x, ball.rect.y = w / 2, h / 2
print(ball.rect)

移动前与移动后的数据对比:

<rect(0, 0, 40, 40)>
<rect(250, 150, 40, 40)>

pygame.sprite.Group() 精灵组类,当游戏中出现大量的精灵对象时,为了能够统一进行管理,引入了精灵组概念,先理解成一个简单的容器即可。

keys = pygame.key.get_pressed() 获取键盘上所有按键的状态,它会返回一个由返回的元组是由0,1组成的元组:,如果某个位置为 1,表示被按下。

例如输出 keys 得到的结果如下

在这里插入图片描述

获取键盘按下的键,之后进行指定操作

if keys[pygame.K_LEFT]:
	ball.rect.x -= 10
elif keys[pygame.K_RIGHT]:
    ball.rect.x += 10
elif keys[pygame.K_UP]:
    ball.rect.y -= 10
elif keys[pygame.K_DOWN]:
    ball.rect.y += 10

素材可以任意准备,最终实现的效果是按下键盘上的方向键,实现对目标图片的操作。

pygame 二次 hello world 项目感知

本系列专栏属于番外篇,希望你能学到新知识。 有任何疑问,都可以联系橡皮擦进行解决,一起做游戏吧 本专栏每天的练习量大概在 1 小时左右,整篇博客节奏会比较快,毕竟咱们是有基础的人。