Python中的pygame精简部分-中

上次讲到那个玩家的跳跃啥啥的,接下来要说的是生物,武器一类,还有一些常见的游戏机制。

一.各类生物

为了增加游戏难度,趣味性,这种怪怪啊,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%,以此类推可以有不同的机制。

四.结果展示

结果呢,出去背包和抽奖,能得到以下效果。

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值