Pygame中实现图片旋转

Pygame中实现图片的移动_pygame实现图片移动-CSDN博客中我们实现了一个移动的大猩猩,接下来在该程序的基础上实现大猩猩图片的旋转,也就是点击了鼠标后,大猩猩旋转一周,之后继续移动。

1 为Chimp类添加旋转的方法

首先为Chimp类也就是大猩猩类添加旋转的方法,代码如图1所示。

图1 Chimp类的旋转方法

从图1中可以看出,该旋转方法的方法名是_spin。第47行调用通过self调用Rect类的成员变量center,该成员变量的含义是Rect中心位置的坐标,并将其保存到Chimp类的center属性中;第48行中的dizzy属性表示旋转的度数,12表示每次旋转12°,将该数字变大,则旋转的速度将会加快;第49-51行代码的作用是当旋转的度数超过360°,则说明此时图片已经旋转了一周,则停止旋转,将dizzy的值设置为0,将image的值设置为原始图片original,original将在后续提到的punched()中定义;第52-54行代码表示当图片旋转的度数不到360°,即不到一周时,通过调用pygame.transform中的rotate()方法继续旋转图片,该方法的第一个参数表示要旋转的图片,第二个参数表示旋转的度数;最后在第55行中,通过get_rect()方法获取旋转之后的图片坐在的位置。

2 为Chimp类添加触发旋转的方法

为Chimp类添加触发旋转的方法,代码如图2所示。

图2 触发旋转的方法

从图2中可以看到,触发旋转方法的方法名是punched;在该方法中,首先判断dizzy是否是0,即图片是否已经开始旋转,如果图片未旋转,则dizzy的值是0,否则不为0;如果此时图片未旋转,则触发图片旋转的开关,即将dizzy的值设置为1;第60行获取旋转前的图片并将其保存到original中。

3 修改Chimp类的update()方法

在《Pygame中实现图片的移动》中提到,update()方法的作用是更新图片,更新后的代码如图3所示。

图3 更新后的update()方法

从图3中可以看出,在update()方法中,对dizzy进行判断,如果dizzy不为0,则图片开始旋转;如果dizzy为0,则图片移动。

4 处理鼠标点击

为了实现点击鼠标后图片开始旋转,在主程序中需要添加对鼠标点击的处理代码,如图4所示。

图4 处理鼠标点击的代码

第79行中,如果鼠标类型是MOUSEBUTTONDOWN,即鼠标被按下时,则调用Chimp类的punched()方法,即触发了图片旋转,当图片旋转一周后,停止旋转,图片继续移动。

5 完整代码

以上提到的完整代码如下所示。

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):
        if self.dizzy:
            self._spin()
        else:
            self._walk()

    def _walk(self):
        newpos = self.rect.move((self.move, 0))
        if not self.area.contains(newpos):
            if self.rect.left<self.area.left  \
                   or self.rect.right>self.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

    def _spin(self):
        center = self.rect.center
        self.dizzy = self.dizzy + 12
        if self.dizzy >= 360:
            self.dizzy = 0
            self.image = self.original
        else:
            rotate = pygame.transform.rotate
            self.image = rotate(self.original, self.dizzy)
        self.rect = self.image.get_rect(center=center)

    def punched(self):
        if not self.dizzy:
            self.dizzy = 1
            self.original = self.image
        
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
        elif event.type == pygame.MOUSEBUTTONDOWN:
            chimp.punched()
    allsprites.update()
    allsprites.draw(screen)
    pygame.display.flip()
pygame.quit()

猜你喜欢

转载自blog.csdn.net/hou09tian/article/details/134654189