13-5 抓球:创建一个游戏,在屏幕底端放置一个左右移动的角色。让一个球出现在屏幕顶端,而且水平位置是随机的,并让这个球以固定的速度下落。如果角色与球发生碰撞(表示球抓住了),就让球消失。每当角色抓住球或球因抵达屏幕底端而消失后,都创建一个新球。
注:因为从头到尾只有人和球两个实例,因此本程序没有创建一个新球,而是直接改变球的坐标。
主程序:game
import pygame
from settings import Settings
import func as f
from player import Player
from ball import Ball
from pygame.sprite import Group
def run_game():
pygame.init()
settings = Settings()
screen = pygame.display.set_mode((settings.screen_width, settings.screen_height))
player = Player(settings, screen)
ball = Ball(settings, screen)
count = 0
while True:
f.check_events(player)
check = f.check_cross(screen, player, ball)
if check:
count += 1
print("你已经接住" + str(count) + "个球啦!再接再厉吧!")
elif check == False:
print("没接住,继续加油吧。")
f.update_screen(settings, screen, player, ball)
run_game()
Ball类:
import pygame
from random import randint
from pygame.sprite import Sprite
class Ball():
def __init__(self, settings, screen):
self.screen = screen
self.settings = settings
self.image = pygame.image.load('ball.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.x = randint(self.rect.x, (self.screen_rect.width - self.rect.x))
def blitme(self):
self.screen.blit(self.image, self.rect)
def update(self):
self.rect.y += self.settings.ball_speed
Player类:
import pygame
class Player():
def __init__(self, settings, screen):
self.screen = screen
self.settings = settings
self.image = pygame.image.load('player.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
self.moving_right = False
self.moving_left = False
def blitme(self):
self.screen.blit(self.image, self.rect)
def update(self):
if self.moving_right and self.rect.right < self.screen_rect.right:
self.rect.x += self.settings.player_speed
if self.moving_left and self.rect.left > 0:
self.rect.x -= self.settings.player_speed
Settings类:
import pygame
class Settings():
def __init__(self):
self.screen_width = 1200
self.screen_height = 700
self.bg_color = (255, 255, 255)
self.player_speed = 3
self.ball_speed = 1
函数块func:
import pygame
import sys
from random import randint
def update_screen(settings, screen, player, ball):
screen.fill(settings.bg_color)
create_ball(ball)
create_player(player)
pygame.display.flip()
def create_player(player):
player.blitme()
player.update()
def create_ball(ball):
ball.blitme()
ball.update()
def check_cross(screen, player, ball):
if pygame.sprite.collide_mask(player, ball):
ball.rect.x = randint(0, (screen.get_rect().width - ball.rect.x))
ball.rect.y = 50
create_ball(ball)
return True
elif ball.rect.top >= screen.get_rect().bottom:
ball.rect.x = randint(0, (screen.get_rect().width - ball.rect.x))
ball.rect.y = 50
return False
def check_events(player):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
check_key_down(event, player)
elif event.type == pygame.KEYUP:
check_key_up(event, player)
def check_key_down(event, player):
if event.key == pygame.K_RIGHT:
player.moving_right = True
if event.key == pygame.K_LEFT:
player.moving_left = True
def check_key_up(event, player):
if event.key == pygame.K_RIGHT:
player.moving_right = False
if event.key == pygame.K_LEFT:
player.moving_left = False
实际效果展示:
总结与疑问:
1.
百度知识点:pygame.sprite.collide_mask()函数
2.关于接住的球数计数问题:
在刷新球时计数,在主程序运行时,接球数始终为1,无奈之下将计数代码写到了主程序中。