Pygame 官方文档 - Tutorials - 游戏制作指南(Making Games Tutorial)- 用户可控制的对象(User-controllable objects)

游戏制作指南(Making Games Tutorial)

点我回总目录

5.用户可控制的对象(User-controllable objects)

       到目前为止,您可以创建一个Pygame窗口,并渲染一个将在屏幕上飞过的球。 下一步是制作一些用户可以控制的板子。 这可能比球更简单,因为它不需要物理(除非您的用户控制对象将以比上下更复杂的方式移动,例如像马里奥这样的平台角色,在这种情况下您将需要更多物理)。 正如您将看到的那样,用户可控制的对象非常容易创建,这要归功于Pygame的事件队列系统。

5.1.一个简单的板子类(A simple bat class)

       bat类背后的原理类似于球类。 你需要一个__init__函数来初始化球(这样你就可以为每个板子创建对象实例),一个更新函数,用于在击球板到屏幕之前对球板进行每帧更改,以及定义这个类实际要做什么的函数。 这是一些示例代码:

class Bat(pygame.sprite.Sprite):
"""可移动的网球板子,用于击球
Returns: bat object
    Functions: reinit, update, moveup, movedown
    Attributes: which, speed"""

    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的函数,当一轮结束时使用,并且需要将bat设置回起始位置,并将任何属性设置回其必要值。 接下来,板子的移动方式比球稍微更复杂一些,因为它的移动很简单(上/下),但它依赖于用户告诉它移动,不像球只是在每一帧一直移动。 要了解球的移动方式,查看快速图表以显示事件顺序是有帮助的:

       这里发生的是控制板子的人按下移动板子的按键。 对于主游戏循环的每次迭代(对于每一帧),如果仍然按下该键,则该bat对象的state属性将被设置为“moving”,并且将调用moveup函数,从而导致球的y 要通过速度属性的值减少的位置(在本例中为10)。 换句话说,只要按下按键,板子就会在屏幕上向上移动10个像素。 这里还没有使用state属性,但知道你是在处理spin(PS.翻不来),还是想要一些调试输出是很有用的。
       一旦玩家释放该键,就会调用第二组方框,并将bat对象的状态属性设置回“still(静止)”,并将movepos属性设置回[0,0] ,这意味着当调用更新函数时,它不会再移动蝙蝠。 因此,当玩家松开按键时,板子停止移动。 简单!

5.1.1.部分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"

       这里假设您已经创建了一个bat实例,并调用了对象player。您可以看到for结构的熟悉布局,它迭代Pygame事件队列中找到的每个事件,该事件使用event.get()函数检索。当用户按下键时,按下鼠标按钮并移动操纵杆,这些动作被放入Pygame事件队列,然后放在那里直到被处理。因此,在主游戏循环的每次迭代中,您都要经历这些事件,检查它们是否是您想要处理的事件,然后适当地处理它们。然后在每次迭代中调用bat.update函数中的event.pump()函数以抽出旧事件,并使队列保持最新。
       首先,我们检查用户是否退出程序,如果是,则退出程序。然后我们检查是否有任何按键被按下,如果是,我们检查它们是否是用于上下移动板子的指定键。如果它们是,那么我们调用适当的移动函数,并适当地设置玩家状态(尽管状态在moveup()和movingown()函数中移动和移动并改变,这使得更整洁的代码,并且不会破坏封装,这意味着您将属性分配给对象本身,而不引用该对象的实例的名称)。请注意,我们有三种状态:still,moveup和movedown。同样,如果您想调试或计算spin,这些都会派上用场。我们还检查是否有任何按键被“放开”(即不再被按下),如果它们是正确的按键,我们也会停止板子移动。
 
上一篇:Tutorials - 游戏制作指南(Making Games Tutorial)- 游戏对象的类(Game object classes)
· 篇:Tutorials - 游戏制作指南(Making Games Tutorial)- 把所有东西放在一起(Putting it all together)
以上内容,自己翻译,可能有误,可参考:Tutorials - 游戏制作指南(Making Games Tutorial)- 用户可控制的对象(User-controllable objects)

点我回顶部

 
 
 
 
 
 
 
Fin.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值