通过项目《精灵进化》的制作,熟悉游戏过程中角色的移动和变化及游戏结束效果。
on_key_down()运行机制
目标
按一次键,控制角色一直移动
总结
◆ 按一次按键,on_key_down()
函数执行一次。它的下级代码全部执行完,才调用draw()函数,所以bobo不能连续移动。
◆ 游戏开始,update()
一直重复执行。每次执行完都会调用draw() 函数绘制,所以 bobo可以连续移动。
按键控制角色移动
目标
on_key_down() 和 update() 配合使用,实现按一次方向键,波波朝对应方向一直移动的效果。
步骤
1. 使用全局变量,在函数间传递方向信息
2. 使用on_key_down(),判断按键方向
3. 使用update(),让角色根据按键方向连续移动
direction = ' '
def on_key_down(key):
global direction
if key == keys.RIGHT:
direction = '右'
......
def update():
global direction
if direction == '右'
bobo.x += 4
......
角色移动的边界限制
目标
角色移动时,不超出窗口边缘
def update():
global direction
if direction == '上' and bobo.top > 0:
bobo.y -= 4
if direction == '下' and bobo.bottom > HEIGHT:
bobo.y += 4
if direction == '左' and bobo.left > 0:
bobo.x -= 4
if direction == '右' and bobo.right > WIDTH:
bobo.x += 4
能量球随机出现
目标
让能量球出现在随机位置上
思路
1. 先确定能量球坐标(角色中心点)的取值范围
2. 再使用random.randint()生成随机坐标
创建角色时,能量球随机出现
ball = Actor('能量球')
ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)
角色碰撞时,能量球更新在新的随机位置上
def update():
......
if bobo.colliderect(ball):
ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)
波波的进化
统计得分:
如果波波碰到能量球ball,就让分数增加1,并让 分数显示在窗口左上角。
统计分数
if bobo.colliderect(ball):
ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)
score += 1
显示分数
def draw():
global score
screen.blit('奇妙岛', (0,0))
bobo.draw()
ball.draw()
screen.draw.text(str(score), (10,10))
波波的造型
根据分数score,让波波切换成不同的造型:
def draw():
global score
screen.blit('奇妙岛', (0,0))
bobo.draw()
ball.draw()
screen.draw.text(str(score), (10,10))
def update():
global direction, score
...
if score >= 5:
bobo.image = '波波2'
if score >= 10:
bobo.image = '波波3'
只有当update()函数全部执行完以后, 程序才会调用一次draw()函数。虽然这里切换了两次造型,但是窗口中只会显示update()全部执行完的结果,而不会体现出中间切换的过程。
定时更新能量球
每隔一段时间,能量球自动改变一次位置。
定时调用函数
clock.schedule_interval(函数, 时间间隔)
定时更新能量球
#定义能量球更新位置的函数
def change():
ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)
#每隔4秒调用一次改变位置的函数
clock.schedule_interval(change, 4)
随机出现两种能量球
增加爆炸能量球,每次更新能量球时,在两种球中随机选择。
利用随机数选择造型
def change():
if random.randint(1, 2) == 1:
ball.image = '爆炸能量球'
else:
ball.image = '能量球'
让爆炸能量球出现的可能性小一些
def change():
if random.randint(1, 10) == 1:
ball.image = '爆炸能量球'
else:
ball.image = '能量球'
游戏结束效果
判断过程
1. 判断游戏是否结束
2. 根据游戏状态,绘制不同内容
def draw():
global score, state
if state == 1:
screen.blit('奇妙岛', (0,0))
bobo.draw()
ball.draw()
screen.draw.test(str(score), (10,10))
else:
screen.blit('游戏失败', (0,0))
screen.draw.test(str(score), (WIDTH//2,10))
score = 0
state = 1 #代表游戏运行状态 1:运行 0:停止
def update():
global direction, score, state
if bobo.colliderect(ball):
if ball.image == '能量球':
score += 1
change()
else:
clock.unschedule(change)
state = 0
总结
◆ 全局变量可以在函数之间传递信息。
◆ 在函数外面定义一个变量,要想在函数中修改这个变量,需要先用global语句,声明它是全局变量。