Python制作《精灵进化》

通过项目《精灵进化》的制作,熟悉游戏过程中角色的移动和变化及游戏结束效果。

on_key_down()运行机制

目标

按一次键,控制角色一直移动
精灵进化

总结

◆ 按一次按键,on_key_down()函数执行一次。它的下级代码全部执行完,才调用draw()函数,所以bobo不能连续移动。
◆ 游戏开始,update()一直重复执行。每次执行完都会调用draw() 函数绘制,所以 bobo可以连续移动。

按键控制角色移动

目标

on_key_down() 和 update() 配合使用,实现按一次方向键,波波朝对应方向一直移动的效果。

步骤

1. 使用全局变量,在函数间传递方向信息
2. 使用on_key_down(),判断按键方向
3. 使用update(),让角色根据按键方向连续移动

py

direction = ' '
def on_key_down(key):
    global direction
    if key == keys.RIGHT:
        direction = '右'
        ......
def update():
    global direction
    if direction == '右'
        bobo.x += 4
        ......

角色移动的边界限制

目标

角色移动时,不超出窗口边缘

py

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()生成随机坐标

创建角色时,能量球随机出现

py

ball = Actor('能量球')
ball.x = random.randint(ball.width//2, WIDTH - ball.width//2)
ball.y = random.randint(ball.height//2, HEIGHT - ball.height//2)

角色碰撞时,能量球更新在新的随机位置上

py

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,并让 分数显示在窗口左上角。

统计分数

py

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

显示分数

py

def draw():
    global score
    screen.blit('奇妙岛', (0,0))
    bobo.draw()
    ball.draw()
    screen.draw.text(str(score), (10,10))

波波的造型

根据分数score,让波波切换成不同的造型:

py

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()全部执行完的结果,而不会体现出中间切换的过程。

定时更新能量球

每隔一段时间,能量球自动改变一次位置。

定时调用函数

py

clock.schedule_interval(函数, 时间间隔)

定时更新能量球

py

#定义能量球更新位置的函数
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)

随机出现两种能量球

增加爆炸能量球,每次更新能量球时,在两种球中随机选择。
利用随机数选择造型

py

def change():
    if random.randint(1, 2) == 1:
        ball.image = '爆炸能量球'
    else:
        ball.image = '能量球'

让爆炸能量球出现的可能性小一些

py

def change():
    if random.randint(1, 10) == 1:
        ball.image = '爆炸能量球'
    else:
        ball.image = '能量球'

游戏结束效果

判断过程

1. 判断游戏是否结束
2. 根据游戏状态,绘制不同内容

py

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语句,声明它是全局变量。

那年 • 今日
写于2022年9月24日
没有伞的孩子,必须学会努力奔跑。

赞助 点赞 0

暂无评论,抢沙发?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注