Pygame淺析動畫精靈和碰撞檢測實現(xiàn)方法
1、復(fù)習(xí)上節(jié)課做的一個簡單的動畫:
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)
這個程序可以在整個窗口中進行小球動畫的演示
2、將之整理成用類來抽象出球及相應(yīng)運動
現(xiàn)在我們將這里面的小球提取出來,將之包裝成一個類,將小球的移動用一個函數(shù)move來表達,
那么這個小球首先會有變量image,就是從物理圖片中加載入內(nèi)存的變量,然后應(yīng)該有一個大小size,還有一個位置point,這兩個可以合并為rect(x, y, width, height),還有一個表示左右移動的速度和上下移動的速度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
移動的邏輯是:每次移動speed的距離(speed指的是向橫移動x,向縱移動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]
這樣,我們就完成了球的定義和移動的邏輯
下面我們再來進行小球動畫跑起來:
1)恢復(fù)背景
2)移動球并更新位置
3)在新位置上畫出球
4)將球打印到屏幕上
5)延時恰當(dāng)?shù)臅r間
代碼如下:
def run(ball): screen.fill([255, 255, 255]) 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) 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、利用前面抽象出來對象同時動畫9個小球:
需改動的代碼:
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利用動畫精靈類進行碰撞檢測:
動畫精靈的基本屬性:
1)圖像
2)矩形區(qū)
讓球類繼承于動畫精靈類,就可以使用spritecollide進行碰撞檢測
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)
說明:由于這兒的碰撞檢測是檢的矩形,所以看到有些沒有實際碰到也發(fā)生了檢測
最后附上課堂上改進后的全部代碼:
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淺析動畫精靈和碰撞檢測實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Pygame動畫精靈和碰撞檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Keras預(yù)訓(xùn)練模型ResNet50進行圖像分類方式
這篇文章主要介紹了使用Keras預(yù)訓(xùn)練模型ResNet50進行圖像分類方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05如何用scheduler實現(xiàn)learning-rate學(xué)習(xí)率動態(tài)變化
這篇文章主要介紹了如何用scheduler實現(xiàn)learning-rate學(xué)習(xí)率動態(tài)變化問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09