pygame用户可控对象

到目前为止,您可以创建一个Pygame窗口,并渲染一个将在屏幕上飞行的球。下一步是制作一些用户可以控制的蝙蝠。这可能比球简单得多,因为它不需要物理元素(除非你的用户控制对象的移动比上下移动更复杂,如马里奥这样的平台角色,在这种情况下你就需要更多物理元素)。用户可控对象非常容易创建,这要感谢Pygame的事件队列系统,如您所见。

一个简单的蝙蝠类
球拍类背后的原理与球类相似。你需要一个__init__函数来初始化球(这样你就可以为每个球棒创建对象实例),一个更新函数来在球棒将球棒发送到屏幕之前执行每帧的更改,以及定义这个类实际将做什么的函数。以下是一些示例代码:

class Bat(pygame.sprite.Sprite):
    """可移动的网球“球拍”,用来击球
返回:蝙蝠对象
功能:reinit, update, moveup, movedown
属性:速度"""

    def __init__(self, side):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_png('bat.png')
        screen = pygame.display.get_surface()
        self.area = screen.get_rect()
        self.side = side
        self.speed = 10
        self.state = "still"
        self.reinit()

    def reinit(self):
        self.state = "still"
        self.movepos = [0,0]
        if self.side == "left":
            self.rect.midleft = self.area.midleft
        elif self.side == "right":
            self.rect.midright = self.area.midright

    def update(self):
        newpos = self.rect.move(self.movepos)
        if self.area.contains(newpos):
            self.rect = newpos
        pygame.event.pump()

    def moveup(self):
        self.movepos[1] = self.movepos[1] - (self.speed)
        self.state = "moveup"

    def movedown(self):
        self.movepos[1] = self.movepos[1] + (self.speed)
        self.state = "movedown"

如您所见,这个类在结构上与球类非常相似。
但是每个函数的作用是不同的。
首先,有一个reinit函数,当一轮结束时使用,球拍需要回到它的起始位置,将任何属性设置回它们的必要值。
接下来,球棒的移动方式比球稍微复杂一些,因为在这里它的移动很简单(上/下),但它依赖于用户告诉它移动,不像球在每一帧都在移动。
为了理解球是如何移动的,看一个快速的图表来显示事件的顺序是很有帮助的
在这里插入图片描述
这里发生的是,控制蝙蝠的人按下键,使蝙蝠向上移动。
为每个迭代的主要游戏循环(每一帧),关键是是否还举行了下来,然后蝙蝠的状态属性对象将被设置为“移动”,moveup函数将调用,导致球的y位置降低速度属性的值(在本例中,10)。
换句话说,只要按下这个键,蝙蝠就会每帧向上移动10个像素。
这里还没有使用state属性,但是知道您是在处理spin,还是想要一些有用的调试输出是很有用的。
一旦球员让去的关键,第二组框被调用时,和蝙蝠的状态属性对象将回到“仍然”,和movepos属性将回到(0,0),这意味着当更新函数被调用时,它不会把蝙蝠。
所以当球员松开钥匙时,球棒停止移动。
简单的

娱乐3:Pygame项目
所以我们如何知道玩家何时按下按键,然后释放它们?有了Pygame事件队列系统,笨蛋!它是一个非常容易使用和理解的系统,所以这应该不会花很长时间:)您已经在基本的Pygame程序中看到了事件队列的作用,它被用来检查用户是否退出了应用程序。移动蝙蝠的代码就这么简单:

for event in pygame.event.get():
    if event.type == QUIT:
        return
    elif event.type == KEYDOWN:
        if event.key == K_UP:
            player.moveup()
        if event.key == K_DOWN:
            player.movedown()
    elif event.type == KEYUP:
        if event.key == K_UP or event.key == K_DOWN:
            player.movepos = [0,0]
            player.state = "still"

这里假设您已经创建了一个蝙蝠的实例,并将其称为对象player。
您可以看到for结构的熟悉布局,它遍历Pygame事件队列中找到的每个事件,Pygame事件队列是用event.get()函数检索的。
当用户按下按键、按下鼠标按钮并移动操纵杆时,这些操作将被输入Pygame事件队列,并留在那里直到被处理。
所以在主游戏循环的每次迭代中,你都会经历这些事件,检查它们是否是你想要处理的事件,然后适当地处理它们。
Bat中的event.pump()函数。
然后在每次迭代中调用Update函数来抽取旧事件,并保持队列的当前状态。
首先,我们检查用户是否正在退出程序,如果是,就退出程序。
然后我们检查是否有按键被按下,如果有,我们检查它们是否是用于上下移动球棒的指定按键。
如果它们是,那么我们就调用适当的移动函数,并适当设置玩家状态(尽管状态在moveup()和movedown()函数中移动和移动,这使得代码更简洁,并且不会破坏封装,这意味着你将为对象本身分配属性,
而不引用该对象的实例名)。
注意这里我们有三种状态:静止、向上移动和向下移动。
同样,如果你想调试或计算自旋,这些都会派上用场。
我们也会检查是否有任何键被“放开”(即不再被按下),如果它们是正确的键,我们就会阻止蝙蝠移动。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值