溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是PyGame逐幀動畫

發(fā)布時間:2021-10-23 17:02:09 來源:億速云 閱讀:329 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“什么是PyGame逐幀動畫”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“什么是PyGame逐幀動畫”吧!

什么是逐幀動畫?

逐幀動畫,是一種動畫技術(shù),其原理即將每幀不同的圖像連續(xù)播放,從而產(chǎn)生動畫效果。

承接上一節(jié)的代碼

我們基于上一節(jié)的代碼來實現(xiàn)一個圓形來回運動的動畫效果。上一節(jié)的代碼如下

import pygame

pygame.init()

screen = pygame.display.set_mode((640, 480))     # 設(shè)置窗口的大小
# 創(chuàng)建一個surface,名字叫background,大小和screen一樣
background = pygame.Surface(screen.get_size())
# 用白色填充background;255,255,255是RGB的白色
background.fill((255, 255, 255))

mySurface = pygame.Surface((200, 200))  # 200 x 200 大小的surface
mySurface.set_colorkey((0, 0, 0))
pygame.draw.circle(mySurface, (0, 0, 255), (100, 100), 100)

background = background.convert()
screen.blit(background, (0, 0))

mySurface = mySurface.convert_alpha()
screen.blit(mySurface, (200, 200))


clock = pygame.time.Clock()     # 創(chuàng)建clock對象
FPS = 30                        # 定義幀率的上限,就是幀率的最大值

mainloop = True

while mainloop:
    clock.tick(FPS)                          # 設(shè)置最大幀率

    for event in pygame.event.get():         # 這一部分就是事件處理
        if event.type == pygame.QUIT:        # 如果按下右上角的叉叉
            mainloop = False                 # 退出主循環(huán)
        elif event.type == pygame.KEYDOWN:   # 如果按下了鍵盤
            if event.key == pygame.K_ESCAPE:  # 而且按下的還是ESC鍵
                mainloop = False             # 退出主循環(huán)

    # 在這里做一些游戲相關(guān)的運算,這里暫時省略
    text = "FPS: {0:.2f}".format(clock.get_fps())
    pygame.display.set_caption(text)

    pygame.display.flip()                    # 刷新顯示

pygame.quit()

實現(xiàn)原理和代碼

我們將要在主循環(huán)中不斷修改surface的坐標,從而實現(xiàn)移動的效果。還記得blit一個surface時,有個參數(shù)就是坐標嗎?

screen.blit(mySurface, (200, 200))

這里的(200, 200)就是坐標。

在第一次blit我們的mySurface時,我們將它的坐標設(shè)置為(0, 0),這樣它會顯示在左上角。

我們定義了mySurfaceX、mySurfaceY來保存當(dāng)前mySurface的坐標;定義了dx、dy來表示每次循環(huán)中mySurfaceX、mySurfaceY的增量。

在主循環(huán)中,修改mySurfaceX、mySurfaceY,然后mySurface被blit到(mySurfaceX, mySurfaceY)。

import pygame

pygame.init()

screen = pygame.display.set_mode((640, 480))     # 設(shè)置窗口的大小
# 創(chuàng)建一個surface,名字叫background,大小和screen一樣
background = pygame.Surface(screen.get_size())
# 用白色填充background;255,255,255是RGB的白色
background.fill((255, 255, 255))

mySurface = pygame.Surface((200, 200))  # 200 x 200 大小的surface
mySurface.set_colorkey((0, 0, 0))
pygame.draw.circle(mySurface, (0, 0, 255), (100, 100), 100)

background = background.convert()
screen.blit(background, (0, 0))

mySurface = mySurface.convert_alpha()

####################################################################
screen.blit(mySurface, (0, 0))

mySurfaceX = 0
mySurfaceY = 0
dx = 10
dy = 0
####################################################################

clock = pygame.time.Clock()     # 創(chuàng)建clock對象
FPS = 30                        # 定義幀率的上限,就是幀率的最大值

mainloop = True

while mainloop:
    clock.tick(FPS)                          # 設(shè)置最大幀率

    for event in pygame.event.get():         # 這一部分就是事件處理
        if event.type == pygame.QUIT:        # 如果按下右上角的叉叉
            mainloop = False                 # 退出主循環(huán)
        elif event.type == pygame.KEYDOWN:   # 如果按下了鍵盤
            if event.key == pygame.K_ESCAPE:  # 而且按下的還是ESC鍵
                mainloop = False             # 退出主循環(huán)

####################################################################
    mySurfaceX += dx
    mySurfaceY += dy

    if mySurfaceX + mySurface.get_rect().width > screen.get_rect().width:
        dx *= -1
    elif mySurfaceX < 0:
        dx *= -1
    else:
        pass

    screen.blit(background, (0, 0))  # !!!!!!!!!!!!!!!!!!!!!!!
    screen.blit(mySurface, (round(mySurfaceX, 0), round(mySurfaceY, 0)))
####################################################################

    text = "FPS: {0:.2f}".format(clock.get_fps())
    pygame.display.set_caption(text)

    pygame.display.flip()                    # 刷新顯示

pygame.quit()

運行這一段代碼,你將看到一個往復(fù)運動的圓形。請?zhí)貏e注意下面這一行代碼

screen.blit(background, (0, 0))  # !!!!!!!!!!!!!!!!!!!!!!!

如果你注釋掉這一行代碼,你將得到一個長條。這行代碼的作用相當(dāng)于“擦除”,它覆蓋掉了前面畫的東西。

到此,相信大家對“什么是PyGame逐幀動畫”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI