Pygame淺析動(dòng)畫精靈和碰撞檢測實(shí)現(xiàn)方法
1、復(fù)習(xí)上節(jié)課做的一個(gè)簡單的動(dòng)畫:
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)畫的演示
2、將之整理成用類來抽象出球及相應(yīng)運(yùn)動(dòng)
現(xiàn)在我們將這里面的小球提取出來,將之包裝成一個(gè)類,將小球的移動(dòng)用一個(gè)函數(shù)move來表達(dá),
那么這個(gè)小球首先會有變量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)的邏輯
下面我們再來進(jìn)行小球動(dòng)畫跑起來:
1)恢復(fù)背景
2)移動(dòng)球并更新位置
3)在新位置上畫出球
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)行起來
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、利用前面抽象出來對象同時(shí)動(dòng)畫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)畫精靈類進(jìn)行碰撞檢測:
動(dòng)畫精靈的基本屬性:
1)圖像
2)矩形區(qū)
讓球類繼承于動(dòng)畫精靈類,就可以使用spritecollide進(jìn)行碰撞檢測
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)說明:由于這兒的碰撞檢測是檢的矩形,所以看到有些沒有實(shí)際碰到也發(fā)生了檢測
最后附上課堂上改進(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)畫精靈和碰撞檢測實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Pygame動(dòng)畫精靈和碰撞檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 內(nèi)置函數(shù)之隨機(jī)函數(shù)詳情
這篇文章主要介紹了Python 內(nèi)置函數(shù)之隨機(jī)函數(shù),文章將圍繞Python 內(nèi)置函數(shù)、隨機(jī)函數(shù)的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助2021-11-11
python基于爬蟲+django,打造個(gè)性化API接口
Python2比較當(dāng)前圖片跟圖庫哪個(gè)圖片相似的方法示例
使用Python進(jìn)行中文繁簡轉(zhuǎn)換的實(shí)現(xiàn)代碼

