一、前言

準備編寫一個籃球遊戲,運動員帶球跑,跳起投籃。在每幀圖片中包括運動員和籃球,使用多幀圖片,實現運動員運球跑動的效果。

運動員運球跑動作每幀圖形的寬和高可能不同,例如,跨一大步,和兩腿併攏,其寬和高不可能相同。如果不考慮兩個角色的碰撞,所有幀圖形的寬和高取最大值,使所有幀寬和高相同,可採用將所有幀圖形放到一個大圖形中,實現動畫。

Pygame中兩個角色碰撞,實際上是圖形外矩形框的碰撞,即兩個矩形框重合,表示兩個角色發生碰撞。為了逼真,每個矩形框要儘量靠近內部圖形。因此無法保證每幀圖形的寬和高都相同。在這種情況下,必須把每幀圖形用列表儲存。

這個小遊戲運球只有4幀造型,用來完成帶球跑動的動畫,注意球也是造型的一部分。如下圖。造型採用火柴人,這是因為火柴人造型容易找到,自己畫一個也不難。4幀圖形背景都設定為透明。 

二、運動員帶球折返跑,遇到左右邊界反向返回。

執行效果圖:

僅拷貝源程式不能執行,要將上邊4幀造型截圖,並分割為4個png圖形檔案,然後使背景透明。根據圖形大小,在第11條語句中,將//6修改為適當值,使圖形大小合適,將檔案儲存到源程式所在資料夾下的子資料夾pic中。

import pygame, sys
bgcolor = pygame.Color('blue') #建立顏色
pygame.init()
size = width, height = 300,200
screen = pygame.display.set_mode(size) #建立指定大小遊戲視窗
pygame.display.set_caption("投手帶球往返跑") #設定視窗標題
images=[] #列表儲存運球所有幀圖形
for n in range(4):
p = pygame.image.load('pic/'+str(n+1)+'.png')
r=p.get_rect()
p = pygame.transform.scale(p, (r.width//6, r.height//6))#調整影象的大小
images.append(p)
fclock = pygame.time.Clock() #建立控制頻率的clock
fps = 4 #定義重新整理頻率
x=0 #blit方法第2個引數的x座標,y座標不變
frameNum=0 #幀號從0-3,初始為0,完成1幀,其值加1,到4,變0
direction=0 #=0,從左到右跑,=1,從右到左跑
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT: #處理退出事件
running = False
screen.fill(bgcolor) #設定背景的顏色
p=images[frameNum] #從列表得到當前幀的圖形
if direction==1: #=0,從左向右跑,=1,從右向左跑,圖形反向
p=pygame.transform.flip(p,True,False) #反向
screen.blit(p, (x, 70)) #在螢幕指定位置繪製圖形
frameNum+=1 #幀號從0-3,初始為0,完成1幀,其值加1,到4,變0
if frameNum==4:
frameNum=0
if direction==0: #=0,從左到右跑,x增加
x+=20
if x+80>width: #如到右邊界,從右向左跑
direction=1
else:
x-=20
if x<0:
direction=0
pygame.display.flip() #重新整理遊戲場景
fclock.tick(fps)#本幀中程式已運行了若干秒,為保證fps,該語句保證延遲餘下時間
pygame.quit()

三、增加了一個籃球場背景,並使運動員只能在球場內運

為了使程式邏輯清楚,程式碼易讀,將運球所有程式碼用類封裝。執行效果如下,可以看到,即使滑鼠移出籃球場,運動員不會移出籃球場。

執行效果圖: 

除了生成4幀造型檔案儲存到指定位置外,還要截圖下邊籃球場背景,儲存為檔案到源程式所在資料夾下的子資料夾pic中。籃球場背景圖片尺寸為800*600。

import pygame
class Player():
def __init__(self,screen):
self.screen=screen
self.images=[]
for n in range(4): #將4幀影象儲存到列表中
p = pygame.image.load('pic/'+str(n+1)+'.png') #檔名為1.png,2.png...
r=p.get_rect()
p = pygame.transform.scale(p, (r.width//6, r.height//6)) #調整影象的大小
self.images.append(p)
self.frameNum=0 #幀編號
self.x,self.y=0,0 #影象在窗體的座標
self.mouseX,self.mouseY=0,0 #滑鼠座標
def draw(self): #在遊戲視窗顯示指定幀圖形
p=self.images[self.frameNum] #得到指定幀圖形
if self.mouseX-self.x<0:
p=pygame.transform.flip(p,True,False)
self.x,self.y=self.mouseX,self.mouseY
if self.x<1: #4個if語句保證運動員在籃球場中
self.x=1
if self.x+90>width:
self.x=width-90
if self.y<230:
self.y=230
if self.y+120>height:
self.y=height-120
self.screen.blit(p, (self.x, self.y)) #在螢幕指定位置繪製圖形
self.frameNum+=1
if self.frameNum==4:
self.frameNum=0
bgcolor = pygame.Color('blue')
pygame.init()
size = width, height = 800,600 # 建立指定大小遊戲視窗
screen = pygame.display.set_mode(size) # 設定視窗標題
pygame.display.set_caption("投手跟隨滑鼠運球跑")
bg_img = pygame.image.load("pic/籃球場1.png").convert()
fclock = pygame.time.Clock() # 建立控制頻率的clock
fps = 4 # 定義重新整理頻率
player=Player(screen)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT: # 處理退出事件
running = False
if event.type == pygame.MOUSEMOTION:
player.mouseX,player.mouseY=event.pos
#screen.fill(bgcolor) # 設定背景的顏色
screen.blit(bg_img, (0, 0)) # 繪製背景
player.draw()
pygame.display.flip()# 重新整理遊戲場景
fclock.tick(fps)#本幀中程式已運行了若干秒,為保證fps,該語句保證延遲餘下時間
pygame.quit()

籃球場背景如下圖,其尺寸為800*600。

直接點選領取乾貨滿滿

②Python開發環境安裝教程

③Python400集自學視訊

④軟體開發常用詞彙

⑤Python學習路線圖

⑥3000多本Python電子書