Arcade实例应用(二)
今天我们来学习一下如何用arcade画一个会动的雪人
引入库
from arcade import *
from arcade import color
from sympy import sin
sympy我之前的一篇关于计算器的文章里面提到过,这里就不多说了,大家知道他的功能非常强大就好。然后使用from import *,这个可以让我们在写arcade的函数的时候不用带上arcade。另外要提的一点就是必须另外import一下color,不然直接用color会报错(我也不知道为啥,知道的大佬可以给解答一下下)。
画东西
我的想法是一半是草地,一半是天空,中间有个雪人动。
大概长成这个样子(画的不好别喷)
草地
草地的代码很简单,可以看作就是一个长方形,长是屏幕的长,宽是屏幕的三分之一。
draw_lrtb_rectangle_filled(0, SCREEN_WIDTH, SCREEN_HEIGHT / 3, 0, color.AIR_SUPERIORITY_BLUE)
SCREEN_WIDTH, SCREEN_HEIGHT是开始的时候定义的两个变量,用来确定窗口的高度和宽度。我设置的是宽800,高600,因为个人显示屏分辨率是1080*720的元音,不得不把屏幕做的小一点。
雪人主体
雪人的主题可以看作是三个圆,一个比一个大。
draw_circle_filled(x, 60 + y, 60, color.WHITE)
draw_circle_filled(x, 140 + y, 50, color.WHITE)
draw_circle_filled(x, 200 + y, 40, color.WHITE)
draw_circle_filled(x - 15, 210 + y, 5, color.BLACK)
draw_circle_filled(x + 15, 210 + y, 5, color.BLACK)
第一部分是花了三个圆,可以看到是40,50,60,半径一个比一个大。第二部分是两个眼睛,这个画的圆必须一样大,不然挺丑的。这里面我用了x,主要是为了用着方便。
雪人动起来
想让雪人动起来,其实并不难。因为我们这个是一个比较“原始”的编程语言,并没有预设好的动画功能。所以我们可以通过动画的原理去实现动画的效果。动画是通过把人物的表情、动作、变化等分解后画成许多动作瞬间的画幅,再用摄影机连续拍摄成一系列画面,给视觉造成连续变化的图画。它的基本原理与电影、电视一样,都是视觉暂留原理。医学证明人类具有“视觉暂留”的特性,人的眼睛看到一幅画或一个物体后,在0.34秒内不会消失。利用这一原理,在一幅画还没有消失前播放下一幅画,就会给人造成一种流畅的视觉变化效果。所以我们可以让雪人高速短距离运动,让人看上去雪人在平滑且连续的运动,但是实际上雪人是在走直线。
draw_snow_person(on_draw.snow_person1_x, on_draw.snow_person1_y)
on_draw.snow_person1_x += 1
x = on_draw.snow_person1_x
on_draw.snow_person1_y = 50*sin(0.1*x) + 140
on_draw.snow_person1_x = 150
on_draw.snow_person1_y = 140
schedule(on_draw, 1/60)
先是画一个雪人,用上面设置好的x和y,来确定雪人的位置。通过x不断+1,让雪人向右运动。用y = 50*sin(0.1*x) + 140,来确定雪人在y轴上的运动轨迹。arcade的schedule函数可以把一个东西以一定的频率不断画出。
总代码
#This is what so-called fancy
from arcade import *
from arcade import color
from sympy import sin
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
def draw_grass():
""" Draw the ground """
draw_lrtb_rectangle_filled(0, SCREEN_WIDTH, SCREEN_HEIGHT / 3, 0, color.AIR_SUPERIORITY_BLUE)
def draw_snow_person(x, y):
""" Draw a snow person """
# Snow
draw_circle_filled(x, 60 + y, 60, color.WHITE)
draw_circle_filled(x, 140 + y, 50, color.WHITE)
draw_circle_filled(x, 200 + y, 40, color.WHITE)
# Eyes
draw_circle_filled(x - 15, 210 + y, 5, color.BLACK)
draw_circle_filled(x + 15, 210 + y, 5, color.BLACK)
def on_draw(y):
""" Draw everything """
start_render()
draw_grass()
draw_snow_person(on_draw.snow_person1_x, on_draw.snow_person1_y)
# Add one to the x value, making the snow person move right
# Negative numbers move left. Larger numbers move faster.
on_draw.snow_person1_x += 1
x = on_draw.snow_person1_x
on_draw.snow_person1_y = 50*sin(0.1*x) + 140
# Create a value that our on_draw.snow_person1_x will start at.
on_draw.snow_person1_x = 150
on_draw.snow_person1_y = 140
def main():
open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing with Functions")
set_background_color(color.DARK_BLUE)
# Call on_draw every 60th of a second.
schedule(on_draw, 1/60)
run()
# Call the main function to get the program started.
try:
if __name__ == "__main__":
main()
except SyntaxError:
print("error")
pass
效果图
雪人会不断画一个弧线。