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

Pygame淺析動(dòng)畫(huà)精靈和碰撞檢測(cè)實(shí)現(xiàn)方法

 更新時(shí)間:2023年01月17日 09:09:30   作者:永遠(yuǎn)的麥田  
這篇文章主要介紹了利用pygame完成動(dòng)畫(huà)精靈和碰撞檢測(cè),代碼詳細(xì),內(nèi)容豐富,對(duì)于想要學(xué)習(xí)pygame的朋友來(lái)講是一個(gè)不錯(cuò)的練習(xí),需要的朋友可以參考下

1、復(fù)習(xí)上節(jié)課做的一個(gè)簡(jiǎn)單的動(dòng)畫(huà):

import sys
import pygame
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
ball = pygame.image.load("beach_ball.png")
x = 0
y = 100
speed = 50
yspeed = 50
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit(0)
    pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90])
    x += speed
    y += yspeed
    if x + 90 > 640:
        speed = -speed
    if x < 0:
        speed = -speed
    if y + 90 > 480:
        yspeed = -yspeed
    if y < 0:
        yspeed = -yspeed
    screen.blit(ball, [x, y])
    pygame.display.flip()
    pygame.time.delay(100)

這個(gè)程序可以在整個(gè)窗口中進(jìn)行小球動(dòng)畫(huà)的演示

2、將之整理成用類來(lái)抽象出球及相應(yīng)運(yùn)動(dòng)

現(xiàn)在我們將這里面的小球提取出來(lái),將之包裝成一個(gè)類,將小球的移動(dòng)用一個(gè)函數(shù)move來(lái)表達(dá),

那么這個(gè)小球首先會(huì)有變量image,就是從物理圖片中加載入內(nèi)存的變量,然后應(yīng)該有一個(gè)大小size,還有一個(gè)位置point,這兩個(gè)可以合并為rect(x, y, width, height),還有一個(gè)表示左右移動(dòng)的速度和上下移動(dòng)的速度speed[x,y]

代碼如下:

import pygame
class MyBall:
    def __init__(self, image_file, point, speed):
        self.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = point
        self.speed = speed

移動(dòng)的邏輯是:每次移動(dòng)speed的距離(speed指的是向橫移動(dòng)x,向縱移動(dòng)y)并更新rect,若到最左邊或是最右邊,則speed的x方向取反,若到最上邊或最下邊,speed的y方向取反

代碼如下:

size = width, height = 640, 480
    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]

這樣,我們就完成了球的定義和移動(dòng)的邏輯

下面我們?cè)賮?lái)進(jìn)行小球動(dòng)畫(huà)跑起來(lái):

1)恢復(fù)背景

2)移動(dòng)球并更新位置

3)在新位置上畫(huà)出球

4)將球打印到屏幕上

5)延時(shí)恰當(dāng)?shù)臅r(shí)間

代碼如下:

def run(ball):
    screen.fill([255, 255, 255])
    ball.move()
    screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)

然后我們將這個(gè)類運(yùn)行起來(lái)

size = width, height = 640, 480
screen = pygame.display.set_mode(size)
image_file = "beach_ball.png"
ball = MyBall(image_file, width/2, height/2, [2, 2])
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
    run(ball)

3、利用前面抽象出來(lái)對(duì)象同時(shí)動(dòng)畫(huà)9個(gè)小球:

需改動(dòng)的代碼:

def run(balls):
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
        screen.blit(ball.image, ball.rect)
    pygame.display.flip()
    pygame.time.delay(20)
balls = []
for row in range(3):
    for column in range(3):
        ball = MyBall(image_file, [180*row+10, 180*column+10], [2, 2])
        balls.append(ball)

4利用動(dòng)畫(huà)精靈類進(jìn)行碰撞檢測(cè):

動(dòng)畫(huà)精靈的基本屬性:

1)圖像

2)矩形區(qū)

讓球類繼承于動(dòng)畫(huà)精靈類,就可以使用spritecollide進(jìn)行碰撞檢測(cè)

class MyBall(pygame.sprite.Sprite):
    def __init__(self, image_file, point, speed):
        pygame.sprite.Sprite.__init__(self)
def run(balls):
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
        screen.blit(ball.image, ball.rect)
    for ball in balls:
        balls.remove(ball)
        if pygame.sprite.spritecollide(ball, balls, False):
            ball.speed[0] = -ball.speed[0]
            ball.speed[1] = -ball.speed[1]
        balls.append(ball)
    pygame.display.flip()
    pygame.time.delay(20)

說(shuō)明:由于這兒的碰撞檢測(cè)是檢的矩形,所以看到有些沒(méi)有實(shí)際碰到也發(fā)生了檢測(cè)

最后附上課堂上改進(jìn)后的全部代碼:

import pygame, sys
class MyBall(pygame.sprite.Sprite):
    def __init__(self, point, speed):
        pygame.sprite.Sprite.__init__(self) #####
        self.image = pygame.image.load("beach_ball.png")
        self.rect = self.image.get_rect()
        self.rect.left = point[0]
        self.rect.top = point[1]
        self.speed = speed
    def move(self):
        self.rect = self.rect.move(self.speed)
        if self.rect.right > width or self.rect.left < 0:
            self.speed[0] = -self.speed[0]
        if self.rect.bottom > height or self.rect.top < 0:
            self.speed[1] = -self.speed[1]
        screen.blit(self.image, self.rect)  # 顯示
    def peng(self, balls):
        balls.remove(self)
        if pygame.sprite.spritecollide(self, balls, False):
            self.speed[0] = -self.speed[0]
            self.speed[1] = -self.speed[1]
        balls.append(self)
pygame.init()
size = width,height = 640, 480
screen = pygame.display.set_mode(size)
screen.fill([255, 255, 255])
balls = []
for row in range(3):
    for col in range(3):
        speed = [2, 2]
        point = [row * 180 + 10, col * 180 + 10]
        ball = MyBall(point, speed)
        balls.append(ball)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    screen.fill([255, 255, 255])
    for ball in balls:
        ball.move()
    for ball in balls:
        ball.peng(balls)
    pygame.display.flip()
    pygame.time.delay(50)

到此這篇關(guān)于Pygame淺析動(dòng)畫(huà)精靈和碰撞檢測(cè)實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Pygame動(dòng)畫(huà)精靈和碰撞檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python基于爬蟲(chóng)+django,打造個(gè)性化API接口

    python基于爬蟲(chóng)+django,打造個(gè)性化API接口

    這篇文章主要介紹了python基于爬蟲(chóng)+django,打造個(gè)性化API接口的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python2比較當(dāng)前圖片跟圖庫(kù)哪個(gè)圖片相似的方法示例

    Python2比較當(dāng)前圖片跟圖庫(kù)哪個(gè)圖片相似的方法示例

    這篇文章主要介紹了Python2比較當(dāng)前圖片跟圖庫(kù)哪個(gè)圖片相似的方法,結(jié)合實(shí)例形式分析了Python文件目錄操作及圖形運(yùn)算相關(guān)使用技巧,需要的朋友可以參考下
    2019-09-09
  • 基于Python編寫(xiě)一個(gè)ISBN查詢工具

    基于Python編寫(xiě)一個(gè)ISBN查詢工具

    這篇文章主要為大家詳細(xì)介紹了如何利用Python編寫(xiě)一個(gè)簡(jiǎn)單的ISBN查詢工具,可以用于圖書(shū)管理、圖書(shū)銷售、圖書(shū)收集和閱讀等場(chǎng)景,需要的可以參考一下
    2023-05-05
  • 使用Python進(jìn)行中文繁簡(jiǎn)轉(zhuǎn)換的實(shí)現(xiàn)代碼

    使用Python進(jìn)行中文繁簡(jiǎn)轉(zhuǎn)換的實(shí)現(xiàn)代碼

    這篇文章主要介紹了使用Python進(jìn)行中文繁簡(jiǎn)轉(zhuǎn)換的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 最新評(píng)論

    青川县| 弥渡县| 大新县| 台南市| 特克斯县| 滦平县| 通海县| 吉林省| 房山区| 上犹县| 汉阴县| 安阳市| 泾源县| 阳城县| 青田县| 济宁市| 云浮市| 东安县| 巴中市| 迁安市| 奉新县| 抚顺县| 巴林右旗| 黑山县| 新和县| 彰化市| 汪清县| 海门市| 乐业县| 淄博市| 梨树县| 阿坝| 耒阳市| 峡江县| 黑河市| 塘沽区| 宝清县| 图片| 滁州市| 正宁县| 青冈县|