一、课程介绍

本节课将利用所学习的知识,制作一个空投物资的动画效果。

A025 《极限挑战》编程 源码_动画制作

二、重难点解析

A025 《极限挑战》编程 源码_获取画笔坐标_02whileTrue

while True:
    ...

当 while 循环中的代码执行到最后一行后,又会跳转到 while 循环处开始重新执行下一次循环。

A025 《极限挑战》编程 源码_获取画笔坐标_03获取画笔坐标

通过 xcor() 可以获取到画笔的 x 坐标值,通过 ycor() 可以获取到画笔的 y 坐标值,如果画笔是图片的话,xcor() 和 ycor() 表示的就是图片的中心位置。

画笔.xcor()    获取画笔的 x 坐标
画笔.ycor()    获取画笔的 y 坐标

A025 《极限挑战》编程 源码_获取画笔坐标_04动画制作

实现动画,要先确定好动画过程中不断切换的图形,确保不断画出的图形有不同的细节。

在代码一开始使用 turtle.tracer(0) 取消绘画踪迹,让后面要画的图形能够一瞬间画出来,并隐藏着。

正式进入循环画图的阶段:

画第一个图形,

使用 turtle.update() 更新窗口,显示出这个瞬间画出的隐藏图形,

清空第一个图形;

画第二个图形,

使用 turtle.update() 更新窗口,显示出这个瞬间画出的隐藏图形,

清空第二个图形;

画第三个图形,

使用 turtle.update() 更新窗口,显示出这个瞬间画出的隐藏图形,

清空第三个图形;

......

一直不断重复这个过程,即可看到最终的动画效果。

三、单词卡

desert [ˈdezərt] 沙漠

box [bɑːks] 箱子

phone [foʊn] 电话

四、小试牛刀

4.1 源码操作

编程实现一个简单的计时器,接收一个输入的数字后,开始倒计时到 0 时停止。

A025 《极限挑战》编程 源码_动画制作_05

import turtle
import time
p = turtle.Pen()
p.ht()
t = int(input('请输入倒计时的时间:'))
while t >= 0:
    p.clear()
    p.write(str(t), font=('', 50))
    time.sleep(1)
    t -= 1

turtle.done()

4.2 源码操作

你能根据提示信息绘制出这样的一个灯泡吗?

A025 《极限挑战》编程 源码_获取画笔坐标_06

提示:

1.灯头pensize为40,颜色为蓝色(blue)

⒉灯壳底部,也就是靠近灯头处,灯壳的pensize为50;灯壳顶部,灯壳的pensize为100

3.灯壳颜色为金色(gold)

import turtle
p = turtle.Pen()
p.ht()

p.left(90)
p.pencolor('blue')
p.pensize(40)
p.forward(50)

size = 50
p.pencolor('gold')
for i in range(10):
    p.pensize(size)
    p.forward(5)
    size += 5

turtle.done()

五、扩展创作

A025 《极限挑战》编程 源码_动画制作_07

import turtle
turtle.bgpic('desert.gif')
turtle.tracer(0)
p = turtle.Pen()
turtle.addshape('box.gif')
p.shape('box.gif')

p.pencolor('coral')
p.left(90)
p.penup()
p.goto(0,400)
p.pendown()
while p.ycor()>-200:
    p.forward(100)
    
    for i in range(150):
        p.pensize(i*1.5)
        p.forward(1)
    
    p.pensize(1)
    p.forward(-250)
    
    turtle.update()
    p.forward(-1)

    p.clear()
turtle.done()

六、大开脑洞

赶快将你们的空投物资变成手机吧!

A025 《极限挑战》编程 源码_动画制作_08

import turtle
turtle.bgpic('desert.gif')
turtle.tracer(0)
p = turtle.Pen()
turtle.addshape('phone.gif')
p.shape('phone.gif')

p.pencolor('coral')
p.left(90)
p.penup()
p.goto(0,400)
p.pendown()
while p.ycor()>-200:
    p.forward(100)
    
    for i in range(150):
        p.pensize(i*1.5)
        p.forward(1)
    
    p.pensize(1)
    p.forward(-250)
    
    turtle.update()
    p.forward(-1)

    p.clear()
turtle.done()