前面已经完成了推箱子的基础类的实现
接下来就要实现真正的游戏了,
设计会有一个启动界面,该界面中有 :开始游戏 和 退出游戏 两个按钮
选择开始游戏时就会开始第一关的地图加载。
某关卡顺利完成后,会有一个选择界面,有:进入下关 和 退出游戏 两个按钮
全部关卡结束后,会弹出结束界面。
频繁用到按钮,所以先做个按钮myButton类
五
创建myButton类
import os
import pygame
from params import Params
class myButton():
def __init__(self):
pass;
def genButton(self, gamescreen, position, text):
bwidth = 310
bheight = 65
left, top = position
pygame.draw.line(gamescreen, (150, 150, 150), (left, top), (left+bwidth, top), 5)
pygame.draw.line(gamescreen, (150, 150, 150), (left, top-2), (left, top+bheight), 5)
pygame.draw.line(gamescreen, (50, 50, 50), (left, top+bheight), (left+bwidth, top+bheight), 5)
pygame.draw.line(gamescreen, (50, 50, 50), (left+bwidth, top+bheight), [left+bwidth, top], 5)
pygame.draw.rect(gamescreen, (100, 100, 100), (left, top, bwidth, bheight))
font_path = os.path.join(Params.get('resourcePath'), Params.get('fontFolder'), 'simkai.ttf')
font = pygame.font.Font(font_path, 50)
text_render = font.render(text, 1, (255, 0, 0))
return gamescreen.blit(text_render, (left+50, top+10))
就是用pygame画一个按钮出来。
六
创建一个界面类,myInterface类
import sys
import pygame
from params import Params
from myButton import *
class myInterface():
def __init__(self) -> None:
pass
def genInterface(self,gamescreen,txt1,txt2):
gamescreen.fill(Params.get('bgColor'))
clock = pygame.time.Clock()
while True:
myButton_1 = myButton().genButton(gamescreen, (170, 150), txt1)
myButton_2 = myButton().genButton(gamescreen, (170, 305), txt2)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if myButton_1.collidepoint(pygame.mouse.get_pos()):
return
elif myButton_2.collidepoint(pygame.mouse.get_pos()):
pygame.quit()
sys.exit(0)
clock.tick(60)
pygame.display.update()
七
现在做主界面代码就比较简单了,先搭个架子
import os
import sys
import pygame
from workerSprite import *
from gameElementSprite import *
from params import Params
from gameMap import *
from gameDisplay import *
from myButton import *
from myInterface import *
'''
经典的推箱子Sokoban是一个来自日本的古老游戏
'''
'''
退出游戏
'''
def quitGame():
pygame.quit()
sys.exit(0)
'''
关卡的游戏主循环
'''
def runGame(screen, gamelevel):
pass
'''
开始界面
'''
def startGame(screen):
myInterface().genInterface(screen,'开始游戏','退出游戏')
'''
关卡切换界面
'''
def switchGame(screen):
myInterface().genInterface(screen,'进入下关','退出游戏')
'''
结束界面
'''
def endInterface(screen):
screen.fill(Params.get('bgColor'))
clock = pygame.time.Clock()
font_path = os.path.join(Params.get('resourcePath'), Params.get('fontFolder'), 'simkai.ttf')
text = '恭喜通关!'
font = pygame.font.Font(font_path, 80)
text_render = font.render(text, 1, (255, 0, 0))
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.blit(text_render, (120, 200))
clock.tick(60)
pygame.display.update()
'''
主函数
'''
def main():
pygame.init()
pygame.mixer.init()
pygame.display.set_caption('推箱子游戏 按R键重新开始本关')
os.environ['SDL_VIDEO_CENTERED'] = '1'
screen = pygame.display.set_mode([Params.get('WIDTH'), Params.get('HEIGHT')])
pygame.mixer.init()
audio_path = os.path.join(Params.get('resourcePath'), Params.get('audioFolder'), '般若波罗蜜多心经.mp3')
pygame.mixer.music.load(audio_path)
pygame.mixer.music.set_volume(0.38)
pygame.mixer.music.play(-1)
startGame(screen)
levels_path = Params.get('levelsPath')
for level_name in sorted(os.listdir(levels_path)):
runGame(screen, level_name)
switchGame(screen)
endInterface(screen)
if __name__ == '__main__':
main()
这部分代码没有太多要讲的,都是基本编程操作。游戏居中对齐,有背景音乐。
runGame的代码待续...