【前情提要】
1、pygame的安装:https://blog.csdn.net/Xiaomo_haa/article/details/83962300
2、Python小游戏——王校长的S8冠军奖杯【引子】:https://blog.csdn.net/Xiaomo_haa/article/details/83929275
【素材准备】
首先将我们需要用到的几张图片放在pycharm工程目录下,比如我新建一个文件夹命名为 image,然后将需要用到的几个图片放置在该目录下。图片经Photoshop处理,图片背景为透明,且尺寸调整到合适大小。
由于需要使用的图片格式为png格式,在调用过程中可能会出现“iccp known incorrect srgb profile”警告,请参考这里(https://blog.csdn.net/Xiaomo_haa/article/details/83996501)解决该问题。
【CODE】
hotdog_wxz.py
该文件导入了整个工程中所需要的pygame、sys模块,并且初始化工程,创建游戏开头函数run_game():
import pygame
from settings import Settings
from wxz import Wxz
import game_functions as gf
from pygame.sprite import Group
from button import Button
from game_stats import GameStats
from scoreboard import Scoreboard
def run_game():
#初始化pygame、设置和屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("王校长的S8冠军奖杯")
#创建Play按钮
play_button = Button(ai_settings,screen,"Play")
#创建一个WXZ,一个hotdog编组和一个奖杯编组
wxz = Wxz(ai_settings,screen)
hotdogs = Group()
cups = Group()
#创建奖杯群
gf.create_fleet(ai_settings,screen,wxz,cups)
#创建一个用于存储游戏统计信息的实例,并创建记分牌
stats = GameStats(ai_settings)
sb = Scoreboard(ai_settings,screen,stats)
#开始游戏的主循环
while True:
gf.check_events(ai_settings,screen,stats,sb,play_button,wxz,cups,hotdogs)
if stats.game_active:
wxz.update()
gf.update_hotdogs(ai_settings,screen,stats,sb,wxz,cups,hotdogs)
gf.update_cups(ai_settings,screen,stats,sb,wxz,cups,hotdogs)
gf.update_screen(ai_settings,screen,stats,sb,wxz,cups,hotdogs,play_button)
run_game()
wxz.py
添加王校长到游戏中,并且创建wxz更新函数以及wxz绘制函数,在需要之时在屏幕上相应位置绘制wxz:
import pygame
from pygame.sprite import Sprite
class Wxz(Sprite):
def __init__(self,ai_settings,screen):
"""初始化WXZ并设置其初始位置"""
super(Wxz,self).__init__()
self.screen = screen
self.ai_settings = ai_settings
#加载WXZ图像并获取其外接矩形
self.image = pygame.image.load('image/wxz.png')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#将每个WXZ放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
#在WXZ的属性center中存储小数值
self.center = float(self.rect.centerx)
#移动标志
self.moving_right = False
self.moving_left = False
def update(self):
"""根据移动标志调整WXZ位置"""
#更新WXZ的center值
if self.moving_right and self.rect.right < self.screen_rect.right:
self.center += self.ai_settings.wxz_speed_factor
if self.moving_left and self.rect.left > 0:
self.center -= self.ai_settings.wxz_speed_factor
#根据self.center更新rect对象
self.rect.centerx = self.center
def blitme(self):
"""在指定位置绘制WXZ"""
self.screen.blit(self.image,self.rect)
def center_wxz(self):
"""让WXZ在屏幕上居中"""
self.center = self.screen_rect.centerx
settings.py
有关本游戏中所有的设置,包含游戏所创建的窗口大小、wxz设置、hotdog设置、奖杯设置、记分设置、游戏速度设置等等。除此之外,还包含随游戏进行加快游戏速度函数和奖杯分数的函数。
class Settings():
def __init__(self):
"""初始化游戏的设置"""
#屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230,230,230)
#WXZ的设置
self.wxz_speed_factor = 5
self.wxz_limit = 3
#hotdog的设置
self.hotdog_speed_factor = 1
self.hotdogs_allowed = 10
#奖杯设置
self.cup_speed_factor = 1
self.fleet_drop_speed = 10
#fleet_direction为1表示向右移,为-1表示向左移
self.fleet_direction = 1
#以什么样的速度加快游戏节奏
self.speedup_scale = 1.1
self.score_scale = 1.5
#记分
self.cup_points = 50
self.initialize_dynamic_settings()
def initialize_dynamic_settings(self):
"""初始化随游戏进行而变化的设置"""
self.wxz_speed_factor = 5
self.hotdog_speed_factor = 10
self.cup_speed_factor = 1
#fleet_direction为1表示向右,为-1表示向左
self.fleet_direction = 1
def increase_speed(self):
"""提高游戏速度和奖杯分数"""
self.wxz_speed_factor *= self.speedup_scale
self.hotdog_speed_factor *= self.speedup_scale
self.cup_speed_factor *= self.speedup_scale
self.cup_points = int(self.cup_points * self.score_scale)
print(self.cup_points)
cup.py
在游戏中导入奖杯图像,并且创建在指定位置绘制奖杯函数、移动奖杯函数、控制奖杯在创建的屏幕范围内移动函数。
import pygame
from pygame.sprite import Sprite
class Cup(Sprite):
"""表示单个奖杯的类"""
def __init__(self,ai_settings,screen):
"""初始化奖杯并设置其起始位置"""
super(Cup, self).__init__()
self.screen = screen
self.ai_settings = ai_settings
#加载奖杯图像,并设置其rect属性
self.image = pygame.image.load('image/cup.png')
self.rect = self.image.get_rect()
#让每个奖杯最初都在屏幕左上角附近
self.rect.x = self.rect.width
self.rect.y = self.rect.height
#存储奖杯的准确位置
self.x = float(self.rect.x)
def blitme(self):
"""在指定位置绘制奖杯"""
self.screen.blit(self.image,self.rect)
def check_edges(self):
"""如果奖杯位于屏幕边缘,就返回True"""
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left <= 0:
return True
def update(self):
"""向右移动奖杯"""
self.x += (self.ai_settings.cup_speed_factor * self.ai_settings.fleet_direction)
self.rect.x = self.x