序
上次讲到那个玩家的跳跃啥啥的,接下来要说的是生物,武器一类,还有一些常见的游戏机制。
一.各类生物
为了增加游戏难度,趣味性,这种怪怪啊,NPC啊,材料啊自然是必不可少的。这个对于单独个体而言不太适合下面的精灵写法。
1.结构框架
一般来说要定义class精灵类。
class npc(pygame.sprite.Sprite):
def __init__(self):
super().__init__() #初始化
self.image=pygame.image.load("")
self.rect=self.image.get_rect(center=(x,y))
大抵就是这个样子,self.image的赋值中""里面就是所调用图片的路径,self.rect的赋值中(x,y)的x和y值并非是图片最左上的那个点的坐标,center这个就是指是图片的最中心。
好比所用的图片大小为100×50,把图片的最左上角放在屏幕中的(20,30)处,则self.rect的赋值为center=(20+100/2,30+50/2),也就是说center=(70,55)。
2.敌对生物
敌对生物的话,对玩家进行攻击和伤害,所以要让它在屏幕中动起来。普通的小怪,随机生成的话我们要先导入新的模块random。
from random import randint
导入其中的randint,我们要补充完善这个敌对生物。
class guai(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image=pygame.image.load("")
x=randint(0,800)
self.rect=self.image.get_rect(center=(x,y))
def update(self):
self.rect.x-=3
update中是为了让图片在屏幕中更新,从而动起来。这只是一个精灵,只有在对它进行调用之后才能显示在游戏中。由于其具有一般性,所以说可以让它自己不断克隆复制自己。
guai_group=pygame.sprite.Group()
在外面创造一个精灵组用于存放精灵,但是这个组是空的,所以要往里面添加东西。
guai_group.add(guai())
在组里面放入精灵,这个要写到while里面去。把这个组绘制在屏幕上就要用draw。
guai_group.draw(screen)
这个也写入while中,这样怪怪就源源不断地刷出来了。但是要让它动起来的话,class guai()中的update(写在while中)。
guai_group.update()
3.攻击
怪怪源源不断地刷,采取一些措施将它们击败,首先做一个武器(图片),使它一直显示在玩家前方。
怪物被击杀的话要满足两个条件:玩家发动攻击,攻击触碰到了怪物(假设怪物被一击毙命,如果用具体血量也可以)。玩家发动攻击可以用if判断按键是否按下,攻击触屏到怪物的话可以用碰撞函数进行调用判断。
if keys[pygame.K_j]:
for i in guai_group:
if fall(pygame.mask.from_surface(wuqi),pygame.mask.from_surface(i.image),(px+100,py+30),(i.rect.x,i.rect.y)):
i.kill()
这个是什么意思呢,就是按下J键后,遍历guai组里面的所有guai,然后碰撞检测,若碰撞则把碰撞的这个怪从组里面删除。
4.材料
这个也算是在游戏中常见的一类东西了,比如打怪物掉材料,什么升级啊,合成啊差不多的意思。举例静止的材料,材料随机刷是好写的。打败怪物之后,掉落材料,材料的位置应该出现在怪物的位置上。
因此要得到怪被打掉时的位置记录。先弄一个材料的图片和组出来。再定义两个全局变量为0。
waitx,waity=0,0
在上面的攻击碰撞后,即使读取怪的位置,并赋值。
if keys[pygame.K_j]:
for i in guai_group:
if fall(pygame.mask.from_surface(wuqi),pygame.mask.from_surface(i.image),(px+100,py+30),(i.rect.x,i.rect.y)):
waitx=i.rect.x
waity=i.rect.y
i.kill()
接下来如敌对生物那样创建精灵。
class cailiao(pygame.sprite.Sprite):
def __int__(self):
super().__init__()
self.image=pygame.image.load("P/cailiao.png")
self.rect=self.image.get_rect(center=(waitx+10,waity+15))
相同的,也要一个精灵组。
cailiao_group=pygame.sprite.Group()
上述碰撞检测中,得到新的waitx和waity之后,及时往精灵组中添加精灵。
if keys[pygame.K_j]:
for i in guai_group:
if fall(pygame.mask.from_surface(wuqi),pygame.mask.from_surface(i.image),(px+100,py+30),(i.rect.x,i.rect.y)):
waitx=i.rect.x
waity=i.rect.y
cailiao_group.add(cailiao())
i.kill()
最后别忘了,把精灵组绘制在屏幕screen上面。
二.背包
背包这东西还是比较简单的,先讲思路。
1.思路
背包中的有物品,以及物品数量,有的还有不同信息。
对于重复类型,一样的物品,仅需要两个列表就能满足。一个叫做bag,里面的变量都是字符串;
另外一个叫bagnunmber,里面的变量都是数字。
先来一个全局变量bagflag=1,记录bag当前空着的最前的位置。对于任何物品的拾取,首先判断相对于名称,也就是字符串是否在bag中。
1.在背包内
如果在背包内,只需要查找名称相同的元素在bag列表中的位置weizhi即可,然后得到weizhi之后,bagnumber[weizhi]+=1即可。
2.不在背包内
如果不在的话,在bag[bagflag]处赋值相应物品名称即可。再度调用一次该函数即可,便能数量+1,最后还要bagflag+=1
2.代码
bag=["0"]*10001
bagnumber=[0]*10001
bagflag=1
def putinbag(thing):
if thing in bag:
weizhi=bag.index(thing)
bagnumber[weizhi]+=1
else :
bag[1]=str(thing)
bagflag+=1
putinbag(thing)
在检测拾取碰撞物品中,直接调用循环即可。
putinbag(cailiaowu)
三.抽奖
这个主要的就是概率,即randint。
单独写成函数也行,直接放while里面也可以。
gailv=randint(0,100)
if gailv<=10:
结果1
else :
结果2
那么上面所给代码,达成结果一的的概率只有10%,以此类推可以有不同的机制。
四.结果展示
结果呢,出去背包和抽奖,能得到以下效果。