Pygame中实现图片的移动

在《Pygame中将鼠标形状设置为图片2-1》和《Pygame中将鼠标形状设置为图片2-2》中提到将鼠标设置为指定图片。接下来在该文章涉及到的代码基础之上,实现图片的移动,效果如图1所示。

图1 图片移动效果

从图1中可以看出,导入一个大猩猩的图片,让大猩猩图片可以在创建的屏幕上左右移动。

1 猩猩类的创建

创建一个表示猩猩图片的类Chimp,该类也是pygame.sprite.Sprite类的派生类。

1.1 Chimp类的__init__()方法

Chimp类的__init__()方法的代码如图2所示。

Pygame中实现图片的移动_第1张图片

图2 Chimp类__init__()代码

在Chimp类的__init__()方法中,首先调用其父类的__init__();之后调用自定义函数load_image()方法导入大猩猩图片,并将图片保存到属性image中,而rect属性表示图片的位置;第22-23行代码获取程序窗口的大小,并将其保存到area属性中;第24行设置图片的位置,rect.topleft表示图片左上角所在的图标;第25行move属性表示图片移动的速度。

相关链接1 load_image()方法的详细说明,请参考Pygame中Sprite类的使用6-1-CSDN博客

1.2 Chimp类的_walk()方法

Chimp类的_walk()方法用于控制图片的移动,其代码如图3所示。

Pygame中实现图片的移动_第2张图片

图3 Chimp类_walk()代码

其中,第31行代码通过pygame.Rect类的实例rect调用move()方法开始移动,该方法的参数是一个元组,元组中的第一个元素表示在横坐标移动的速度,第二个元素表示纵坐标移动的速度,newpos保存了图片移动后的位置;当图片向左或者向右移动到了窗口边缘后,需要改变移动方向。因此第32行中的代码通过pygame.Rect类的contains()方法判断图片移动后的位置newpos是否在窗口area中,如果不在窗口中,则contains()返回值是False;此时第34-35行代码,再次判断图片是否左移或者右移出了窗口,如果是以上情况,则通过36行所示代码,将速度改为负值,也就是更改了移动方向;37行代码表示按照更改后的新方向继续移动图片,因为图片移动的方向发生了逆转,所以也需要对图片进行逆转,第38-39行代码调用pygame.transform类的flip()方法,将图片进行逆转;flip()方法表示第一个参数要逆转的图片,第二个表示是否在水平方向逆转,1表示逆转,0表示不逆转,第三个参数表示是否在垂直方向逆转;最后,用图片的新位置newpos来更新图片的位置属性rect。

1.3 Chimp类的update()方法

Chimp类的update()方法用于更新图片,该方法的代码如图4所示。

Pygame中实现图片的移动_第3张图片

图4 Chimp类update()代码

从图4可以看出,在update()方法调用了Chimp类的_walk()方法,改变了图片的位置,也就更新了图片。

2 猩猩类的使用

在主程序中首先创建Chimp()类的实例,如图5中49行代码所示;之后将chimp加入到sprite的Group中;最后定义pygame.time.Clock()类的实例clock,用于控制图片移动速度。

图5 使用猩猩类的代码1

相关链接2 RenderPlain()方法的使用,请参考Pygame中Sprite类的使用6-3_棉猴的博客-CSDN博客

为了控制图片移动速度不能过快,在while going循环中,加入clock.tick()代码控制移动速度,代码如图6中54行所示。

Pygame中实现图片的移动_第4张图片

图6 使用猩猩类的代码2

相关链接3 pygame.time.Clock类的tick()方法的使用,请参考

3 完整代码

import pygame

def load_image(name):
    image = pygame.image.load(name)
    image = image.convert()
    colorkey = image.get_at((0,0))
    image.set_colorkey(colorkey, pygame.RLEACCEL)
    return image, image.get_rect()

class Mouse(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('qiu.png')
    def update(self):
        self.rect.topleft = pygame.mouse.get_pos()
        self.rect.move_ip((0,0))

class Chimp(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('chimp.bmp')
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.rect.topleft = 10, 10
        self.move = 9
        self.dizzy = 0
        
    def update(self):
        self._walk()

    def _walk(self):
        newpos = self.rect.move((self.move, 0))
        if not self.area.contains(newpos):
            if self.rect.leftself.area.right:
                self.move = -self.move
                newpos = self.rect.move((self.move, 0))
                self.image =  \
                     pygame.transform.flip(self.image, 1, 0)
        self.rect = newpos

        
pygame.init()
screen = pygame.display.set_mode((1280, 480))
pygame.mouse.set_visible(False)
screen.fill((170, 238, 187))
going = True
mouse = Mouse()
chimp = Chimp()
allsprites = pygame.sprite.RenderPlain(mouse, chimp)
clock = pygame.time.Clock()

while going:
    clock.tick(60)
    
    screen.fill((170, 238, 187))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            going = False
    allsprites.update()
    allsprites.draw(screen)
    pygame.display.flip()
pygame.quit()

你可能感兴趣的:(pygame,Sprite,精灵编程,图片移动)