首先創建一個游戲視窗,然后再視窗內創建一個小球,以一定的速度移動小球,當小球碰到游戲視窗的邊緣時,小球彈回,繼續移動,可以按照如下步驟實作該功能,
(1)首先來創建一個游戲視窗,寬和高設定為640×480.代碼如下:
import sys #匯入sys模塊
import pygame #匯入pygame模塊
pygame.init() #初始化pygame
size=with,height=640,480 #設定視窗大小
screen=pygame.display.set_model(size) #顯示視窗
上述代碼中,首先匯入pygame模塊,該模塊在上一篇文章中介紹過,直接用pip命令安裝即可,然后呼叫init()方法初始化pygame模塊,接下來,設定視窗的寬和高,最后使用display模塊顯示表單,display模塊的常用方法如下:
| 方法名 | 功能 |
| pygame.display.init | 初始化init模塊 |
| pygame.display.quit | 結束display模塊 |
| pygame.display.get_init | 如果display模塊已經被初始化,則回傳true |
| pygame.display.set_mode | 初始化一個準備顯示的界面 |
| pygame.display.get_surface | 獲取當前的surface物件 |
| pygame.display.flip | 更新整個待顯示的surface物件到螢屏上 |
| pygame.display.update | 更新部分內容顯示到螢屏上,如果沒有引數則與flip功能相同 |
(2)當我們運行上述代碼時,會出現一個一閃而過的視窗,這是因為程式執行完畢后會自動關閉,如果讓視窗一直顯示,需要使用while true回圈讓程式一直執行,此外,還需要設定關閉按鈕,如果不設定關閉按鈕,雖然在界面會顯示紅叉關閉按鈕,但點擊后就會出現程式無回應的錯誤,然后強制關閉了程式,
在pycharm演示如下
代碼:

運行:
點擊紅叉就會關閉視窗,
上述代碼中,添加了輪詢時間監測,pygame.event.get()能夠獲取事件佇列,使用for in遍歷事件,然后根據type屬性判斷事件型別,這里的事件處理方式與GUI類似,如event.type等于pygame.QUIT表示檢測到關閉pygame視窗事件,pygame.KEYDOWN表示鍵盤按下事件,pygame.MOUSEBUTTONDOWN表示滑鼠按下事件等,
(3)在視窗中添加小球,我們先準備一張ball.png圖片,然后加載圖片,最后將圖片顯示在視窗中,在pycharm中演示如下,
代碼:

運行:

上述代碼中,使用image模塊的load方法加載圖片,回傳值ball是一個surface物件,surface是用來代表圖片的pygame物件,可以對一個surface物件進行涂畫、變形、復制等各種操作,事實上,螢屏也只是一個surface,pygame.display.set_mode就回傳了一個螢屏surface物件,如果將ball這個surface物件畫到screen surface物件,需要使用blit()方法,最后使用display方法更新整個待顯示的surface物件到螢屏上,surface物件常用方法如下:
| 方法名 | 功能 |
| pygame.Surface.blit | 將一個影像畫到另一個影像上 |
| pygame.Surface.convert | 轉換影像的像素格式 |
| pygame.Surface.convert_alpha | 轉換影像的像素格式,包含alpha通道的轉換 |
| pygame.Surface.fill | 使用顏色填充surface |
| pygame.Surface.get_rect | 獲取surface的矩形區域 |
(4)上面的小球是靜止的,下面我們該讓小球動起來了,ball.get_rect()方法回傳值ballrect是一個rec物件,該物件有一個move()方法可以用于移動矩形,move(x,y)函式有兩個引數,第一個引數是x軸移動的距離,第二個引數是y軸移動的距離,表單左上角坐標為(0,0),
為了實作小球不停地移動,將move()函式添加到while回圈內,具體代碼如下:

我們在原代碼的基礎上加上了這兩行代碼,運行后卻發現小球一閃而過,但小球并沒有真正的笑死,而是移動到表單之外,此時需要添加碰撞監測的功能,當小球與表單的任意邊緣發生碰撞,則更改小球的移動方向,
代碼如下:
在原有代碼中添加上面的碰撞判斷代碼,運行如下

小球在界面飛速運動,然后我們需要控制小球移動的速度,首先介紹一下上面的代碼,上面代碼中,添加了碰撞監測功能,如果碰到左右邊緣,這則更改x軸資料為負數;如果碰到上下邊緣,則更改y軸資料為負數,
那么我們怎樣控制小球移動的速度呢?這時我們需要添加一個“時鐘”來控制程式運行的時間,這時就需要使用pygame的time模塊,使用pygame時鐘之前,必須先創建clock物件的一個實體,然后再while回圈中設定多長時間運行一次,代碼如下【也就是最終代碼,由于運動效果無法展示,各位還是自行運行查看效果^_^】:
# -*- coding:utf-8 -*-
import sys # 匯入sys模塊
import pygame # 匯入pygame模塊
pygame.init() # 初始化pygame
size = width, height = 640, 480 # 設定視窗
screen = pygame.display.set_mode(size) # 顯示視窗
color = (0, 0, 0) # 設定顏色
ball = pygame.image.load("ball.png") # 加載圖片
ballrect = ball.get_rect() # 獲取矩形區域
speed = [5, 5] # 設定移動的X軸、Y軸距離
clock = pygame.time.Clock() # 設定時鐘
# 執行死回圈,確保視窗一直顯示
while True:
clock.tick(60) # 每秒執行60次
# 檢查事件
for event in pygame.event.get():
if event.type == pygame.QUIT: # 如果點擊關閉視窗,則退出
sys.exit()
ballrect = ballrect.move(speed) # 移動小球
# 碰到左右邊緣
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
# 碰到上下邊緣
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(color) # 填充顏色
screen.blit(ball, ballrect) # 將圖片畫到視窗上
pygame.display.flip() # 更新全部顯示
pygame.quit() # 退出pygame
上述代碼中在上面代碼中添加了:
clock=pygame.time.Clock() #設定時鐘
以及回圈中的
clock.tick(60) #每秒執行60次
這樣我們再次運行就會出現小球緩慢移動并碰撞邊緣改變方向的效果了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293827.html
標籤:其他
