前言

(文末送读者福利)
; 01、迷你跑步游戏
他用了不到一百行代码,就写出了值得一玩的2D动作游戏,怎么做到的呢?
在此之前,先向大家介绍一个游戏框架: pgzero。
该框架全名Pygame Zero,是一个基于Pygame的游戏编程框架。它可以更容易地编辑游戏,无需模板、不用编写事件循环,也无需学习复杂的Pygame API,而且支持树莓派。
安装 :
pip install pgzero
需求 :
通过键盘的左右键操作,让运动员向前跑,每跑25米就有路牌提醒,最后看看谁在百米跑中花的时间最少。
[En]
Through the left and right keys of the keyboard operation, let athletes run forward, every 25 meters there are road signs to remind, and finally to see who spends the least time in the 100-meter run.
代码如下:
其中的关键代码是一个叫做Sprinter()的类。
class Sprinter(Actor):
def init(self, **kwargs):
super().init(image='idle', pos=(200,220), **kwargs)
self.startTime = time()
self.finishTime = time()
self.runFrames = ['run' + str(i) for i in range(1,16)]
self.timeOnCurrentFrame = 0
self.speed = 0
self.lastPressed = None
self.keyPressed = False
self.distance = 0
# 将运动员推进到下一帧
def nextFrame(self):
# 如果当前空闲,则启动正在运行的动画。
if self.image == 'idle':
self.image = self.runFrames[0]
else:
# 在列表中找到下一个图像,然后返回到第一个图像
# 当列表已经到末尾的时候
nextImageIndex = (self.runFrames.index(self.image) + 1) % len(self.runFrames)
self.image = self.runFrames[nextImageIndex]
# 检查左右方向键是否正确被交替按下
def isNextKeyPressed(self):
if keyboard.left and self.lastPressed is not 'left' and not keyboard.right:
self.lastPressed = 'left'
return True
if keyboard.right and self.lastPressed is not 'right' and not keyboard.left:
self.lastPressed = 'right'
return True
return False
def update(self):
# 更新运动员的速度
# 交替按键加速
if self.isNextKeyPressed() and self.distance < 100:
self.speed = min(self.speed + ACCELERATION, 0.15)
# 如果没有按键,减速
else:
self.speed = max(0, self.speed-DECELERATION)
# 根据运动员的速度更新距离
self.distance += self.speed
# 根据运动员的速度对其进行动画
self.timeOnCurrentFrame += 1
if self.speed > 0 and self.timeOnCurrentFrame > 10 - (self.speed * 75):
self.timeOnCurrentFrame = 0
self.nextFrame()
# 如果不移动,则设置为空闲
if self.speed <= 0: self.image="idle" < code></=>
里面有一些变量用来跟踪运动员的速度和距离,以及全局的常量(ACCELERATION和DECELERATION的值)。这样可以确定玩家的速度变化。这些数字很小,因为它们代表了玩家加速和减速时,每一帧对应的米数。
玩家通过交替按左右键来增加运动员的速度。这个输入由Sprinter类中的isNextKeyPressed()方法处理,如果按下正确的键,该方法将返回True。
lastPressed变量用于确保左右键被交替按压。如果未按下任何键,玩家会减速,并且该减速程度应小于加速度,以免让玩家突然停下。
在游戏设计中,作者用了gameart2d.com上一个名为”The Boy”的免费形象来作为运动员,里面有15张跑步动作分解图构成的循环。他将从空闲状态开始,只要速度大于0,就切换到跑步动作循环。

这是通过index()在runFrames列表中查找当前运动员图像的名称来实现的,程序会将当前图像设置为列表中的下一个图像(并且在到达列表的末尾时返回第一个图像)。
我们还需要让运动员在跑步动作循环中以成比例的速度向前移动,通过跟踪当前图像显示的帧数来实现(在那个名为timeOnCurrentFrame的变量中)。
为了给运动员一种运动的错觉,作者增加了一些从运动员身边经过的物品:一条终点线和三个指示跑步距离的标记。
[En]
In order to give the player an illusion of movement, the author added some items that passed by the player: a finish line and three markers indicating the running distance.
这些物品出现的时机是根据运动员在屏幕上的x位置和运动距离计算出来的。
然而,这意味着每个物品距离玩家最多只有100像素的距离,似乎移动的有点缓慢。我们可以通过SCALE因子来解决,它对应的是运动员跑过的米数和屏幕上像素之间的关系。比如设成1:75。
这些项目最初被绘制在屏幕不可见的右侧,然后移动到左侧,更快地超过运动员。
[En]
These items are initially drawn on the invisible right side of the screen, then move to the left and pass the athlete faster.
最后,startTime和finishTime变量用于计算比赛时间。这两个值最初都设置为比赛开始的时间,只要跑动的距离小于100,finishTime就会更新。使用time模块,比赛时间可以简单地计算为finishTime – startTime。
附注:该游戏在树莓派和Windows PC上都能运行,如果要试玩,记得在Python文件前面加pgzrun命令。
02、参考书籍
《趣学Python游戏编程》
ISBN:978-7-302-54977-2
何青 编著

编辑推荐:
本书是高校教师多年开发经验的结晶之作,深入浅出地讲解使用Python语言进行游戏开发,帮助读者快速掌握游戏设计的基本原理和方法,同时提高应用Python语言的编程能力。
全书精选十个游戏案例,涵盖不同的游戏类型,每一章围绕一个经典游戏案例展开,并突出一个游戏编程的主题。本书涉及的主要知识点有游戏循环的原理、鼠标及键盘事件处理、碰撞检测及处理、随机数的运用、定时器的使用、游戏场景的滚动、角色动画的播放、音效及音乐的播放、缓动效果、游戏关卡设计、游戏人工智能的原理及运用等。本书将 Python语法知识及常用的编程技巧糅合在各个游戏案例中介绍,为读者展示Python语言的实际运用场景。
本书内容安排合理,架构清晰,注重理论与实践相结合,适合作为零基础学习 Python开发初学者的教程,也可作为本科院校及大专院校的教材,还可供职业技术学校和各类游戏培训机构使用。
读者福利:知道你对Python感兴趣,还准备了这套python学习资料
对于0基础小白入门:
如果你是零基础小白,想快速入门Python是可以考虑的。
一方面,学习时间较短,学习内容更全面、更集中。[En]
On the one hand, the learning time is relatively short, and the learning content is more comprehensive and concentrated.
另一方面,你可以找到一个适合你的学习计划。
[En]
On the other hand, you can find a study plan that suits you.
包括:Python永久使用安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等学习教程。带你从零基础系统性的学好Python!
; 零基础Python学习资源介绍
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。 (全套教程文末领取哈)

; 👉Python必备开发工具👈

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
看零基础学习视频,看视频学习是最快最有效的方式,遵循老师在视频中的思路,从基础到深入,还是很容易上手。
[En]
Watch zero basic learning video, watching video learning is the fastest and most effective way, follow the ideas of the teacher in the video, from basic to in-depth, or very easy to get started.

; 👉实战案例👈
光学理论是没用的,要学拼,要动手实践,才能学以致用,这时可以做一些实际案例来学习。
[En]
Optical theory is useless, to learn to knock together, to hands-on practice, in order to apply what they have learned to practice, at this time can do some practical cases to learn.

👉100道Python练习题👈
检查学习结果。

👉面试刷题👈



; 资料领取
上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入”领取资料” 即可领取

Original: https://blog.csdn.net/tingting11232/article/details/128223694
Author: Python资源
Title: Python开发游戏超简单 迷你跑步游戏
相关阅读
Title: Pygame Surface创建图像
Pygame Surface创建图像
通过前面内容的介绍,我们对 Surface 对象有了大体上的认识。Pygame 针对文本、图像、颜色提供了不同模块来生成它们各自的 Surface 对象。Surface 模块是Pygame 中专门用来新建图像的,通过该模块可以创建一个 Surface 对象,语法格式如下:
Surface=pygame.Surface(size=(width,height),flags,depth)
参数函数如下:
size:表示 Surface 对象的矩形区域大小;
flags:功能标志位,有两个可选参数值 HWSURFACE 和 SPCALPHA,前者代表将创建的 Surface 对象存放于显存中,后者表示让图像的每一个像素都包含一个 alpha 通道
depth:指定像素的颜色深度,默认为自适应模式,由 Pygame 自动调节。
下面看一组简单的使用示例,如下所示:
import sys
import pygame
#使用pygame之前必须初始化
pygame.init()
#设置主屏窗口 ;设置全屏格式:flags=pygame.FULLSCREEN
screen = pygame.display.set_mode((400,400))
#设置窗口标题
pygame.display.set_caption('c语言中文网')
screen.fill('white')
#创建一个 50*50 的图像,并优化显示
face = pygame.Surface((50,50),flags=pygame.HWSURFACE)
#填充颜色
face.fill(color='pink')
while True:
# 循环获取事件,监听事件
for event in pygame.event.get():
# 判断用户是否点了关闭按钮
if event.type == pygame.QUIT:
#卸载所有模块
pygame.quit()
#终止程序
sys.exit()
# 将绘制的图像添加到主屏幕上,(100,100)是位置坐标,显示屏的左上角为坐标系的(0,0)原点
screen.blit(face, (100, 100))
pygame.display.flip() #更新屏幕内容
从上述运行结果可以看出,通过 Surface 模块,我们成功的在主屏幕上绘制一个 50 * 50 的矩形区域。注意,如果不设置尺寸,Surface 默认创建一个和主游戏屏幕同样大小的区域。
Surface 模块还提供了处理图像的其他方法,下表对它们做了简单的介绍。
方法 说明
pygame.Surface.blit() 将一个图像(Surface 对象)绘制到另一个图像上
pygame.Surface.convert() 修改图像(Surface 对象)的像素格式
pygame.Surface.fill() 使用纯色填充 Surface 对象
pygame.Surface.scroll() 复制并移动 Surface 对象
pygame.Surface.set_alpha() 设置整个图像的透明度
pygame.Surface.get_at() 获取一个像素的颜色值
pygame.Surface.set_at() 设置一个像素的颜色值
pygame.Surface.get_palette() 获取 Surface 对象 8 位索引的调色板
pygame.Surface.map_rgb() 将一个 RGBA 颜色转换为映射的颜色值
pygame.Surface.set_clip() 设置该 Surface 对象的当前剪切区域
pygame.Surface.subsurface() 根据父对象创建一个新的子 Surface 对象
pygame.Surface.get_offset() 获取子 Surface 对象在父对象中的偏移位置
pygame.Surface.get_size() 获取 Surface 对象的尺寸
除了使用 Surface 模块新建图像外,我们还可以使用另外一种方法从外部加载图像,如下所示:
pygame.image.load("图片路径").convert()
上述方法将被加载的图像作为 Surface 对象来使用,因此它可以调用上述表格中所有方法。注意,此处之所以使用 convert()来转换被加载图片的像素格式,是为了提升 Pygame 对图片的处理速度,该操作能够保证图像的像素格式与图片的显示格式是相同的。
通过 image.load() 方法可以加载游戏的背景图,或者游戏中使用的其他元素,比如的人物、道具等等。
下面看一组简单的示例:
import pygame
#引入pygame中所有常量,比如 QUIT
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((500,250))
pygame.display.set_caption('c语言中文网')
#加载一张图片
image_surface = pygame.image.load("C:/Users/Administrator/Desktop/c-net.png").convert()
# rect(left,top,width,height)指定图片上某个区域
# special_flags功能标志位,指定颜色混合模式,默认为 0 表示用纯色填充
image_surface.fill((0,0,255),rect=(100,100,100,50),special_flags=0)
# 200,100 表示图像在水平、垂直方向上的偏移量,以左上角为坐标原点
image_surface.scroll(100,50)
# 无限循环,让窗口停留
while True:
for event in pygame.event.get():
if event.type == QUIT:
exit()
# 将图像放置在主屏幕上
screen.blit(image_surface,(0,0))
pygame.display.update()
Original: https://blog.csdn.net/ccc369639963/article/details/122472410
Author: 睿科知识云
Title: Pygame Surface创建图像
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/344856/
转载文章受原作者版权保护。转载请注明原作者出处!