(Python3)- PyGame 基本參數學習-3 (*精靈*)

(Python3)- PyGame 基本參數學習-3 (*精靈*)

(Python3)- PyGame 基本參數學習-3 (*精靈*)

 

 

一、什么是精靈

精靈可以認為成是一個個小圖片,一種可以在屏幕上移動的圖形對象,并且可以與其他圖形對象交互。精靈圖像可以是使用pygame繪制函數繪制的圖像,也可以是原來就有的圖像文件。


二、sprite中主要且常用的變量有以下几個:

self.image這個負責顯示什么。如self.image=pygame.Surface([x,y])說明該精靈是一個x,y大小的距形,self.image=pygame.image.load(filename)說明該精靈調用顯示filename這個圖片文件。
self.image.fill([color])
,負責對self.image着色,如self.image=pygame.Surface([x,y])
self.image.fill([255,0,0])
x,y距形填充紅色。
self.rect
負責在哪里顯示。一般來說,先用self.rect=self.image.get_rect()獲得image距形大小,然后給self.rect設定顯示的位置,一般用self.rect.toplefttoprightbottomleftbottomright)來設定某一個角的顯示位置。另外,self.rect.topself.rect.bottomself.rect.rightself.rect.left分別表示上下左右。
self.update
負責使精靈行為生效。
Sprite.add 
添加精靈到group中去。
Sprite.remove
group中刪除
Sprite.kill
groups中全部刪除精靈
Sprite.alive
判斷精靈是否屬於groups

更多詳細的見http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite

 

三、建立一個簡單的精靈

所有精靈在建立時都是從pygame.sprite.Sprite中繼承的。

1)做一個精靈,繪制一個寬20、高20的距形,具體代碼如下:

 

class Temp(pygame.sprite.Sprite):
    def __init__(self,color,initial_position):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([20,20])
        self.image.fill(color)
        self.rect=self.image.get_rect()
        self.rect.topleft=initial_position

 

這里逐句進行一下分析,pygame.sprite.Sprite.__init__(self)完成初始化。self.image = pygame.Surface([20,20])定義顯示20*20的一個距形surfaceself.image.fill(color)color來填充顏色。self.rect=self.image.get_rect()獲取self.image大小。self.rect.topleft=initial_position確定左上角顯示位置,當然也可以用toprightbottomrighbottomleft來分別確定其他几個角的位置。精靈的顯示,在一個640*480大小的白色窗體[400,100]的位置繪制一個20*20大小的紅色距形,完整代碼如下:

 

import pygame,sys
pygame.init()
class Temp(pygame.sprite.Sprite):
    def __init__(self,color,initial_position):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface([20,20])
        self.image.fill(color)
        self.rect=self.image.get_rect()
        self.rect.topleft=initial_position
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
b=Temp([255,0,0],[400,100])
screen.blit(b.image,b.rect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

 

 

2)做一個精靈,顯示內容為某一圖片,代碼如下:

 

import pygame,sys
pygame.init()
class Fairy(pygame.sprite.Sprite):
    def __init__(self,filename,initial_position):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(filename)
        self.rect=self.image.get_rect()
        #self.rect.topleft=initial_position
        self.rect.bottomright=initial_position
        print (self.rect.right)
         
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
fi='Fairy.ico'
b=Fairy(fi,[350,300])
screen.blit(b.image,b.rect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

 

這段代碼與(1)的不同之處在於self.image定義為pygame.image.load(filename),用來顯示filename文件,本代碼使用了Fairy.ico文件,并定義了精靈右底角的顯示位置是[350,300]

 

三、學習精靈組

1)使用精靈在屏幕上放多個圖像,這種方法沒有利用精靈組的概念,而是利用了list來生成每一個精靈。Cargroup用來存儲不同位置的Fairyscreen.blit(carlist.image,carlist.rect)逐個顯示每一個精靈。具體見代碼:

 

import pygame,sys
pygame.init()
class Fairy(pygame.sprite.Sprite):
    def __init__(self,filename,initial_position):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(filename)
        self.rect=self.image.get_rect()
        self.rect.bottomright=initial_position

         
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
fi='Fairy.ico'
locationgroup=([250,300],[450,460],[350,380])
Fairygroup=[]
for lo in locationgroup:
    Fairygroup.append(Fairy(fi,lo))
for fairylist in Fairygroup:
    screen.blit(fairylist.image,fairylist.rect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

 

 

(2)使用精靈組來實現多個圖像。上面精靈是存在一個列表中,很方便,就是有點不太好用。除了精靈,pygame還提供了精靈組,它很適合處理精靈列表,有添加,移除,繪制,更新等方法。


Group.sprites
精靈組
Group.copy
復制
Group.add
添加
Group.remove
移除
Group.has
判斷精靈組成員
Group.update
更新
Group.draw
位塊顯示
Group.clear –
繪制背景
Group.empty
清空

具體如下:http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite


同樣還是上面的這個例子,這里用精靈組來實現。

 

import pygame,sys
pygame.init()
class Fairy(pygame.sprite.Sprite):
    def __init__(self,filename,initial_position):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(filename)
        self.rect=self.image.get_rect()
        self.rect.bottomright=initial_position
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
fi='Fairy.ico'
locationgroup=([250,300],[450,460],[350,380])
Fairygroup=pygame.sprite.Group()
for lo in locationgroup:
    Fairygroup.add(Fairy(fi,lo))

for fairylist in Fairygroup.sprites():
    screen.blit(fairylist.image,fairylist.rect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()

 

兩個例子都是在[250,300],[450,460],[350,380]三個位置顯示三輛精靈,不同之處第一個用的是list,第二個用的是精靈組。差別就在几句話上,一是Fairygroup=pygame.sprite.Group()定義Fairygroup為精靈組,二是Fairygroup.add(Fairy(fi,lo))add代替了append,三是for fairylist in Fairygroup.sprites()這句中逐個顯示精靈,這里試了一下,直接用for fairylist in Fairygroup也是可以的。精靈組的代碼是高度優化過了,常常比列表還快。插入和刪除都是常見的操作,代碼還可以避免內存在循環中反復消耗。

 

四、動畫

利用精靈組做動畫會顯得比較方便,這里我們首先讓上面的三個精靈運動起來。

1)三個精靈以不同的速度前行,利用random.choice隨機生成[-10,-1]之間的值作為速度讓精靈從下向上運動,并且當到達頂部時,再從底部出現。代碼如下:

 

import pygame,sys
from random import *
pygame.init()
class Fairy(pygame.sprite.Sprite):
    def __init__(self,filename,initial_position,speed):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(filename)
        self.rect=self.image.get_rect()
        self.rect.topleft=initial_position
        self.speed=speed
    def move(self):
        self.rect=self.rect.move(self.speed)
        if self.rect.bottom < 0:   #當精靈底部到達窗口頂部時,讓精靈從下面出來    
            self.rect.top=480
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
fi='Fairy.ico'
locationgroup=([150,200],[350,300],[250,200])
Fairygroup=pygame.sprite.Group()
for lo in locationgroup:
    speed=[0,choice([-10,-1])]
    Fairygroup.add(Fairy(fi,lo,speed))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
    pygame.time.delay(20)
    screen.fill([255,255,255])
    for fairylist in Fairygroup.sprites():
        fairylist.move()
        screen.blit(fairylist.image,fairylist.rect)
    pygame.display.update()

 

2)可以通過左右鍵控制三輛小車的左右移動,按左鍵向左移動,當到達最左邊時,不再移動,按右鍵向右移動,當到達最右邊時,不再移動。具體代碼如下:

import pygame,sys
from random import *
pygame.init()
class Fairy(pygame.sprite.Sprite):
    def __init__(self,filename,initial_position,speed):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load(filename)
        self.rect=self.image.get_rect()
        self.rect.topleft=initial_position
        self.speed=speed
    def move(self):
        self.rect=self.rect.move(self.speed)
        if self.rect.bottom < 0:        
            self.rect.top=480
    def moveleft(self):
        self.rect.left=self.rect.left-10
        if self.rect.left<0:
            self.rect.left=0
    def moveright(self):
        self.rect.right=self.rect.right+10
        if self.rect.right>640:
            self.rect.right=640
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
fi='Fairy.ico'
locationgroup=([150,200],[350,300],[250,200])
Fairygroup=pygame.sprite.Group()
for lo in locationgroup:
    speed=[0,choice([-10,-1])]
    Fairygroup.add(Fairy(fi,lo,speed))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key==pygame.K_LEFT:
                for fairylist in Fairygroup.sprites():
                    fairylist.moveleft()
                    screen.blit(fairylist.image,fairylist.rect)
            if event.key==pygame.K_RIGHT:
                for fairylist in Fairygroup.sprites():
                    fairylist.moveright()
                    screen.blit(fairylist.image,fairylist.rect)
    pygame.time.delay(20)
    screen.fill([255,255,255])
    for fairylist in Fairygroup.sprites():
        fairylist.move()
        screen.blit(fairylist.image,fairylist.rect)
    pygame.display.update()

 

 

 

免責聲明:

1.本影像檔案皆從網上搜集轉載,不承擔任何技術及版權問題。

2.如有下載連結僅供寬頻測試研究用途,請下載後在24小時內刪除,請勿用於商業。

3.若侵犯了您的合法權益,請來信通知我們,我們會及時刪除,給您帶來的不便,深表歉意。



發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *