最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pygame學(xué)習(xí)筆記(5):游戲精靈

 更新時(shí)間:2015年04月15日 09:39:27   投稿:junjie  
這篇文章主要介紹了pygame學(xué)習(xí)筆記(5):游戲精靈,本文講解了什么是精靈、sprite中主要且常用的變量、建立一個(gè)簡(jiǎn)單的精靈、學(xué)習(xí)精靈組、動(dòng)畫(huà)等內(nèi)容,需要的朋友可以參考下

據(jù)說(shuō)在任天堂FC時(shí)代,精靈的作用相當(dāng)巨大,可是那時(shí)候只知道怎么玩超級(jí)瑪麗、魂斗羅,卻對(duì)精靈一點(diǎn)也不知。pygame.sprite.Sprite就是Pygame里面用來(lái)實(shí)現(xiàn)精靈的一個(gè)類(lèi),使用時(shí),并不需要對(duì)它實(shí)例化,只需要繼承他,然后按需寫(xiě)出自己的類(lèi)就好了,因此非常簡(jiǎn)單實(shí)用。

一、什么是精靈

精靈可以認(rèn)為成是一個(gè)個(gè)小圖片,一種可以在屏幕上移動(dòng)的圖形對(duì)象,并且可以與其他圖形對(duì)象交互。精靈圖像可以是使用pygame繪制函數(shù)繪制的圖像,也可以是原來(lái)就有的圖像文件。

二、sprite中主要且常用的變量有以下幾個(gè):更多詳細(xì)的見(jiàn)http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite
self.image這個(gè)負(fù)責(zé)顯示什么。如self.image=pygame.Surface([x,y])說(shuō)明該精靈是一個(gè)x,y大小的距形,self.image=pygame.image.load(filename)說(shuō)明該精靈調(diào)用顯示filename這個(gè)圖片文件。

復(fù)制代碼 代碼如下:

self.image.fill([color]),負(fù)責(zé)對(duì)self.image著色,如self.image=pygame.Surface([x,y])
self.image.fill([255,0,0])

對(duì)x,y距形填充紅色。
self.rect負(fù)責(zé)在哪里顯示。一般來(lái)說(shuō),先用self.rect=self.image.get_rect()獲得image距形大小,然后給self.rect設(shè)定顯示的位置,一般用self.rect.topleft(topright、bottomleft、bottomright)來(lái)設(shè)定某一個(gè)角的顯示位置。另外,self.rect.top、self.rect.bottom、self.rect.right、self.rect.left分別表示上下左右。
self.update 負(fù)責(zé)使精靈行為生效。
Sprite.add  添加精靈到group中去。
Sprite.remove 從group中刪除
Sprite.kill 從groups中全部刪除精靈
Sprite.alive 判斷精靈是否屬于groups

三、建立一個(gè)簡(jiǎn)單的精靈

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

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

復(fù)制代碼 代碼如下:

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

這里逐句進(jìn)行一下分析,pygame.sprite.Sprite.__init__(self)完成初始化。self.image = pygame.Surface([30,30])定義顯示30*30的一個(gè)距形surface。self.image.fill(color)用color來(lái)填充顏色。self.rect=self.image.get_rect()獲取self.image大小。self.rect.topleft=initial_position確定左上角顯示位置,當(dāng)然也可以用topright、bottomrigh、bottomleft來(lái)分別確定其他幾個(gè)角的位置。精靈的顯示,在一個(gè)640*480大小的白色窗體[50,100]的位置繪制一個(gè)30*30大小的紅色距形,完整代碼如下:

復(fù)制代碼 代碼如下:

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([30,30])
        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],[50,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)做一個(gè)精靈,顯示內(nèi)容為某一圖片,這里以前面用過(guò)的小車(chē)圖片為例,代碼如下:
復(fù)制代碼 代碼如下:

import pygame,sys
pygame.init()
class Car(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='ok1.jpg'
b=Car(fi,[150,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()

這段代碼與(1)的不同之處在于self.image定義為pygame.image.load(filename),用來(lái)顯示filename文件,本代碼使用了ok1.jpg文件,并定義了小車(chē)右底角的顯示位置是[150,100]。

三、學(xué)習(xí)精靈組

(1)使用精靈在屏幕上放多個(gè)圖像,這種方法沒(méi)用利用精靈組的概念,而是利用了list來(lái)生成每一個(gè)精靈。Cargroup用來(lái)存儲(chǔ)不同位置的Car,screen.blit(carlist.image,carlist.rect)逐個(gè)顯示每一個(gè)精靈。具體見(jiàn)代碼:

復(fù)制代碼 代碼如下:

import pygame,sys
pygame.init()
class Car(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='ok1.jpg'
locationgroup=([150,200],[350,360],[250,280])
Cargroup=[]
for lo in locationgroup:
    Cargroup.append(Car(fi,lo))
for carlist in Cargroup:
    screen.blit(carlist.image,carlist.rect)
pygame.display.update()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()


具體效果見(jiàn)圖:

(2)使用精靈組來(lái)實(shí)現(xiàn)多個(gè)圖像。上面精靈是存在一個(gè)列表中,很方便,就是有點(diǎn)不太好用。除了精靈,pygame還提供了精靈組,它很適合處理精靈列表,有添加,移除,繪制,更新等方法。具體如下:http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite
Group.sprites 精靈組
Group.copy 復(fù)制
Group.add 添加
Group.remove 移除
Group.has 判斷精靈組成員
Group.update 更新
Group.draw 位塊顯示
Group.clear - 繪制背景
Group.empty 清空
同樣還是上面的這個(gè)例子,這里用精靈組來(lái)實(shí)現(xiàn)。

復(fù)制代碼 代碼如下:

import pygame,sys
pygame.init()
class Car(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='ok1.jpg'
locationgroup=([150,200],[350,360],[250,280])
Cargroup=pygame.sprite.Group()
for lo in locationgroup:
    Cargroup.add(Car(fi,lo))

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


兩個(gè)例子都是在[150,200],[350,360],[250,280]三個(gè)位置顯示三輛小車(chē),不同之處第一個(gè)用的是list,第二個(gè)用的是精靈組。差別就在幾句話上,一是Cargroup=pygame.sprite.Group()定義Cargroup為精靈組,二是Cargroup.add(Car(fi,lo))用add代替了append,三是for carlist in Cargroup.sprites()這句中逐個(gè)顯示精靈,這里試了一下,直接用for carlist in Cargroup也是可以的。精靈組的代碼是高度優(yōu)化過(guò)了,常常比列表還快。插入和刪除都是常見(jiàn)的操作,代碼還可以避免內(nèi)存在循環(huán)中反復(fù)消耗。

四、動(dòng)畫(huà)

利用精靈組做動(dòng)畫(huà)會(huì)顯得比較方便,這里我們首先讓上面的三輛小車(chē)運(yùn)動(dòng)起來(lái)。
(1)三輛小車(chē)以不同的速度前行,利用random.choice隨機(jī)生成[-10,-1]之間的值作為速度讓小車(chē)從下向上運(yùn)動(dòng),并且當(dāng)?shù)竭_(dá)頂部時(shí),再?gòu)牡撞砍霈F(xiàn)。代碼如下:

復(fù)制代碼 代碼如下:

import pygame,sys
from random import *
pygame.init()
class Car(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:   #當(dāng)小車(chē)底部到達(dá)窗口頂部時(shí),讓小車(chē)從下面出來(lái)    
            self.rect.top=480
screen=pygame.display.set_mode([640,480])
screen.fill([255,255,255])
fi='ok1.jpg'
locationgroup=([150,200],[350,300],[250,200])
Cargroup=pygame.sprite.Group()
for lo in locationgroup:
    speed=[0,choice([-10,-1])]
    Cargroup.add(Car(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 carlist in Cargroup.sprites():
        carlist.move()
        screen.blit(carlist.image,carlist.rect)
    pygame.display.update()

(2)可以通過(guò)左右鍵控制三輛小車(chē)的左右移動(dòng),按左鍵向左移動(dòng),當(dāng)?shù)竭_(dá)最左邊時(shí),不再移動(dòng),按右鍵向右移動(dòng),當(dāng)?shù)竭_(dá)最右邊時(shí),不再移動(dòng)。具體代碼如下:

復(fù)制代碼 代碼如下:

import pygame,sys
from random import *
pygame.init()
class Car(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='ok1.jpg'
locationgroup=([150,200],[350,300],[250,200])
Cargroup=pygame.sprite.Group()
for lo in locationgroup:
    speed=[0,choice([-10,-1])]
    Cargroup.add(Car(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 carlist in Cargroup.sprites():
                    carlist.moveleft()
                    screen.blit(carlist.image,carlist.rect)
            if event.key==pygame.K_RIGHT:
                for carlist in Cargroup.sprites():
                    carlist.moveright()
                    screen.blit(carlist.image,carlist.rect)
    pygame.time.delay(20)
    screen.fill([255,255,255])
    for carlist in Cargroup.sprites():
        carlist.move()
        screen.blit(carlist.image,carlist.rect)
    pygame.display.update()

相關(guān)文章

  • Python實(shí)現(xiàn)制作銷(xiāo)售數(shù)據(jù)可視化看板詳解

    Python實(shí)現(xiàn)制作銷(xiāo)售數(shù)據(jù)可視化看板詳解

    在數(shù)據(jù)時(shí)代,銷(xiāo)售數(shù)據(jù)分析的重要性已無(wú)需贅言。只有對(duì)銷(xiāo)售數(shù)據(jù)的準(zhǔn)確分析我們才有可能找準(zhǔn)數(shù)據(jù)變動(dòng)的原因。本文將介紹用Python制作銷(xiāo)售數(shù)據(jù)大屏的方法。感興趣的可以關(guān)注一下
    2021-11-11
  • 用Python快速讀取Excel數(shù)據(jù)

    用Python快速讀取Excel數(shù)據(jù)

    嘿,想學(xué)會(huì)用Python快速讀取Excel數(shù)據(jù)嗎?不用擔(dān)心,這個(gè)指南將帶你輕松掌握這項(xiàng)技能,讓我們一起開(kāi)始吧!
    2023-12-12
  • Python八大常見(jiàn)排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析

    Python八大常見(jiàn)排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析

    這篇文章主要介紹了Python八大常見(jiàn)排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析,結(jié)合具體實(shí)例形式對(duì)比分析了冒泡排序、直接插入排序、選擇排序、歸并排序、希爾排序、桶排序、堆排序等排序算法的使用與執(zhí)行效率,需要的朋友可以參考下
    2018-04-04
  • OpenCV?基本圖形繪制函數(shù)詳解

    OpenCV?基本圖形繪制函數(shù)詳解

    這篇文章主要介紹了OpenCV?基本圖形繪制函數(shù),用于繪制圓的circle函數(shù),用于繪制填充的多邊形的fillPoly函數(shù),本文給大家提到好幾種,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • python 可視化庫(kù)PyG2Plot的使用

    python 可視化庫(kù)PyG2Plot的使用

    這篇文章主要介紹了python 可視化庫(kù)PyG2Plot的使用方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • pandas 將list切分后存入DataFrame中的實(shí)例

    pandas 將list切分后存入DataFrame中的實(shí)例

    今天小編就為大家分享一篇pandas 將list切分后存入DataFrame中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python+OpenCV圖片局部區(qū)域像素值處理詳解

    Python+OpenCV圖片局部區(qū)域像素值處理詳解

    這篇文章主要為大家詳細(xì)介紹了Python+OpenCV圖片局部區(qū)域像素值處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • python使用OpenCV實(shí)現(xiàn)多目標(biāo)跟蹤

    python使用OpenCV實(shí)現(xiàn)多目標(biāo)跟蹤

    這篇文章主要介紹了python使用OpenCV實(shí)現(xiàn)多目標(biāo)跟蹤,如何在OpenCV中使用MultiTracker類(lèi)實(shí)現(xiàn)多目標(biāo)跟蹤API。在深入了解詳細(xì)信息之前,請(qǐng)查看下面列出的關(guān)于目標(biāo)跟蹤的帖子,以了解在OpenCV中實(shí)現(xiàn)的單個(gè)目標(biāo)跟蹤器的基礎(chǔ)知識(shí),需要的朋友可以參考一下
    2022-04-04
  • Python爬蟲(chóng)抓取技術(shù)的一些經(jīng)驗(yàn)

    Python爬蟲(chóng)抓取技術(shù)的一些經(jīng)驗(yàn)

    這篇文章主要介紹了Python爬蟲(chóng)抓取技術(shù)的一些經(jīng)驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • AI生成圖片Stable?Diffusion環(huán)境搭建與運(yùn)行方法

    AI生成圖片Stable?Diffusion環(huán)境搭建與運(yùn)行方法

    Stable?Diffusion是一種基于擴(kuò)散過(guò)程的生成模型,由Ge?et?al.在2021年提出,該模型利用了隨機(jī)變量的穩(wěn)定分布,通過(guò)遞歸地應(yīng)用擴(kuò)散過(guò)程來(lái)生成高質(zhì)量的圖像,這篇文章主要介紹了AI圖片生成Stable?Diffusion環(huán)境搭建與運(yùn)行,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

治县。| 廊坊市| 江源县| 新巴尔虎右旗| 旌德县| 樟树市| 景德镇市| 沁源县| 曲松县| 阿巴嘎旗| 台东县| 常德市| 昂仁县| 多伦县| 湖北省| 福泉市| 镇沅| 上虞市| 三亚市| 柯坪县| 额敏县| 福海县| 宜都市| 隆回县| 滨州市| 上杭县| 邹城市| 土默特右旗| 伊宁市| 郴州市| 嵊泗县| 石林| 澄城县| 罗江县| 百色市| 通江县| 洱源县| 嘉善县| 清水县| 安陆市| 繁峙县|