通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏01之Pygame游戏模板

简介: 通过游戏学Python系列之小兔要上天---手把手教你使用Pygame开发平台跳跃类游戏01之Pygame游戏模板

配套视频教程


配套视频教程


本节最终效果


image.png


pygame开发,有一个所谓的最小框架(或称为模板):


image.png


main.py

import pygame
import time
# 游戏中的一些常量定义
SIZE = WIDTH, HEIGHT = 600, 480
FPS = 10
# 颜色常量定义
BLACK = 0, 0, 0
WHITE = 255, 255, 255
# 初始化
pygame.init()
pygame.mixer.init()
# 窗口、标题等初始化
screen = pygame.display.set_mode(SIZE)
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
# 循环入口
running = True
while running:
    # 设置帧数
    clock.tick(FPS)
    # 事件处理
    for event in pygame.event.get():
        # 退出处理
        if event.type == pygame.QUIT:
            running = False
    # (update) 游戏更新逻辑(比如:改动角色的位置或一些重要变量等,这里仅演示更新当前时间)
    font = pygame.font.SysFont('Menlo', 48, True)
    current_time = font.render(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())), 1, WHITE)
    # (draw)渲染屏幕
    screen.fill(BLACK)  # 先准备一块黑布
    screen.blit(current_time, current_time.get_rect(center=(WIDTH / 2, HEIGHT / 2)))  # 把时间显示在画布中央
    # 屏幕内容刷新
    pygame.display.update()
# 循环结束后,退出游戏
pygame.quit()



image.png


代码头部有很多常量定义,按模块化的思想,可以把这些常量定义单独提取出来,放到一个settings.py文件里,以后修改起来会比较方便。

setting.py

SIZE = WIDTH, HEIGHT = 480, 320
FPS = 30
TITLE = "sprite sample"
# define color
BLACK = 0, 0, 0
WHITE = 255, 255, 255
RED = 255, 0, 0
GREEN = 0, 255, 0
BLUE = 0, 0, 255
# define player bound
PLAYER_TOP_LIMIT = 100
PLAYER_BOTTOM_LIMIT = 250

加入精灵

import pygame
from settings import *
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SIZE)
pygame.display.set_caption(TITLE)
clock = pygame.time.Clock()
# 定义游戏主角类
class Player(pygame.sprite.Sprite):
    def __init__(self):
        # 第1行,必须调用Sprite父类的构造函数
        pygame.sprite.Sprite.__init__(self)
        # 注意:sprite必须指定image, rect这二个属性
        self.image = pygame.Surface((20, 20))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.center = WIDTH / 2, HEIGHT / 2
    # 更新逻辑
    def update(self):
        self.rect.x += 5
        if self.rect.left > WIDTH:
            self.rect.right = 0
# 这里要有一个类似分组(或容器)的东西,存放所有游戏中的sprite实例
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
running = True
while running:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    # update
    all_sprites.update()
    # draw /render
    screen.fill(BLACK)
    all_sprites.draw(screen)  # 绘制所有sprite
    pygame.display.update()
pygame.quit()

运行程序,会看到一个绿色的小方块,在窗口中从左向右移动。


引入图像


一个小方块,比较枯燥,可以引入图像。

import pygame
from settings import *
import os
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode(SIZE)
pygame.display.set_caption(TITLE)
clock = pygame.time.Clock()
game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, "./img/")
class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(os.path.join(img_folder, "p1_jump.png"))
        # 如果图片显示时,发现不透明(看具体操作系统),可以加下面这行
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.center = WIDTH / 2, HEIGHT / 2
        self.y_speed = 5
    def update(self):
        self.rect.x += 5
        self.rect.y += self.y_speed
        # 边界检测
        if self.rect.left > WIDTH:
            self.rect.right = 0
        if self.rect.top < PLAYER_TOP_LIMIT:
            self.y_speed = -self.y_speed
        if self.rect.bottom > PLAYER_BOTTOM_LIMIT:
            self.y_speed = -self.y_speed
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
running = True
while running:
    clock.tick(FPS)
    # process input (events)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    all_sprites.update()
    # draw /render
    screen.fill(BLACK)
    pygame.draw.line(screen, GREEN, (0, PLAYER_TOP_LIMIT), (WIDTH, PLAYER_TOP_LIMIT), 1)
    pygame.draw.line(screen, GREEN, (0, PLAYER_BOTTOM_LIMIT), (WIDTH, PLAYER_BOTTOM_LIMIT), 1)
    all_sprites.draw(screen)
    pygame.display.update()
pygame.quit()


image.png


目录
相关文章
|
10天前
|
存储 缓存 Python
深入了解python中元类和连接符的用法
【6月更文挑战第20天】本文介绍包括`type`的多重用途,内建函数的常量,模块属性,类继承的概念,元类的工作原理,可哈希对象的重要性,加权平均值的计算,以及如何找到两个列表的交集。
56 5
深入了解python中元类和连接符的用法
|
4天前
|
算法 Python
Python新式类和经典类
Python新式类和经典类
|
5天前
|
安全 测试技术 Python
Python类中的Setter与Getter:跨文件调用的艺术
Python类中的Setter与Getter:跨文件调用的艺术
12 3
|
6天前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之建了一个python 的 UDF脚本,生成函数引用总是说类不存在,是什么导致的
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
9天前
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
20 1
|
11天前
|
存储 程序员 Python
Python类属性与实例属性详解
Python 中区分类属性和实例属性的设计是为了满足不同的需求和使用场景。这种区分使得代码更加灵活、清晰,并且能够提供更好的封装性和可维护性。类属性用于表示与整个类相关的数据,而实例属性则用于表示每个实例的特定信息。这样,我们可以将关注点分离开来,使得代码更易于理解、维护和扩展。在实际应用中,我们可以根据具体的情况,选择适当的属性类型来组织和管理代码。
13 1
|
11天前
|
存储 搜索推荐 Python
【随手记】python语法:类属性和实例属性
【随手记】python语法:类属性和实例属性
24 1
|
2天前
|
索引 Python
技术好文共享:用Python的Pygame包做飞行棋
技术好文共享:用Python的Pygame包做飞行棋
|
3天前
|
Python
经验大分享:python类函数,实例函数,静态函数
经验大分享:python类函数,实例函数,静态函数
|
4天前
|
自然语言处理 Java API
Python之:Python中的类
Python之:Python中的类
11 0