首页 » 父与子的编程之旅:与小卡特一起学Python » 父与子的编程之旅:与小卡特一起学Python全文在线阅读

《父与子的编程之旅:与小卡特一起学Python》25.1 滑雪者

关灯直达底部

首先,我们来编写游戏中的滑雪者。当你运行 Skier 程序的时候,应该注意到了滑雪者本身只能在屏幕上左右来回移动,而不能上下移动。滑雪者滑“下”小山的错觉则是通过将场景(树和小旗)向上滚动来实现的。

在滑雪者滑下小山的场景实现中,需要 5 张不同的图片:一张滑雪者一直向下滑,两张滑雪者向左转(一张稍向左转,一张大幅度左转),两张滑雪者向右转(一张稍向右转,一张大幅度右转)。在程序的开头,我们为这些图片创建了一个列表,然后将图片按特定的顺序放入列表。

skier_images = [ /"skier_down.png/", /"skier_right1.png/",/"skier_right2.png/", /"skier_left2.png/",/"skier_left1.png/"]  

很快你就会知道为什么要按这样的顺序排放。

我们使用变量 angle 来标记滑雪者当前面对的方向,它的值从 -2 到 +2,分别如下:

  • -2 = 向左急转

  • -1 = 稍向左转

  • 0 = 一直向下

  • +1 = 稍向右转

  • +2 = 向右急转

(注意,这里的“左”和“右”是相对屏幕的方向,即我们看到的方向,而不是滑雪者的左和右。)

我们使用 angle 的值来确定要使用哪张图片。事实上,我们可以直接使用 angle 的值作为列表的索引来指定图片:

  • skier_images[0] 是滑雪者向下滑的图片。

  • skier_images[1] 是滑雪者稍向右转的图片。

  • skier_images[2] 是滑雪者向右急转的图片。

接下来是微妙之处。还记得我们在第 12 章谈到过列表吗?我们说过负索引值会从列表的尾部开始往前数。所以,在这个例子中

  • skier_images[-1] 是滑雪者稍向左转的图片(通常会使用 skier_images[4])。

  • skier_images[-2] 是滑雪者向左急转的图片(通常会使用 skier_images[3])。

现在你知道为什么我们将列表中的图片按这种特定的顺序排列了:

  • angle = +2(向右急转)= skier_images[2]

  • angle = +1(稍向右转)= skier_images[1]

  • angle = 0(向下滑)= skier_images[0]

  • angle = -1(稍向左转)= skier_images[-1](也就是 skier_images[4]

  • angle = -2(向左急转)= skier_images[-2](也就是 skier_images[3]

我们为滑雪者创建一个 Pygame Sprite 类的子类。滑雪者与窗口上边界的距离始终为 100 像素,开始时他位于窗口中心,也就是距离窗口左边界 320 像素,即 x=320,因为窗口的宽度是 640 像素。因此滑雪者的初始位置是 [320, 100]。滑雪者类定义的第一部分是下面这样:

class SkierClass(pygame.sprite.Sprite):    def __init__(self):pygame.sprite.Sprite.__init__(self)self.image =   pygame.image.load(/"skier_down.png/")self.rect = self.image.get_rectself.rect.center = [320, 100]self.angle = 0  

我们用一个类来改变滑雪者的状态,它会在 angle 的值改变时载入正确的图片,并设置好滑雪者的速度。速度由 x 和 y 两个值构成。我们只改变左右方向的速度(x 方向的速度,x-speed),但是 y 方向的速度(y-speed)决定了场景向上滚动的速度(滑雪者向“下”滑的速度)。当他垂直向下运动时,y 方向的速度比较快,而当他转向时,y 方向的速度则比较慢。速度的计算公式如下:

speed = [self.angle, 6 - abs(self.angle) * 2]  

此行代码中的 abs 用于取得 angle 的绝对值,也就是说我们忽略符号(+ 和 -)后的值。对于 y 方向的速度来说,滑雪者左转还是右转都没有影响,只要知道转的程度就行了。

用于转弯的全部代码如下:

def turn(self, direction):self.angle = self.angle + directionif self.angle < -2:  self.angle = -2if self.angle >  2:  self.angle =  2center = self.rect.centerself.image = pygame.image.load(skier_images[self.angle])self.rect = self.image.get_rectself.rect.center = centerspeed = [self.angle, 6 - abs(self.angle) * 2]return speed  

我们还需要一个方法来控制滑雪者左右来回移动,以保证他不会滑出窗口边缘:

def move(self, speed):self.rect.centerx = self.rect.centerx + speed[0]if self.rect.centerx < 20:  self.rect.centerx = 20if self.rect.centerx > 620: self.rect.centerx = 620 

我们使用方向键来控制滑雪者左右运动,所以要添加 Pygame 初始化和事件循环的代码,这样就可以让只有滑雪者的程序运行起来。代码如下所示。

代码清单 25-1 创建 Skier 游戏——只有滑雪者

如果运行以上代码,你只会在界面中看到滑雪者(没有分数,没有障碍物),你可以让他向左右转弯。