本节最终效果
方块不断向上跳动的过程中,从视觉上看,整个背景屏幕应该不断向下滚动,而且上方要不断出现新档板(否则就没办法继续向上跳了)
修改update方法(main.py)
def update(self): # Game Loop - Update self.all_sprites.update() # check if player hits a platform - only if falling if self.player.vel.y > 0: hits = pg.sprite.spritecollide(self.player, self.platforms, False) if hits: self.player.pos.y = hits[0].rect.top self.player.vel.y = 0 # 如果方块的高度<游戏屏幕高度的1/4,则所有档板下移(视觉上表现为整个屏幕向下滚动) if self.player.rect.top <= HEIGHT / 4: self.player.pos.y += abs(self.player.vel.y) for plat in self.platforms: plat.rect.y += abs(self.player.vel.y) if plat.rect.top >= HEIGHT: # 同时为了提高性能,下移到屏幕之外的档板,清除掉(否则的话,仍然一直参与碰撞检测及渲染),游戏会越来越慢 plat.kill() # 由于下移到屏幕之外的档板被干掉,所以才继续源源不断的在上方随机补充新档板 while len(self.platforms) < 6: width = random.randrange(50, 100) p = Platform(random.randrange(0, WIDTH - width), random.randrange(-75, -30), width, 20) self.platforms.add(p) self.all_sprites.add(p)
要点:
- 如果方块跳到了屏幕的上半部分的一半(即:1/4处), 则所有的sprite实例(即:方块自身及所有档板)都向下移动,移动的位置跟方块的垂直速度相关(即:速度越大,屏幕向下滚得越快) - tips:因为方块向上跳时,速度vel.y是负值,所以代码中要用abs函数,转换成正值。
- 如果档板掉到屏幕下边缘之外(即看不见了),要及时清理,否则会影响游戏性能
- 检测self.platforms容器里的档板数,如果不足5块,及时在上方随机位置,补充一块。