Python——动画精灵
繼續探索Python中Pygame的強大功能~~ Fighting ^ ▽^
文章目錄
- 一. 什么是動畫精靈
- 二. Sprite類
- 三. move( ) 方法
前邊已經講到,看似簡單的動畫實際上并不簡單。如果有大量圖像在四處移動,要想跟蹤每個圖像“底下”有些什么,以便在移動圖像時能夠重繪,這要給很大的功夫。我們之前的小狗,因為背景是白色的,所以更容易一些。倘若背景上有一些圖形,肯定會復雜得多。
下面就要介紹這一篇的主角——動畫精靈,pygame有一個特殊的模塊來處理動畫精靈。
一. 什么是動畫精靈
動畫精靈表示一個單位來移動和顯示一組像素,這是一種圖形對象。
“動畫精靈”這個詞是從老式計算機和游戲機流傳下來的。這些老式游戲機不能很快地繪制和擦除圖形來保證游戲正常工作。這些游戲機有一些特殊的硬件,專門用來處理需要快速移動的游戲對象。這些對象就稱為“動畫精靈”。它們有一些特殊的限制,不過可以非常快地繪制和更新……如今,一般來講,計算機的速度已經足夠快了,不需要專門的硬件也可以很好地處理類似動畫精靈的對象。不過‘動畫精靈’這個詞仍用來便是二維游戲中的所有動畫對象。
可以把動畫精靈想成一個小圖片——一種可以在屏幕上移動的圖形對象,并且可以與其他圖形對象交互。
二. Sprite類
Pygame的sprite模塊提供了一個動畫精靈基類,名為sprite。正常情況下,我們不會直接使用基類,而是基于pygame.sprite.Sprite來創建自己的子類,下邊創建一個類,并命名為MyDogClass。代碼如下:
class MyDogClass(pygame.sprite.Sprite):def __init__(self, image_file, location):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(image_file)self.rect = self.image.get_rect()self.rect.left, self.rect.top = location接下來創建它的一些實例:
img_file = "timg.png" dogs = [] for row in range(0,3):for column in range(0,3):location = [column * 180 + 10,row * 180 + 10]dog = MyDogClass(img_file,location)dogs.append(dog)我們還需要把小狗移到顯示表面:
for dog in dogs:screen.blit(dog.image, dog.rect) pygame.display.flip()把所有代碼放在一起如下:
import sys,pygameclass MyDogClass(pygame.sprite.Sprite):def __init__(self, image_file, location):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(image_file)self.rect = self.image.get_rect()self.rect.left, self.rect.top = locationsize = width,height = 640,480 screen = pygame.display.set_mode(size) screen.fill([255,255,255]) img_file = "timg.png" dogs = [] for row in range(0,3):for column in range(0,3):location = [column * 180 + 10,row * 180 + 10]dog = MyDogClass(img_file,location)dogs.append(dog) for dog in dogs:screen.blit(dog.image, dog.rect) pygame.display.flip()running = True while running:for event in pygame.event.get():if event.type == pygame.QUIT:rynning = False pygame.quit()效果圖:
注意程序中一個小變化:
這個代碼不僅設置了窗口的大小,還定義了兩個變量width和height,后邊還會用到。
三. move( ) 方法
使用一個新的類方法move( )來移動這些小狗:
def move(self):self.rect = self.rect.move(self,speed)if self.rect.left < 0 or self.rect.right > width:self.speed[0] = - self.speed[0]if self.rect.top < 0 or self.rect.bottom > height:self.speed[1] = -self.speed[1]動畫精靈有一個內置方法move( )。這個方法需要一個speed參數來告訴它對象要移動多遠。在2—D,speed是一個包含兩個數的列表,一個對應x-speed,另一個對應y-speed:
class MyDogClass(pygame.sprite.Sprite):def __init__(self, image_file, location,speed):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(image_file)self.rect = self.image.get_rect()self.rect.left, self.rect.top = locationself.speed = speeddef move(self):self.rect = self.rect.move(self,speed)if self.rect.left < 0 or self.rect.right > width:self.speed[0] = - self.speed[0]if self.rect.top < 0 or self.rect.bottom > height:self.speed[1] = -self.speed[1]讓小狗隨機移動就更有意思,使用random.choice( )函數來設置速度:
from random import * speed = [choice([-2,2], choice[-2,2])]完整程序為:
import sys,pygame from random import *class MyDogClass(pygame.sprite.Sprite):def __init__(self, image_file, location,speed):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(image_file)self.rect = self.image.get_rect()self.rect.left, self.rect.top = locationself.speed = speeddef move(self):self.rect = self.rect.move(self.speed)if self.rect.left < 0 or self.rect.right > width:self.speed[0] = - self.speed[0]if self.rect.top < 0 or self.rect.bottom > height:self.speed[1] = -self.speed[1]size = width,height = 640,480 screen = pygame.display.set_mode(size) screen.fill([255,255,255]) img_file = "timg.png" dogs = [] for row in range(0,3):for column in range(0,3):location = [column * 180 + 10,row * 180 + 10]speed = [choice([-2,2]), choice([-2,2])]dog = MyDogClass(img_file,location,speed)dogs.append(dog)running = True while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsepygame.time.delay(20)screen.fill([255,255,255])for dog in dogs:dog.move()screen.blit(dog.image, dog.rect)pygame.display.flip()pygame.quit()如果把圖片換成立體的小球,碰到邊界時更有感覺:
小球的圖片在這里:
總結
以上是生活随笔為你收集整理的Python——动画精灵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用无线局域网设置服务器,无线局域网如何配
- 下一篇: Mac OS X任务管理器