【Pygame】壁球小游戏

在慕课上看的嵩天老师的Pygame的教学视频,并对第一个“壁球”小游戏做了以下的总结。
我想要学习Pygame的目的,是因为这个东西不仅学起来简单,而且还可以在短期内做出一些简单的成果。因此,我认为这是一个低付出,高回报的事情,所以就开始了Pygame的学习。

嵩天老师还说了这么一句话:无论学习什么专业,从事什么工作,在世界的哪里坚守着,即使我们不能仗剑天涯,即使要面对眼前的苟且,请学习Pygame,用技术让自己的心灵来趟诗和远方的旅行吧。

下面的代码有很多重复的地方,但是为了保证代码的完整性,易读懂,我就把代码全粘了下来。

Pygame简介与安装

Pygame安装

安装好Python之后。
打开cmd,输入指令pip install pygame

Pygame简介

  1. 学习游戏开发入门的最好的第三方库
  2. Pygame是一款游戏开发的引擎,基本逻辑具有极大的参考价值。
  3. Pygame是Python最经典的2D游戏开发第三方库,也支持3D游戏等相关功能的开发。
  4. Pygame适用于游戏逻辑验证、游戏入门及系统演示验证。也有着系统的演示和仿真的功能(功能性的系统),不一定是游戏。

Pygame最小开发框架及最小游戏

有最小开发框架,极简开发框架两种框架。
计算机不断地获取用户输入的事件,并逐类响应。根据相应刷新屏幕,保证响应让用户看到。

代码如下

# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。

# 初始化
pygame.init()   # dui Pygame每部各功能模块进行初始化创建及变量设置,默认调用
screen = pygame.display.set_mode((600, 400))    # 初始话显示窗口,设置窗体大小
pygame.display.set_caption("Pygame游戏之旅")    # 设置窗口标题内容

# 获取时间并逐类响应,刷新屏幕(无限循环的模块)
while True:
    for event in pygame.event.get():    # 获取事件
        if event.type == pygame.QUIT:   # 设置推出事件
            sys.exit()                  # 用于推出结束游戏并推出
    pygame.display.update()             # 刷新屏幕

壁球小游戏(展示型)与图像的基本使用

从需求倒是显得三个关键要素:
(1)壁球:游戏需要一个壁球,通过图片引入;
(2)壁球运动:壁球要能够上下左右四个方向运动;
(3)当壁球碰到上下左右边缘的时候,要能够反弹。

壁球的图片链接位:https://python123.io/PY15/PYG02-ball.gif

代码如下

# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。

# 初始化
pygame.init()
size = width, height = 600, 400 # 窗体的大小
speed = [1, 1]                  # 速度为1像素
BLACK = 0, 0, 0                 # RGB颜色为黑色
screen = pygame.display.set_mode( size )    # 设置窗体大小
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("ball.gif")
ballrect = ball.get_rect()
# pygame.image.load(filename)将filename路径下的图像载入游戏,支持JPG、PNG、GIF(非动画)等13种常用图片格式
# Surface对象 Pygame使用内部定义的Surface对象表示所有载入的图像,其中.get_rect()方法返回一个与图像外切的图形Rect对象
# Rect对象 有一些重要属性,例如:top,bottom,left,right表示上下左右;width,height表示宽度高度

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    ballrect = ballrect.move( speed[0], speed[1] )
    # 球碰左右两侧,横向速度取反
    if ballrect.left < 0  or  ballrect.right > width :
        speed[0] = -speed[0]
    # 球碰上下两侧,纵向速度取反
    if ballrect.top < 0  or  ballrect.bottom > height :
        speed[1] = -speed[1]

    # 窗口刷新
    screen.fill(BLACK)  # 系统默认,图层移动之后,原来的位置将会被填充白色。因此,每一次都需要不断刷新背景色
    screen.blit(ball, ballrect ) # 将一个图像绘制在另一个图像上,即将ball会知道ballrect位置上,通过Rect对象引导对壁球绘制
    pygame.display.update()     # 窗口刷新

图像的处理操作

  1. pygame.image.load(filename)将filename路径下的图像载入游戏,支持JPG、PNG、GIF(非动画)等13种常用图片格式
  2. Surface对象 Pygame使用内部定义的Surface对象表示所有载入的图像,其中.get_rect()方法返回一个与图像外切的图形Rect对象
  3. Rect对象 有一些重要属性,例如:top,bottom,left,right表示上下左右;width,height表示宽度高度
  4. 系统默认,图层移动之后,原来的位置将会被填充白色。因此,每一次都需要不断刷新背景色
  5. 将一个图像绘制在另一个图像上,即将ball会知道ballrect位置上,通过Rect对象引导对壁球绘制

壁球小游戏(节奏型)与屏幕的帧率设置

需求:壁球可以按照一定速度运动
如何实现控制壁球的运动速度?可以通过控制循环的间隔

代码如下

# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。

# 初始化
pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode( size )
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("ball.gif")
ballrect = ball.get_rect()
fps = 500   # Frames per Seconds,每秒钟帧数
fclock = pygame.time.Clock()    # pygame.time.Clock() 创建一个Clock对象,用于操作时间

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    ballrect = ballrect.move( speed[0], speed[1] )
    if ballrect.left < 0  or  ballrect.right > width :
        speed[0] = -speed[0]
    if ballrect.top < 0  or  ballrect.bottom > height :
        speed[1] = -speed[1]

    screen.fill(BLACK)
    screen.blit(ball, ballrect)
    pygame.display.update()
    fclock.tick(fps)

帧率控制操作

  1. fclock = pygame.time.Clock() 创建一个Clock对象,用于操作时间
  2. fclock.tick(fps),控制帧速度,即窗口刷新的速度。例:clock.tick(100)表示每秒钟昂100次帧刷新。

壁球小游戏(操控型)与键盘的基本使用

需求:壁球可以通过键盘控制运动速度
每触发一次时间,速度改变的大小为1个像素。
按键盘上的“↑”方向键,纵向绝对速度的增加;
按“↓”,纵向绝对速度的减少;
按“→”,横向绝对速度的增加;
按“←”,横向绝对速度的减少。
如何实现通过键盘控制壁球的运动速度?可以通过控制循环的间隔

代码如下

# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。

# 初始化
pygame.init()
size = width, height = 1000, 700
speed = [5, 5]
BLACK = 0, 0, 0
screen = pygame.display.set_mode( size )
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("E:\Picture\Photo\Pygame\\ball.gif")
ballrect = ball.get_rect()
fps = 50   # Frames per Seconds,每秒钟帧数
fclock = pygame.time.Clock()    # pygame.time.Clock() 创建一个Clock对象,用于操作时间

while True:
    # 事件处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN :
            if event.key == pygame.K_LEFT:
                speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1)* int(speed[0]/abs(speed[0]))
            elif event.key == pygame.K_RIGHT :
                speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
            elif event.key == pygame.K_UP :
                speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
            elif event.key == pygame.K_DOWN :
                speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1)* int(speed[1]/abs(speed[1]))

    ballrect = ballrect.move( speed[0], speed[1] )
    if ballrect.left < 0  or  ballrect.right > width :
        speed[0] = -speed[0]
    if ballrect.top < 0  or  ballrect.bottom > height :
        speed[1] = -speed[1]

    # 窗口刷新
    screen.fill(BLACK)
    screen.blit(ball, ballrect)
    pygame.display.update()
    fclock.tick(fps)

键盘控制操作

  1. pygame.KEYDOWN Pygame对键盘敲击的事件定义,键盘每个键对应一个具体定义:
  • ↑:pygame.K_UP
  • ↓:pygame.K_LEFT
  • ←:pygame.K_DOWN
  • →:pygame.K_RIGHT
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容