这个RPG教程中最重要的类是Player类。这个类负责几乎所有与玩家相关的事情,包括移动、攻击、碰撞检测、渲染、状态跟踪等等。
由于它的总大小和许多概念,我们将在教程系列的其余部分慢慢构建Player类。在本教程和下一个教程中,我们将专注于为Player类创建基本代码。
Creating the Player Class
如果你已经通过我们之前的Backgrounds教程,你会知道self.image
和self.rect
变量分别存储(图像和Rect对象)的是什么。
class Player(pygame.sprite.Sprite):
def \_\_init\_\_(self):
super().__init__()
self.image = pygame.image.load("Player\_Sprite\_R.png")
self.rect = self.image.get_rect()
# Position and direction
self.vx = 0
self.pos = vec((340, 240))
self.vel = vec(0,0) # 速度
self.acc = vec(0,0) # 加速度
self.direction = "RIGHT"
现在讲下position和direction变量。self.direction
用于存储 Player 的当前方向。默认情况下,我们让玩家面朝右。
另外三个变量,self.pos
,self.vel
和self.acc
是使用我们在第一个教程中创建的矢量对象创建的。这意味着这些变量现在有两个组件,可以以以下格式访问,self.pos.x
和self.pos.y
。这是将两个组件保持在一个变量中而不是两个单独的变量中的一种有用的方法。
至于这三个变量的用途,self.pos
表示玩家的位置 。self.vel
代表玩家的速度 。self.acc
代表玩家的加速度 。(如果你学过物理,你应该知道速度和加速度有垂直 和水平 分量)
Creating the remaining functions
我们将在本系列后面的相应教程中介绍其余的函数。现在只需要记住它们的存在以及它们的目的是什么(move是为了移动代码,attack是为了攻击代码)。
def move(self):
pass
def update(self):
pass
def attack(self):
pass
def jump(self):
pass
同样,我们使用pass
关键字作为占位符。将函数保留为空终究会导致错误。还要记住方法的缩进。不正确的缩进将导致方法不是Player
类的一部分。
Creating the player object
一旦我们完成了类,我们就必须创建Player对象,通过它所有的交互都将发生。事实上,你可以从同一个类中创建多个对象,这也开启了创建双人游戏 的可能性。
player = Player()
记住要在游戏循环之前,而不是在循环中声明这一点。
最后,我们需要渲染我们的玩家。我们将添加以下代码行,放在地面和背景的渲染后面。当然,所有这些渲染函数都在游戏循环中,因为它们每帧都需要重新绘制。
background.render()
ground.render()
displaysurface.blit(player.image, player.rect)
我们不“必须”创建渲染函数。我们通过直接为玩家编写blit()
方法来展示这一点。而且这次我们只是将player.rect
传递给blit()
,因为rect存储了一对坐标。
下图是pygame窗口中玩家精灵的截图。
在这里插入图片描述
我们的Player位于左上角的原因是因为我们没有传递一个center = (x,y)
。因此,palyer rect的默认值为(0,0)
。这个问题将在后面的系列中解决,所以不用担心。
Next Section
本教程只是对Player类的介绍。在接下来的4 - 5个教程中,我们将慢慢地构建游戏和玩家类,所以请密切关注。