婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > 利用pygame完成動(dòng)畫精靈和碰撞檢測

利用pygame完成動(dòng)畫精靈和碰撞檢測

熱門標(biāo)簽:房產(chǎn)電銷外呼系統(tǒng) 地圖制圖標(biāo)注位置改變是移位嗎 蓋州市地圖標(biāo)注 上海機(jī)器人外呼系統(tǒng)哪家好 地圖標(biāo)注微信發(fā)送位置不顯示 浙江電銷卡外呼系統(tǒng)好用嗎 南京銷售外呼系統(tǒng)軟件 315電話機(jī)器人廣告 地圖標(biāo)注的意義點(diǎn)

動(dòng)畫精靈和碰撞檢測

一、動(dòng)畫精靈

動(dòng)畫精靈:四處移動(dòng)的單個(gè)圖像或圖像部分稱為動(dòng)畫精靈(sprite),pygame有一個(gè)特殊的模塊幫助跟蹤屏幕上移動(dòng)的大量圖像。利用這個(gè)模塊,可以更容易地移動(dòng)圖形對(duì)象。

具備特征:

  • 圖像(image):為動(dòng)畫精靈顯示的圖片。
  • 矩形區(qū)(rect):包含動(dòng)畫精靈的矩形區(qū)域。

①、一堆沙灘球都反彈

Pygame 的 sprite 模塊提供了一個(gè)動(dòng)畫精靈基類Sprite,基于pygame.sprite.Sprite 來創(chuàng)建自己的子類。

這里用了常規(guī)的python列表

import sys, pygame
class MyBallClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location):
        pygame.sprite.Sprite.__init__(self)        #初始化動(dòng)畫精靈
        self.image = pygame.image.load(image_file) #加載圖片
        self.rect = self.image.get_rect()          #得到定義圖像邊界矩形
        self.rect.left, self.rect.top = location   #設(shè)置球的初始位置
#設(shè)置窗口大小和顏色    
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
img_file = "beach_ball.png"
balls = []
#將球增加到列表
for row in range(0, 3):
    for column in range(0, 3):
        location = [column * 180 + 10, row * 180 + 10]
        ball = MyBallClass(img_file, location)
        balls.append(ball)
for ball in balls:
    screen.blit(ball.image, ball.rect)
pygame.display.flip()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
pygame.quit()
 

顯示效果:

②、讓小球動(dòng)起來

move() 方法

創(chuàng)建一個(gè)新的類方法

 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]
###
其中 self.speed告訴對(duì)象要移動(dòng)多遠(yuǎn),包含2個(gè)列表。
import sys, pygame
from random import *
class MyBallClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location, speed):
        pygame.sprite.Sprite.__init__(self)        #初始化動(dòng)畫精靈
        self.image = pygame.image.load(image_file) #加載圖片
        self.rect = self.image.get_rect()          #得到定義圖像邊界矩形
        self.rect.left, self.rect.top = location   #設(shè)置球的初始位置
        self.speed = speed                         #創(chuàng)建一個(gè)速度
    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]
#設(shè)置窗口大小和顏色    
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
img_file = "beach_ball.png"
balls = []
#將球增加到列表
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])]     #讓每個(gè)球變得隨機(jī)性
        ball = MyBallClass(img_file, location, speed)
        print("y = ", ball.rect)
        balls.append(ball)
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    #這里不是單獨(dú)擦除(覆蓋各個(gè)球),直接用白色填充窗口,重新繪制
    pygame.time.delay(20)
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()        
pygame.quit()

二、碰撞檢測

上面的動(dòng)畫,僅僅只是移動(dòng)和反彈,球與球之間的碰撞還不能反彈.

Pygame 中已經(jīng)內(nèi)置有這種碰撞檢測。

Pygame 還提供了一種方法對(duì)動(dòng)畫精靈分組。 Pygame 的 group 類。例如,在保齡球游戲中,所有球瓶可能在一組,球則在另一組。

動(dòng)畫精靈模塊的spritecollide()函數(shù)用來檢測某個(gè)精靈是否與制定組的其他精靈發(fā)生碰撞,

這個(gè)函數(shù)的形式如下:

spritecollide(被檢測的精靈(sprite),指定組(group),是否重疊(False))

要檢查組中精靈之間的碰撞:

  • 從這個(gè)組中刪除這個(gè)精靈;
  • 檢查這個(gè)精靈與組中其他精靈之間的碰撞; 
  • 再把這個(gè)精靈添加回原來的組中。 
:為什么要先從組刪除?

答:如果開始時(shí)沒有從組中刪除這個(gè)精靈,spritecollide() 會(huì)檢測到這個(gè)精靈與它自身發(fā)生了碰撞,因?yàn)樗苍谶@個(gè)組中

import sys, pygame
from random import *
class MyBallClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location, speed):
        pygame.sprite.Sprite.__init__(self)        #初始化動(dòng)畫精靈
        self.image = pygame.image.load(image_file) #加載圖片
        self.rect = self.image.get_rect()          #得到定義圖像邊界矩形
        self.rect.left, self.rect.top = location   #設(shè)置球的初始位置
        self.speed = speed                         #創(chuàng)建一個(gè)速度
    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]
def animate(group):
    screen.fill([255, 255, 255])
    for ball in group:
        group.remove(ball)      #從組刪除精靈
        #檢查精靈與組的碰撞
        if pygame.sprite.spritecollide(ball, group, False): 
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        group.add(ball)
        ball.move()
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)
#設(shè)置窗口大小和顏色    
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
img_file = "beach_ball.png"
group = pygame.sprite.Group()   #創(chuàng)建精靈組
#將球增加到列表
for row in range(0, 2):
    for column in range(0, 2):
        location = [column * 180 + 10, row * 180 + 10]
        speed = [choice([-2, 2]), choice([-2, 2])]     #讓每個(gè)球變得隨機(jī)性
        ball = MyBallClass(img_file, location, speed)
        group.add(ball)
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    #這里不是單獨(dú)擦除(覆蓋各個(gè)球),直接用白色填充窗口,重新繪制
    pygame.time.delay(20)
    screen.fill([255, 255, 255])
    animate(group)   
pygame.quit()

上述代碼存在問題:

  • 球碰撞時(shí),它們會(huì)“顫抖”或者發(fā)生兩次 碰撞;
  • 有時(shí)球會(huì)“卡”在窗口邊界上,顫抖一段時(shí)間。

可能原因:上述代碼是先移動(dòng)一個(gè)球,檢查碰撞,然后移動(dòng)球在檢查下一個(gè)。這樣子可能造成球的滯后性

修改animate函數(shù)()
def animate(group):
    screen.fill([255, 255, 255])
    for ball in group:
        ball.move()
    for ball in group:
        group.remove(ball)      #從組刪除精靈
        #檢查精靈與組的碰撞
        if pygame.sprite.spritecollide(ball, group, False): 
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        group.add(ball)
        #ball.move()
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)

矩形碰撞與像素完美結(jié)合

在觀察可以方向,球“碰撞”時(shí)并不是完全接觸。因?yàn)?spritecollide() 沒有使用球的圓形輪廓來檢測碰撞。它使用了球的 rect,也就是球的外圍矩形。

如果希望球的圓形部分(而不是矩形邊界)真正接觸時(shí)球才會(huì)相互反彈,就必須使用一種稱為“像素完美碰撞檢測 ” 的 方 法。

三、統(tǒng)計(jì)時(shí)間

在之前我們都用time.delay(50)來控制動(dòng)畫運(yùn)行的快慢,

pygame.time.delay(50)

在計(jì)算機(jī)圖形學(xué)中,每個(gè)動(dòng)畫步叫做一幀,游戲程序員討論圖形更新的快慢時(shí)都會(huì)提到幀速率(每秒幀數(shù),fps)

問:要怎么控制未知代碼運(yùn)行時(shí)間?

——Pygame 的 time 模塊提供了這樣的工具:一個(gè)名為 Clock 的類

用 pygame.time.Clock() 控制幀速率

并不是向每個(gè)循環(huán)增加一個(gè)延遲,  pygame.time.Clock() 會(huì)控制每個(gè)循環(huán)多長時(shí)間運(yùn)行一次。

clock = pygame.time.Clock()
clock.tick(60)
#此處的60指示:這個(gè)循環(huán)應(yīng)當(dāng)每秒運(yùn)行 60 次。
每秒 60 個(gè)循環(huán)(或幀)時(shí),每個(gè)循環(huán)需要 1000 / 60 = 16.66 ms(大約 17 ms)。
如果循環(huán)中的代碼運(yùn)行時(shí)間超過 17 ms,在 clock 指出開始下一次循環(huán)時(shí)當(dāng)前循環(huán)將無法完成。

檢查幀速率

 clock.get_fps()    知道程序能以多快的速度運(yùn)行,檢查幀速率

調(diào)整幀速率

假設(shè)設(shè)置運(yùn)行 clock.tick(30),每秒39幀,但 clock.get_fps()檢測實(shí)際得到的速率為20fps,說明每個(gè)循環(huán)運(yùn)行的時(shí)間比預(yù)計(jì)的長,這樣達(dá)不到原來要的效果,需要調(diào)整幀速率。

以小球?yàn)槔瓉砻棵?0幀,可以將小球移動(dòng)比較遠(yuǎn),但是目前的代碼每秒只能運(yùn)行20幀,達(dá)不到預(yù)期的要求,需要在限有的時(shí)間內(nèi)到達(dá)移動(dòng)的距離,就需要更改小球移動(dòng)的速度。可以按期望幀頻率與實(shí)際幀速率的比值來增加

如果小球?qū)ο缶嚯x是10,期望的幀速率是30fps,程序?qū)嶋H運(yùn)行速率為20fps. 

object_speed = current_speed * (desired fps / actual fps)
object_speed = 10 * (30 / 20)
object_speed = 15

 沙灘球程序中使用 Clock 和 get_fps()

import sys, pygame
from random import *
class MyBallClass(pygame.sprite.Sprite):
    def __init__(self, image_file, location, speed):
        pygame.sprite.Sprite.__init__(self)        #初始化動(dòng)畫精靈
        self.image = pygame.image.load(image_file) #加載圖片
        self.rect = self.image.get_rect()          #得到定義圖像邊界矩形
        self.rect.left, self.rect.top = location   #設(shè)置球的初始位置
        self.speed = speed                         #創(chuàng)建一個(gè)速度
    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]
def animate(group):
    screen.fill([255, 255, 255])
    for ball in group:
        ball.move()
    for ball in group:
        group.remove(ball)      #從組刪除精靈
        #檢查精靈與組的碰撞
        if pygame.sprite.spritecollide(ball, group, False): 
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        group.add(ball)
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)
#設(shè)置窗口大小和顏色    
size = width, height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
img_file = "beach_ball.png"
clock = pygame.time.Clock()
group = pygame.sprite.Group()   #創(chuàng)建精靈組
#將球增加到列表
for row in range(0, 2):
    for column in range(0, 2):
        location = [column * 180 + 10, row * 180 + 10]
        speed = [choice([-4, 4]), choice([-4, 4])]     #讓每個(gè)球變得隨機(jī)性
        ball = MyBallClass(img_file, location, speed)
        group.add(ball)
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            frame_rate = clock.get_fps()
            print( "frame rate = ", frame_rate)   
    animate(group)   
    clock.tick(30)
pygame.quit()

到此這篇關(guān)于利用pygame完成動(dòng)畫精靈和碰撞檢測的文章就介紹到這了,希望對(duì)大家有幫助,更多相關(guān)pygame內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • pygame學(xué)習(xí)筆記(5):游戲精靈
  • pygame 精靈的行走及二段跳的實(shí)現(xiàn)方法(必看篇)
  • python使用pygame創(chuàng)建精靈Sprite
  • python飛機(jī)大戰(zhàn)pygame碰撞檢測實(shí)現(xiàn)方法分析
  • Python Pygame中精靈和碰撞檢測詳解

標(biāo)簽:陽泉 臨汾 雙鴨山 赤峰 貴州 金華 克拉瑪依 日照

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《利用pygame完成動(dòng)畫精靈和碰撞檢測》,本文關(guān)鍵詞  利用,pygame,完成,動(dòng)畫,精靈,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《利用pygame完成動(dòng)畫精靈和碰撞檢測》相關(guān)的同類信息!
  • 本頁收集關(guān)于利用pygame完成動(dòng)畫精靈和碰撞檢測的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品三级视频| 91亚洲男人天堂| 日韩电影在线观看一区| 成人听书哪个软件好| 欧美日韩亚洲另类| 精品少妇一区二区三区视频免付费 | 99re这里只有精品首页| 亚洲色图20p| 国产91精品在线观看| 久久99深爱久久99精品| 欧美日韩激情在线| 色哟哟国产精品免费观看| 国产精品123| 中文字幕中文字幕在线一区| 国产一区二区91| 国产欧美一区二区在线| 久久精品国产亚洲5555| 欧美电影一区二区| 亚洲综合激情小说| aaa欧美日韩| 国产精品日日摸夜夜摸av| 精品在线观看免费| 日韩欧美一区二区久久婷婷| 亚洲成人三级小说| 欧美日韩不卡在线| 国产色产综合色产在线视频| 在线视频欧美精品| 午夜视频在线观看一区二区三区| 日韩午夜小视频| av激情综合网| 亚洲小少妇裸体bbw| 欧美一区二区三区在线| 国产精品久久久久久久午夜片| 亚洲欧美日韩人成在线播放| 免费av成人在线| 色女孩综合影院| 2023国产一二三区日本精品2022| 另类综合日韩欧美亚洲| 精品国产sm最大网站| 精品一区二区三区日韩| 欧美一级欧美三级| 婷婷综合在线观看| 久久91精品国产91久久小草| 欧美日韩一区中文字幕| 成人免费精品视频| 亚洲精品中文字幕乱码三区| 亚洲色图.com| 日韩一区二区三区视频在线观看| 色诱视频网站一区| 色婷婷亚洲一区二区三区| 色综合天天性综合| 6080日韩午夜伦伦午夜伦| 欧美精品1区2区| 久久精品视频在线免费观看| 欧美人xxxx| 国产不卡在线一区| 国产尤物一区二区在线| 精品国产露脸精彩对白| 国产精品久久久久久久久快鸭 | 欧美色图激情小说| 狠狠狠色丁香婷婷综合久久五月| 韩国精品久久久| 欧美一区二区三区性视频| 五月激情综合网| 日韩美女主播在线视频一区二区三区| 亚洲国产精品综合小说图片区| 欧美欧美欧美欧美| 欧美一区二区大片| 亚洲图片欧美一区| 欧美一区二区日韩一区二区| 韩国精品免费视频| 综合欧美一区二区三区| 欧美三级韩国三级日本一级| 国产福利一区二区三区在线视频| 中文字幕一区免费在线观看| 另类综合日韩欧美亚洲| 亚洲欧美电影一区二区| 一区二区成人在线视频 | 粗大黑人巨茎大战欧美成人| 99re亚洲国产精品| 亚洲欧美激情视频在线观看一区二区三区 | 久久久亚洲国产美女国产盗摄 | 99久久国产综合精品女不卡| 欧美午夜不卡在线观看免费| 欧美日韩国产综合一区二区 | 九一久久久久久| 国内外成人在线视频| 欧美一区二区视频免费观看| 中文字幕在线一区| 亚洲欧美日韩一区二区 | 91福利视频久久久久| 国产不卡一区视频| 久久久久久免费网| 制服丝袜中文字幕亚洲| 免费成人美女在线观看.| 欧美丝袜丝nylons| 欧美伊人精品成人久久综合97| 欧美高清性hdvideosex| a级精品国产片在线观看| 亚洲国产精品黑人久久久 | 成人18视频日本| 亚洲国产精品v| 色婷婷精品久久二区二区蜜臂av| 国产精品一区专区| 亚洲国产精品久久艾草纯爱| 亚洲欧美另类久久久精品2019| 欧美va亚洲va香蕉在线| 欧美日韩精品三区| 欧美三区在线观看| 三级欧美在线一区| 一区二区三区 在线观看视频| 国产精品盗摄一区二区三区| 久久亚洲综合色| www精品美女久久久tv| 久久精品夜色噜噜亚洲a∨ | 亚洲成人黄色影院| 国产精品乱码人人做人人爱| 国产精品入口麻豆九色| 精品国免费一区二区三区| 久久99久久久久| 26uuu久久综合| 欧美亚洲愉拍一区二区| 国产日韩欧美一区二区三区综合| 国产午夜一区二区三区| 成人avav影音| 91网址在线看| 中文字幕综合网| 洋洋成人永久网站入口| 亚洲欧美综合色| 国产亚洲欧美一级| 91麻豆精品国产91| 欧美精品一卡二卡| 欧美亚洲国产bt| 色久优优欧美色久优优| 91色乱码一区二区三区| 欧美日韩电影在线播放| 欧美日本高清视频在线观看| k8久久久一区二区三区| 奇米888四色在线精品| 午夜伊人狠狠久久| 精品一区二区三区影院在线午夜 | 久久精品国产一区二区三| 久久亚洲春色中文字幕久久久| 国产情人综合久久777777| 欧美一二区视频| 亚洲精品成人天堂一二三| 色8久久人人97超碰香蕉987| 久久蜜桃av一区精品变态类天堂| 久久影院视频免费| 亚洲欧洲成人自拍| 亚洲福利一二三区| 日韩在线卡一卡二| 国产福利不卡视频| 国产午夜亚洲精品羞羞网站| 丁香另类激情小说| 不卡视频一二三四| 欧美一区二区三区免费大片| 日韩一区二区视频| 欧美成人欧美edvon| 亚洲欧洲制服丝袜| 久久狠狠亚洲综合| 日本韩国一区二区三区| 精品久久一区二区| 亚洲国产精品v| 日日欢夜夜爽一区| 色呦呦网站一区| 日韩三级中文字幕| 亚洲欧洲精品一区二区三区| 伦理电影国产精品| caoporn国产精品| 亚洲国产人成综合网站| 成人av网站大全| 亚洲v中文字幕| 视频一区在线播放| 色综合天天综合网国产成人综合天| 亚洲精品一区二区三区在线观看 | 成人欧美一区二区三区小说| 精品国产乱码久久久久久蜜臀| 一区二区三区欧美激情| 亚洲欧美怡红院| 免费观看在线色综合| 懂色av中文字幕一区二区三区| 韩日精品视频一区| 日韩一区二区三| 午夜精品久久久久影视| 视频一区在线播放| 懂色av一区二区在线播放| 美女视频一区在线观看| 综合中文字幕亚洲| 亚洲午夜精品一区二区三区他趣| 亚洲一区在线播放| 日本不卡一区二区三区高清视频| 欧美三级电影在线观看| 97se狠狠狠综合亚洲狠狠| 亚洲美女视频在线| 成人欧美一区二区三区视频网页 | 91社区在线播放| 精品蜜桃在线看| 亚洲一区二区三区在线看| 亚洲欧美综合另类在线卡通|