通过Python创作游戏《穿越大峡谷》,从而熟悉卷轴背景、角色切换和飞行及随机出现、计分功能和退出功能的实现。
穿越大峡谷
实现卷轴背景
在游戏中,月月鸟向前飞行的效果,是通过不断左移的背景图来实现的。为了能够让月月鸟不断向前飞行,需要通过卷轴来实现无限延长的背景。
卷轴效果
1. 创建两个背景角色
2. 背景角色向左移动
3. 交替拼接背景角色
创建两个背景角色
角色名 = Actor(‘造型名称’)
创建好角色后,需要设置角色的初始位置坐标。
角色坐标,就是角色中心点的位置。
角色名.draw()
创建好角色后,需要使用draw()函数绘制角色。
背景角色向左移动
程序运行时,每秒钟会调用60次update()函数。
想要实现背景角色不断左移,需要在update()函数 的下级代码中,减小角色的x坐标。
交替拼接背景角色
当角色1完全移出窗口以后,我们需要将它拼接到 角色2的右侧,然后再继续一起向左移动。同样的, 当角色2完全移出窗口以后,我们需要将它拼接到 角色1的右侧,然后再继续一起向左移动。
判断角色是否移出窗口,可以在update()函数中判断 角色的x坐标。
import pgzrun
WIDTH = 1000
HEIGHT = 500
bg1 = Actor('背景图1') #创建角色bg1
bg1.x = 500
bg1.y = 250
bg2 = Actor('背景图2') #创建角色bg2
bg2.x = bg1.x + 1000
bg2.y = 250
#绘制背景角色
def draw():
bg1.draw()
bg2.draw()
#在update()函数中,减小角色的x坐标,实现不断左移的效果
def update():
bg1.x -= 7
bg2.x -= 7
#当角色bg1移出窗口时将它拼接到bg2的右侧
if bg1.x < -500:
bg1.x = bg2.x + 1000
#当角色bg2移出窗口时将它拼接到bg1的右侧
if bg2.x < -500:
bg2.x = bg1.x + 1000
pgzrun.go()
[/code]
角色造型切换
创建并绘制好月月鸟角色以后,想要实现月月鸟扇动翅膀的效果,我们需要让月月鸟来回切换两种造型。
[code title=py]
import pgzrun
WIDTH = 1000
HEIGHT = 500
bird = Actor('月月鸟1') #创建角色bird
bird.x = 200
bird.y = 100
#绘制角色
def draw():
bird.draw()
def update(): #想要一直重复切换造型,需要使用update()函数
#当角色bird的造型为月月鸟1时,将造型切换为月月鸟2
if bird.image == '月月鸟1':
bird.image = '月月鸟2'
#否则,当角色bird的造型为月月鸟2时,将造型切换为月月鸟1
else:
bird.image = '月月鸟1'
pgzrun.go()
控制角色飞行
通过空格键控制月月鸟上下飞行:
按住空格键时,月月鸟会一直向上飞行;
松开空格键时,月月鸟会一直向下飞行。
on_key_down()
def on_key_down(key):
if key == keys.SPACE:
......
写在on_key_down()
函数中,程序只会在每次按下键盘的时候,执行一次。
update()
def update():
if keyboard.space:
......
写在update()
函数中,只要按住按键,代码就会被一直重复执行。
import pgzrun
WIDTH = 1000
HEIGHT = 500
bird = Actor('月月鸟1')
bird.x = 200
bird.y = 100
#绘制角色
def draw():
bird.draw()
def update():
#当按下空格键时,角色bird向上飞行,y坐标减小5
if keyboard.space:
bird.y -= 5
#当松开空格键时,角色bird向下飞行,y坐标增加5
else:
bird.y += 5
pgzrun.go()
为了避免让角色飞出窗口,需要限制角色y坐标的取值范围。
月月鸟的高度为70,窗口高度为500; 当月月鸟碰到窗口上方时,月月鸟的y坐标为35; 当月月鸟碰到窗口下方时,月月鸟的y坐标为465; 因此,月月鸟y坐标的取值范围为35到465。
import pgzrun
WIDTH = 1000
HEIGHT = 500
bird = Actor('月月鸟1')
bird.x = 200
bird.y = 100
#绘制角色
def draw():
bird.draw()
def update():
if keyboard.space:
if bird.y >35: #当角色的坐标小于35时,才可以继续向上飞行
bird.y -= 5
else:
if bird.y < 465: #当角色的坐标大于465时,才可以继续向下飞行
bird.y += 5
pgzrun.go()
[/code]
岩浆角色切换造型
岩浆角色
实现效果:位于窗口底部,并有不断流动的效果
思路:
1. 创建障碍物角色并绘制
2. 不断切换造型
创建岩浆角色并绘制
[code title=py]
magma = Actor('岩浆1')
magma.x = 500
magma.y = 480
def draw():
bg1.draw()
bg2.draw()
bird.draw()
magma.draw()
不断切换造型
def update():
if magma.image == '岩浆1'
magma.image = '岩浆2'
else:
magma.image = '岩浆1'
障碍物角色往复随机出现
障碍物角色
效果:
不断有障碍物从右侧随机出现,并向左移动
思路:
1. 创建障碍物角色并绘制
2. 障碍物不断向左移动,移到窗口左侧后回到右侧
3. 障碍物回到右侧后,随机切换造型
创建障碍物角色并绘制
#创建3个障碍物角色
b1 = Actor('藤蔓')
b1.x = 1000
b1.y = 100
b2 = Actor('枝干')
b2.x = 1600
b2.y = 75
b3 = Actor('尖刺')
b3.x = 2100
b3.y = 400
#将3个障碍物角色存放在列表中,简化绘制和移动的代码
blocks = [b1, b2, b3]
#在draw函数中遍历blocks,绘制障碍物
def draw():
for b in blocks:
b.draw()
障碍物移动
障碍物不断向左移动,移到窗口左侧后回到右侧。
障碍物切换
障碍物回到右侧后,随机切换造型
思路:
将造型名称存放在列表names中,在列表索引范围内取一个随机数n,将造型设为names[n]
;将造型对应 的y坐标存放在列表num中,将y坐标设为num[n]
。
退出功能
效果:
当月月鸟碰到障碍物或者岩浆时,就退出程序
1. 检测碰撞
角色1.colliderect(角色2)
2. 退出程序
exit()
代码示例:
计分功能
效果
当障碍物移出窗口左侧时,得一分
1.全局变量 vs 局部变量
2.在pygame窗口中显示文本
screen.draw.text('显示内容',(x坐标,y坐标))
显示内容 ==> 字符串类型