「閱讀本文大概需要6分鐘」
前面我們講了一個小實戰,接下來呢,我們來繼續把這個彈球小實戰寫完。上一篇連結:05-pygame彈球遊戲(上) 接下來,我們來完成接杆的代碼。
可以加我微信,加入交流群哦。有時間的情況下,我都會在群裡答疑。
接杆創建接杆,同樣是將接杆作為一個類來進行創建,規定它的大小顏色以及矩形選框,並且獲取矩形的左側與頂部位置。
class Mybraclass(pygame.sprite.Sprite):
def __init__(self, location):
pygame.sprite.Sprite.__init__(self)
# 控制接杆的大小
image_surface = pygame.Surface([100, 20])
# 接杆顏色
image_surface.fill([213, 213, 213])
self.image = image_surface.convert()
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = location實例化接杆對象,並顯示到屏幕。
# 循環外面
mybar = Mybraclass([270, 600])
# 循環裡面
screen.blit(mybar.image, mybar.rect)讓接杆移動起來,要跟隨滑鼠移動,這裡用到了滑鼠事件中的 MOUSEMOTION ,然後進行碰撞檢測。在寫碰撞檢測之前,有時候需要將進行碰撞檢測放到一個組裡面,當某個元素與組內元素發生碰撞時,則進行速度取反。
# 將我的球類放入組中
ballgroup = pygame.sprite.Group(myball)
# 寫在循環中
# 當滑鼠滑過時將新建一個滑鼠划過的事件並賦值給接杆的中心點
if event.type == pygame.MOUSEMOTION:
mybar.rect.centerx = event.pos[0]
# 小球與接杆的碰撞檢測
if pygame.sprite.spritecollide(mybar, ballgroup, False):
myball.speed[1] = -myball.speed[1]幀率、積分變量和分數顯示。
clock = pygame.time.Clock()
ball_speed = [4, -4]
score = 0# 小球與接杆的碰撞檢測
if pygame.sprite.spritecollide(mybar, ballgroup, False):
myball.speed[1] = -myball.speed[1]
time = time + 1
score = score + 10
clock.tick(time)
screen.fill([255, 255, 255])
font = pygame.font.SysFont('', 20)
text_surface = font.render(u"score:" + str(score), True, (0, 0, 255))
screen.blit(text_surface, (32, 24))上面的代碼,多有碎片化,接下來我就把完整的代碼放出來:
import sys
import pygame
from pygame.locals import *
# 創建球類
class Myballclass(pygame.sprite.Sprite):
# 給出圖矩形速度並給定對應的值
def __init__(self, image_file, speed, location):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image_file)
self.image = pygame.transform.smoothscale(self.image, (80, 70))
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = location
self.speed = speed
# 球的移動
def ball_move(self):
self.rect = self.rect.move(self.speed)
# 控制小球在遊戲界面內
if self.rect.left < 0 or self.rect.right > screen.get_width():
self.speed[0] = -self.speed[0]
if self.rect.top <= 0:
self.speed[1] = -self.speed[1]
# 遊戲結束
def over(self):
self.rect = self.rect.move(self.speed)
# 當小球底部大於界面高度時判定遊戲結束
if self.rect.bottom > screen.get_height():
# SysFount 從系統字體中創建一個font對象(字體樣式, 大小)
font = pygame.font.SysFont('宋體', 40)
# render 在新的surface上繪製文本(文本, 抗鋸齒, 顏色, 背景)
text_surface = font.render(u"Game Over", True, (0, 0, 255))
screen.blit(text_surface, (screen.get_width() // 2, screen.get_height() // 2))
return 0
class Mybraclass(pygame.sprite.Sprite):
def __init__(self, location):
pygame.sprite.Sprite.__init__(self)
# 控制接杆的大小
image_surface = pygame.Surface([100, 20])
# 接杆顏色
image_surface.fill([213, 213, 213])
self.image = image_surface.convert()
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = location
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode([800, 700])
clock = pygame.time.Clock()
ball_speed = [4, -4]
score = 0
# 球類給定值
myball = Myballclass(r'football.png', ball_speed, [10, 20])
mybar = Mybraclass([270, 600])
# 將我的球類放入組中
ballgroup = pygame.sprite.Group(myball)
# # 刷新時間
time = 30
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 當滑鼠滑過時將新建一個滑鼠划過的事件並賦值給接杆的中心點
if event.type == pygame.MOUSEMOTION:
mybar.rect.centerx = event.pos[0]
# 小球與接杆的碰撞檢測
if pygame.sprite.spritecollide(mybar, ballgroup, False):
myball.speed[1] = -myball.speed[1]
time = time + 1
score = score + 10
clock.tick(time)
screen.fill([255, 255, 255])
font = pygame.font.SysFont('', 20)
text_surface = font.render(u"score:" + str(score), True, (0, 0, 255))
screen.blit(text_surface, (32, 24))
myball.ball_move()
myball.over()
screen.blit(myball.image, myball.rect)
screen.blit(mybar.image, mybar.rect)
pygame.display.flip()AI悅創·推出輔導班啦,包括「Python 語言輔導班、C++輔導班、算法/數據結構輔導班、少兒編程、pygame 遊戲開發」,全部都是一對一教學:一對一輔導 + 一對一答疑 + 布置作業 + 項目實踐等。QQ、微信在線,隨時響應!V:Jiabcdefh