6.pygame图片移动

前言:我们在学习这节课的内容前,先给出我们的示例图片吧

bird.png

 

上节课我们学习了把图片绘制到屏幕上的函数,上节课应该已经猜到只要改变传入的xy的参数即可。不过我们这节课主要学习改变rect对象来实现图片移动。

​
blit(source, dest=(x, y), area=None, special_flags=0)

​

 对了!我们还要搭建程序框架呢!

​
#导入模块
import pygame
import sys

class Game:
    def __init__(self):
        pygame.init()#在使用pygame之前要先初始化
        self.bird = pygame.image.load("bird.png")#导入bird.png图片
        self.screen = pygame.display.set_mode((800, 600))#创建一个800*600的窗口
        pygame.display.set_caption("Game")#设置窗口标题为”Game“


    def Listen(self):#事件监测
        for event in pygame.event.get():#事件监测
            if event.type == pygame.QUIT:#点“X”号退出
                pygame.quit()
                sys.exit()

    def main(self):
        while True:#程序主循环
            self.Listen()#事件监测
            self.screen.blit(self.bird, (400, 300))#将bird.png绘制的400,300的位置
            pygame.display.flip()#屏幕刷新

if __name__ == '__main__':
    game = Game()
    game.main()

​

 

我们先来讲一下第一种比较简单的方法吧:我们先在Game类的__init__的初始化的函数中添加一个自定义速度的变量和初始的x位置

self.speed = 5
self.x = 50

接着我们在Game类的main函数中的while循环中添加一个增加x的操作

self.x += 1

这样的作用是在每次循环中增加1个像素。但是这样还是不能改变图片的位置,我们还要改变绘制方法。我们把Game类的main函数中的while循环中的blit函数改成

self.screen.blit(self.bird, (self.x, 300))

运行后你应该会看的如下

 一只小鸟拖着尾迹向右边移动。那是因为没有刷新屏幕,我们要在Game类的main函数中的while循环中添加

self.screen.fill((0, 0, 0))

现在我们再运行

现在正常了

我们给一下最终代码

#导入模块
import pygame
import sys

class Game:
    def __init__(self):
        pygame.init()#在使用pygame之前要先初始化
        self.bird = pygame.image.load("bird.png")#导入bird.png图片
        self.screen = pygame.display.set_mode((800, 600))#创建一个800*600的窗口
        pygame.display.set_caption("Game")#设置窗口标题为”Game“
        self.speed = 5
        self.x = 50

    def Listen(self):#事件监测
        for event in pygame.event.get():#事件监测
            if event.type == pygame.QUIT:#点“X”号退出
                pygame.quit()
                sys.exit()

    def main(self):
        while True:#程序主循环
            self.x += 1
            self.Listen()#事件监测
            self.screen.blit(self.bird, (self.x, 300))#将bird.png绘制的400,300的位置
            pygame.display.flip()#屏幕刷新
            self.screen.fill((0, 0, 0))
if __name__ == '__main__':
    game = Game()
    game.main()

方法2: 我们在Game类的__init__初始化函数中添加

self.bird_rect = self.bird.get_rect()

这个函数是用来求图片的rect区域,其中没有参数。再添加

self.bird_rect.center = (50, 300)

这个函数是用来设置图片的初始位置,center代表中间做锚点,其他我就先不说了,想要拓展的可以自己去网上搜一下。

我们在我们要在Game类的main函数中的while循环中添加

self.bird_rect.move_ip(1, 0)

这个函数用来改变xy的位置,正数为加,负数为减。

move_ip(x, y)

我们把Game类的main函数中的while循环中的blit函数改成

self.screen.blit(self.bird, self.bird_rect)

运行一下

我们最后给一下最终代码

#导入模块
import pygame
import sys

class Game:
    def __init__(self):
        pygame.init()#在使用pygame之前要先初始化
        self.bird = pygame.image.load("bird.png")#导入bird.png图片
        self.screen = pygame.display.set_mode((800, 600))#创建一个800*600的窗口
        pygame.display.set_caption("Game")#设置窗口标题为”Game“
        self.bird_rect = self.bird.get_rect()
        self.bird_rect.center = (50, 300)

    def Listen(self):#事件监测
        for event in pygame.event.get():#事件监测
            if event.type == pygame.QUIT:#点“X”号退出
                pygame.quit()
                sys.exit()

    def main(self):
        while True:#程序主循环
            self.bird_rect.move_ip(1, 0)
            self.Listen()#事件监测
            self.screen.blit(self.bird, self.bird_rect)#将bird.png绘制的400,300的位置
            pygame.display.flip()#屏幕刷新
            self.screen.fill((0, 0, 0))
if __name__ == '__main__':
    game = Game()
    game.main()

 下节预告:我们会学习pygame的Sprite

拜拜!