长文预警
导语
我们的塔防游戏终于实现了第一步
怪物可以顺着地图的路径移动了
虽然程序结构简单
但总算从零开始起步了
所以
今天给大家分享一下
最新的塔防游戏设计代码
我将详细地讲一讲这个游戏的设计过程
相关资源 代码获取
1:关注“python趣味爱好者”公众号,回复“ 红精灵来袭”获取源代码。
# 效果展示
按一次空格键,生成一个怪物
# 开发工具
版本:python3.6.4
第三方库:pygame
如果大家想和我们一起为这个游戏添砖加瓦,可以点击下面的链接联系我们哦!!!
#往期推荐
# 讲解部分
一:素材准备与抠图
我们首先准备游戏素材。在当前的路径下,我们建立三个文件夹,分别是
其中分别存放:地图,游戏素材,游戏精灵代码。
游戏地图就是上次那个,其中有一条明显的路径。左上角代表的是起点,也就是产生怪物的点,左下角代表城堡。也就是怪物的终点,怪物按照一定的速度从起点移动到终点。
我们将路径上的像素点用列表存储起来,这样就非常简单了。
path1=[(50,14),(86,14),(135,14),(175,14),(180,47),(180,92),(215,92),(260,92),\
(302,94),(305,135),(306,174),(344,174),(392,174),(430,180),(430,139),\
(430,90),(430,51),(475,52),(516,52),(560,52),(560,94),(560,131),(560,166),\
(560,205),(560,247),(560,273),(560,307),(513,305),(469,305),(432,305),\
(387,305),(349,305),(300,305),(250,305),(200,305)]
比如说,path1的第一个位置的像素点是(50,14)代表的就是第一步的像素坐标。也就是左上角的那个位置。
有的同学可能会问:我们如何才能获取图片上某个像素点的位置呢?很简单,选中图片,右键编辑,然后把鼠标移动到你想要的位置,就可以知道这个点的坐标了。
在这个列表当中,如果我们要让怪物移动,就直接修改索引值即可。
移动怪物时只需要修改列表索引即可。
还有一点需要我们注意的就是抠图,对于我们的怪物图片,如果用普通的图片,那么就会在游戏中显示这个图片的背景,如果这个图片的背景是白色,那么显示的就是白色的背景图片。
就是这样的效果,很不合适。
这个白色背景非常显眼,所以我们最好将这个背景改成透明的。用抠图工具即可。网上有很多这样的工具。
二:怪物的类
我们在sprites文件夹中存放各种类,需要的时候在主程序中直接调用即可。
比如说怪物的类Monster,由于我们最开始只设计了一个怪物。也就是下面这个。
所以我们定义一个类就行。代码就是下面的样子。
class Monster1(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('./resource/imgs/game/monster.png')
self.rect = self.image.get_rect()
self.index1=0#目前所在路径列表中的位置
self.position = 60, 40
self.rect.left, self.rect.top = self.position
# 最大生命值
self.max_life_value = 20
# 当前生命值
self.life_value = 20
# 速度
self.speed = 1
# 击杀奖励
self.reward = 100
# 对大本营造成的伤害
self.damage = 1
'''不停地移动'''
def move(self, the_path):
if self.index1+self.speed<len(the_path):
self.index1=self.index1+self.speed
return 0#意思是没有攻击到目标点
else:
return 1#意思是已经攻击到了目标点
这个怪物的图片(透明背景)我们放在了resource里面。按照路径读取即可。pygame.image.load('./resource/imgs/game/monster.png')
在定义这个类的时候,我们先继承pygame的精灵类。这样,我们定义的类就继承了精灵类的所有功能和属性。
class Monster1(pygame.sprite.Sprite):
在此基础上,我们添加特定的功能,比如说,我们定义的怪物有一些特有属性,比如,有血量上限,当前的血量,能对大本营生成伤害,击杀以后玩家可以获得奖励。这些参数都可以写到类里面。
# 最大生命值
self.max_life_value = 20
# 当前生命值
self.life_value = 20
# 速度
self.speed = 1
# 击杀奖励
self.reward = 100
# 对大本营造成的伤害
self.damage = 1
可以说,类里面存储着这个怪物的DNA信息。每次生成一个怪物,都是按照这个模子刻出来的。
当然,我们的游戏目前只有简单的第一步,还不需要用到这些性质,先写在这里,以后会用到的。
三:游戏节奏的控制
最后就是游戏节奏的控制,目前我们的游戏不完整,只有简单的怪物移动。所以就是一个简单的循环。主要就是获取按键信息以及屏幕刷新。
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
create_monster()
monster_move()
screen.blit(background,(0,0))
draw_monster()
clock.tick(4)
pygame.display.flip()
在这个while循环中,我们先用for循环获取按键信息,如果我们按了空格键,那么我们就实例化一个Monster对象。其中create_monster()就是我们定义的生成怪物的函数。这样就生成了一个怪物。
之后,我们写怪物的移动,也就是monster_move(),然后填充背景图片,在背景图片上画现有的信息,最后按照帧率停顿4ms。再刷新一下屏幕。这样,就完成了一个循环。
作者|齐
编辑|齐
PYTHON
扫二维码|关注我们
QQ群:729683466
# 参考来源
游戏素材来源网络:侵歉删
图片来源:
https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=4253821060,3654962471&fm=26&gp=0.jpg