游戏分享:手把手教你用Python编写推星星
游戏(八)
2017.12.10
这是推星星游戏的最后一期了
希望每个学习了的同学都能制作出你自己的推星星游戏
记得巩固好知识噢~
Drawing the Map绘制地图
535.def drawMap(mapObj,gameStateObj,goals):
536.#将地图绘制为表层对象,包括角色和星星
537.#这个函数无需调用pygame.display.update()
538.#也不用再角落绘制关卡,步数文本。
539.
540.#将是用来绘制方块在上面的单独的表层对象
541.#所以将很容易在DISPLAYSURF表层对象中定位整张地图
542.#首先,需要就地图的宽和长
543.mapSurfWidth=len(mapObj)*TILEWIDTH
544.mapSurfHeight=(len(mapObj[0])-1)*(TILEHEIGHT-TILEFLOORHEIGHT)+TILEHEIGHT
545.mapSurf=pygame.Surface((mapSurfWidth,mapSurfHeight))
546.mapSurf.fill(BGCOLOR)#无填充色开始
drawMap()函数会将整张地图反馈至表层对象。
而地图的大小将从mapObj中计算得出。而在表层对象上绘制的所有东西将在545行创建。一开始,整个表层对象以背景色来绘制。
548.#将方块精灵绘制在表层上
549.for x in range(len(mapObj)):
550.for y in range(len(mapObj[x])):
551.spaceRect=pygame.Rect((x*TILEWIDTH,y*(TILEHEIGHT-TILEFLOORHEIGHT),TILEWIDTH,TILEHEIGHT))
549和550的嵌套for循环将检索地图上所有XY坐标并绘制合适的方块图片在当前坐标上
552.if mapObj[x][y]in TILEMAPPING:
553.baseTile=TILEMAPPING[mapObj[x][y]]
554.elif mapObj[x][y]in OUTSIDEDECOMAPPING:
555.baseTile=TILEMAPPING['']
556.
557.#首先绘制地基和墙
558.mapSurf.blit(baseTile,spaceRect)
559.
baseTile变量将设置为表层方块图片对象中将要绘制在当前XY坐标的方块坐标。如果单字符串储存在OUTSIDEDECOMAPPING字典里,那么TILEMAPPING就用得上了。
560.if mapObj[x][y]in OUTSIDEDECOMAPPING:
561.#D在这个方块上绘制装饰
562.mapSurf.blit(OUTSIDEDECOMAPPING[mapObj[x][y]],spaceRect)
除此之外,如果方块列在OUTSIDEDECOMAPPING字典中,相对应的装饰图片将绘制在当前方块的顶部。
563.elif(x,y)in gameStateObj['stars']:
564.if(x,y)in goals:
565.#星标方块和星星在同一方块上,首先绘制星标方块
566.mapSurf.blit(IMAGESDICT['covered goal'],spaceRect)
567.#T绘制星星
568.mapSurf.blit(IMAGESDICT['star'],spaceRect)
如果在地图上的某个XY坐标上应该有个星星,那么在568行上,这个星星就会在这个坐标上绘制。在完成绘制之前,代码将首先检查是否有星标方块在同一位置,如果有那么先绘制星标方块。
569.elif(x,y)in goals:
570.#绘制星标方块
571.mapSurf.blit(IMAGESDICT['uncovered goal'],spaceRect)
如果地图上这个XY坐标有个星标方块,且没有被玩家或者星星覆盖,那么就将星标方块绘制在顶部。
573.#最后绘制玩家角色
574.if(x,y)==gameStateObj['player']:
575.#currentimage是独特的玩家形象
576.#
577.#
578.mapSurf.blit(PLAYERIMAGES[currentImage],spaceRect)
579.
580.return mapSurf
最后,drawMap()函数将检查玩家是否在这个XY坐标上,如果是那么玩家的图片形象就在方块上绘制。而始于549和550行的580行是在嵌套循环之外,所以当表层对象返回时,整个地图将绘制完毕。
检查关卡是否完成
583.def isLevelFinished(levelObj,gameStateObj):
584."""反馈True如果所有星标方块被星星覆盖"""
585.for goal in levelObj['goals']:
586.if goal not in gameStateObj['stars']:
587.#找到没有被星星覆盖的星标方块
588.return False
589.return True
isLevelFinished()函数建在所有星标方块被星星覆盖时反馈True。一些关卡将有超过星标方块的星星,所以检查星标方块是否被覆盖比检查星星是否比星标方块多更重要。
585行的for循环检查了所有在levelObj[‘GOALS’]里的星标方块坐标,和gameStateObj[‘stars’]里星星的坐标。当代码第一次找到一个没有星星覆盖的星标方块,函数将反馈False。如果每个都被星星覆盖,那么isLevelFinished()反馈True。
592.def terminate():
593.pygame.quit()
594.sys.exit()
terminate函数作用一如既往
597.if__name__=='__main__':
598.main()
在定义了所有函数后,602行将调用main()函数并开始游戏。
恭喜你!完成游戏!
推星星的游戏相对之前又是一个进阶
恭喜你又向游戏大师迈进了一步!
**注:文中代码的行数如中断,则默认该行为空