pygame水平卷轴平台跳跃游戏核心原理程序

"""水平卷轴平台跳跃游戏核心原理.py"""

import pygame

# 全局常量定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# 屏幕尺寸定义
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

class Player(pygame.sprite.Sprite):
    """这是玩家控制的小方块"""

    def __init__(self):
        """初始化方法,首先调用父类的同名方法 """
        super().__init__()

        # 创建角色的外形图,也可以从磁盘加载一张漂亮的图片
        self.image = pygame.Surface([40, 60])
        self.image.fill(RED)

        # 设置矩形对象,表示坐标和宽高
        self.rect = self.image.get_rect()

        # 设置玩家水平速度和垂直速度
        self.xspeed = 0
        self.yspeed = 0

        # 玩家所在关卡对象,关卡内有一些小方块,它们是平台对象
        self.level = None

    def update(self):
        """ 更新玩家坐标 """
        # 重力代码段
        self.calc_grav()

        # 水平移动
        self.rect.x += self.xspeed

        # 检测是否碰到了当前所在关卡的方块(平台)
        block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
        for block in block_hit_list:
            # 如果正在往右移,那么把自己的最右x坐标设为平台最左x坐标
            if self.xspeed > 0:
                self.rect.right = block.rect.left
            elif self.xspeed < 0:
                # 否则是正在向左移动,把自己的最左x坐标设为平台方块的最右x坐标
                self.rect.left = block.rect.right

        # 上下移动
        self.rect.y += self.yspeed

        # 检测是否碰到了方块
        block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
        for block in block_hit_list:

            # 如果碰到了上面的或下面的方块则相应的调整y坐标
            if self.yspeed > 0:
                self.rect.bottom = block.rect.top
            elif self.yspeed < 0:
                self.rect.top = block.rect.bottom

            # 并且停止水平移动,当然下一帧它又会受重力而自由落体
            self.yspeed = 0

    def calc_grav(self):
        """ 设定受重力的效果"""
        if self.yspeed == 0:   # 如果垂直速度为0则让它的速度为1
            self.yspeed = 1    # 这样下一帧,它就会下移一点点
        else:
            self.yspeed += .35 # 否则以这个加速度自由落体

        # 检测是否在地面上,如果在地面把垂直速度设为零
        if self.rect.y >= SCREEN_HEIGHT - self.rect.height and self.yspeed >= 0:
            self.yspeed = 0
            self.rect.bottom = SCREEN_HEIGHT  

    def jump(self):
        """ 按跳跃键的时候让它往上跳 """

        # 往下移2个像素是为了检测是否在平台上,否则跳不起来
        self.rect.y += 2
        platform_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False)
        self.rect.y -= 2

        # 在平台上或在最低边则跳
        if len(platform_hit_list) > 0 or self.rect.bottom >= SCREEN_HEIGHT:
            self.yspeed = -10
            
    def go_left(self):
        """ 按左移键时水平速度为负数 """
        self.xspeed = -6

    def go_right(self):
        """ 按右移键时水平速度为正数 """
        self.xspeed = 6

    def stop(self):
        """ 没有按键时水平速度为零 """
        self.xspeed = 0

You must log in to read the rest of this article. Please log in or register as a user.