亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 利用pygame完成動畫精靈和碰撞檢測

利用pygame完成動畫精靈和碰撞檢測

熱門標簽:房產電銷外呼系統 地圖制圖標注位置改變是移位嗎 蓋州市地圖標注 上海機器人外呼系統哪家好 地圖標注微信發送位置不顯示 浙江電銷卡外呼系統好用嗎 南京銷售外呼系統軟件 315電話機器人廣告 地圖標注的意義點

動畫精靈和碰撞檢測

一、動畫精靈

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

具備特征:

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

①、一堆沙灘球都反彈

Pygame 的 sprite 模塊提供了一個動畫精靈基類Sprite,基于pygame.sprite.Sprite 來創建自己的子類。

這里用了常規的python列表

import sys, pygame
class MyBallClass(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   #設置球的初始位置
#設置窗口大小和顏色    
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()
 

顯示效果:

②、讓小球動起來

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]
###
其中 self.speed告訴對象要移動多遠,包含2個列表。
import sys, pygame
from random import *
class MyBallClass(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 = location   #設置球的初始位置
        self.speed = speed                         #創建一個速度
    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]
#設置窗口大小和顏色    
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])]     #讓每個球變得隨機性
        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
    #這里不是單獨擦除(覆蓋各個球),直接用白色填充窗口,重新繪制
    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()

二、碰撞檢測

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

Pygame 中已經內置有這種碰撞檢測。

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

動畫精靈模塊的spritecollide()函數用來檢測某個精靈是否與制定組的其他精靈發生碰撞,

這個函數的形式如下:

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

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

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

答:如果開始時沒有從組中刪除這個精靈,spritecollide() 會檢測到這個精靈與它自身發生了碰撞,因為它也在這個組中

import sys, pygame
from random import *
class MyBallClass(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 = location   #設置球的初始位置
        self.speed = speed                         #創建一個速度
    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)
#設置窗口大小和顏色    
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()   #創建精靈組
#將球增加到列表
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])]     #讓每個球變得隨機性
        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
    #這里不是單獨擦除(覆蓋各個球),直接用白色填充窗口,重新繪制
    pygame.time.delay(20)
    screen.fill([255, 255, 255])
    animate(group)   
pygame.quit()

上述代碼存在問題:

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

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

修改animate函數()
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)

矩形碰撞與像素完美結合

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

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

三、統計時間

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

pygame.time.delay(50)

在計算機圖形學中,每個動畫步叫做一幀,游戲程序員討論圖形更新的快慢時都會提到幀速率(每秒幀數,fps)

問:要怎么控制未知代碼運行時間?

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

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

并不是向每個循環增加一個延遲,  pygame.time.Clock() 會控制每個循環多長時間運行一次。

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

檢查幀速率

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

調整幀速率

假設設置運行 clock.tick(30),每秒39幀,但 clock.get_fps()檢測實際得到的速率為20fps,說明每個循環運行的時間比預計的長,這樣達不到原來要的效果,需要調整幀速率。

以小球為例,原來每秒30幀,可以將小球移動比較遠,但是目前的代碼每秒只能運行20幀,達不到預期的要求,需要在限有的時間內到達移動的距離,就需要更改小球移動的速度。可以按期望幀頻率與實際幀速率的比值來增加

如果小球對象距離是10,期望的幀速率是30fps,程序實際運行速率為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)        #初始化動畫精靈
        self.image = pygame.image.load(image_file) #加載圖片
        self.rect = self.image.get_rect()          #得到定義圖像邊界矩形
        self.rect.left, self.rect.top = location   #設置球的初始位置
        self.speed = speed                         #創建一個速度
    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)
#設置窗口大小和顏色    
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()   #創建精靈組
#將球增加到列表
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])]     #讓每個球變得隨機性
        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()

到此這篇關于利用pygame完成動畫精靈和碰撞檢測的文章就介紹到這了,希望對大家有幫助,更多相關pygame內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持腳本之家!

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

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

巨人網絡通訊聲明:本文標題《利用pygame完成動畫精靈和碰撞檢測》,本文關鍵詞  利用,pygame,完成,動畫,精靈,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《利用pygame完成動畫精靈和碰撞檢測》相關的同類信息!
  • 本頁收集關于利用pygame完成動畫精靈和碰撞檢測的相關信息資訊供網民參考!
  • 推薦文章
    人人干人人插| 精品在线免费播放| 精品久久久久久影院免费| 97视频免费在线观看| 日本乱中文字幕系列| 九九干| 亚洲天堂一区二区三区四区| 欧美1区| 天天做日日爱| 色综合久久天天综合绕观看| 可以在线看黄的网站| 色综合久久手机在线| 久久久久久久网| 久久久久久久网| 国产福利免费视频| 九九热精品免费观看| 国产伦精品一区二区三区无广告| 欧美一级视频免费观看| 国产伦久视频免费观看视频| 欧美另类videosbestsex| 一级毛片视频免费| 国产a免费观看| 在线观看成人网 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 午夜家庭影院| 可以免费看毛片的网站| 精品国产一区二区三区免费| 精品国产三级a| 青草国产在线观看| 日本在线不卡视频| 色综合久久久久综合体桃花网| 午夜欧美成人久久久久久| 亚洲www美色| 一级女性大黄生活片免费| 欧美一级视频免费| 麻豆午夜视频| 精品视频在线观看一区二区| 91麻豆tv| 四虎影视久久| 国产成人女人在线视频观看| 九九免费高清在线观看视频| 999久久狠狠免费精品| 久久成人亚洲| 亚洲精品影院一区二区| 亚洲精品中文字幕久久久久久| 天天色色网| 天天色色网| 欧美一级视频免费| 国产一区二区精品| 亚洲女人国产香蕉久久精品| 999精品视频在线| 国产福利免费观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产麻豆精品免费密入口 | 91麻豆国产级在线| 日本伦理网站| 精品视频在线观看一区二区三区| 高清一级做a爱过程不卡视频| a级精品九九九大片免费看| 久久国产精品自由自在| 成人a大片高清在线观看| 日本特黄特黄aaaaa大片| 香蕉视频三级| 精品视频一区二区三区免费| 天天色色网| 欧美日本韩国| 美女免费精品高清毛片在线视| 日韩av片免费播放| 九九久久99综合一区二区| 亚洲天堂一区二区三区四区| 尤物视频网站在线| 欧美国产日韩在线| 99热精品一区| 在线观看成人网 | 国产麻豆精品hdvideoss| 日韩一级精品视频在线观看| 中文字幕一区二区三区 精品| 黄色免费网站在线| 亚洲天堂免费| 国产一区二区精品| 国产国语对白一级毛片| 欧美一级视| 国产一区二区高清视频| 国产视频久久久久| 国产一区二区精品久久| 国产高清视频免费观看| 99久久网站| 九九精品影院| 日韩字幕在线| 亚欧视频在线| 香蕉视频久久| 日韩免费在线观看视频| 成人免费网站视频ww| 你懂的在线观看视频| 国产成人精品综合| 一级片片| 四虎影视库国产精品一区| 麻豆午夜视频| 一级女人毛片人一女人| 精品久久久久久中文| 国产91丝袜在线播放0| 四虎影视久久久免费| 香蕉视频亚洲一级| 黄色免费三级| 99久久精品费精品国产一区二区| 在线观看成人网 | 精品视频在线观看视频免费视频| 欧美激情在线精品video| 成人免费一级纶理片| 亚洲 欧美 91| 黄视频网站在线免费观看| 亚洲天堂在线播放| 青草国产在线| 精品国产香蕉在线播出| 亚飞与亚基在线观看| 台湾美女古装一级毛片| 精品久久久久久影院免费| 久久国产一久久高清| 国产高清在线精品一区二区| 久久99这里只有精品国产| 日韩一级黄色片| 久久精品店| 可以免费看污视频的网站| 黄视频网站在线免费观看| 精品视频在线观看免费| 九九精品久久| 成人免费网站久久久| 毛片的网站| 香蕉视频久久| 久久精品大片| 欧美激情中文字幕一区二区| 成人影视在线播放| 国产一区免费观看| 日韩中文字幕在线观看视频| 欧美爱色| 国产成人精品影视| 国产国产人免费视频成69堂| 色综合久久手机在线| 日日夜人人澡人人澡人人看免| 天天色成人| 免费一级片网站| 成人高清视频在线观看| 亚洲精品影院久久久久久| 精品国产一区二区三区久久久蜜臀| 毛片高清| 中文字幕97| 九九久久国产精品| a级精品九九九大片免费看| 成人免费网站视频ww| 国产91素人搭讪系列天堂| 精品久久久久久中文字幕2017| 久久99青青久久99久久| 你懂的福利视频| 国产福利免费观看| 国产成人精品一区二区视频| 午夜欧美福利| 国产伦久视频免费观看 视频 | 国产视频久久久久| 青青久久精品| 麻豆系列国产剧在线观看| 日韩av成人| 91麻豆精品国产自产在线观看一区| 免费一级片在线观看| 亚飞与亚基在线观看| 国产美女在线一区二区三区| 一级女性全黄生活片免费| 国产不卡精品一区二区三区| 香蕉视频亚洲一级| 午夜激情视频在线观看| 黄色免费网站在线| 午夜激情视频在线播放| 欧美激情一区二区三区在线| 国产极品精频在线观看| 国产91丝袜在线播放0| 国产极品精频在线观看| 你懂的日韩| 精品国产一区二区三区久久久蜜臀| 欧美一区二区三区性| 久久久久久久免费视频| 黄视频网站在线免费观看| 可以在线看黄的网站| 成人a大片在线观看| 精品国产一区二区三区久久久狼 | 精品视频一区二区三区免费| 夜夜操网| 午夜欧美成人久久久久久| 欧美爱爱动态| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产一区二区精品| 成人影院久久久久久影院| 亚飞与亚基在线观看| 97视频免费在线| 一级女性全黄生活片免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 午夜在线亚洲男人午在线| a级毛片免费全部播放| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产一区二区精品在线观看| 国产精品自拍亚洲| 999精品视频在线|