【项目介绍】
使用须安装pygame模块,并确保python版本为3.0+。该版本为1.0,后续版本欢迎查看博客主页😊 本篇主要讲述如何构建游戏窗口、编写事件机制、绘制基础地图(草皮) 参考文章 本版本源码:点击跳转
一、流程分析
Created with Rapha?l 2.3.0
创建主游戏类:RunGame()
初始化项:init_Window()
根据Gameover标志
判断是否结束?
等待4秒
EndGame()
加载项:loadd_*()
主事件项:DealEvent()
更新程序:pygame.display.update()
yes
no
二、主游戏类 MainGame.py
全局变量和自定义函数
Window_size = [720, 487]
BLACK = (0, 0, 0)
def GetImage(path):
img = pygame.image.load(path)
return img
1.成员变量
class MainGame:
Window = None
Gameover = False
mainMap = Map.Map()
2.初始化项
按一定大小创建你的游戏窗口,并添加独有的标识😜
def init_Window(self):
self.Window = pygame.display.set_mode(Window_size)
pygame.display.set_caption("PvZ_ver1.0 by 日天君")
pygame.display.set_icon(GetImage("Imgs/日天君.ico"))
3.加载项
def load_Window(self):
self.Window.fill((255, 255, 255))
def load_Map(self):
self.mainMap.display_Map(self)
4.主事件项
def DealEvent(self):
eventList = pygame.event.get()
for e in eventList:
if e.type == pygame.QUIT:
self.EndGame()
def EndGame(self):
pygame.time.wait(400)
self.Gameover = True
def RunGame(self):
self.init_Window()
while not self.Gameover:
self.load_Window()
self.load_Map()
self.DealEvent()
pygame.display.update()
特别注意: 一定要有 DealEvent() 事件处理方法,并添加 e.type == pygame.QUIT 事件判断,然后添加 EndGame() 响应 如果不添加,当点击右上角×符号退出时,程序将卡死,如下图所示:
三、地图类 Map.py
预处理,[5,9]表示一共是5行9列草皮
Map_size = [5, 9]
grass1 = pygame.image.load("Imgs/grass/1.png")
grass2 = pygame.image.load("Imgs/grass/2.png")
1.主地图类:
存放草皮列表,初始化列表并遍历、调用每块草皮的display方法
class Map:
[rows, cols] = Map_size
Grass_List = [[] for i in range(rows+1)]
def __init__(self):
for row in range(self.rows+1):
for col in range(self.cols+1):
grass = Grass(col, row)
self.Grass_List[row].append(grass)
def display_Map(self, mainGame):
for row in range(self.rows+1):
for col in range(self.cols+1):
self.Grass_List[row][col].display_grass(mainGame)
2.草皮类:
单块草皮,内含display方法
class Grass:
can_grow = True
def __init__(self, col, row):
[self.colx, self.rowy] = col, row
def display_grass(self, MainGame):
if (self.colx + self.rowy) % 2:
MainGame.Window.blit(grass2, [self.colx * 80, self.rowy * 80 + 87])
else:
MainGame.Window.blit(grass1, [self.colx * 80, self.rowy * 80 + 87])
四、最终效果
|