Arcade实例应用(二)

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

 效果图

雪人会不断画一个弧线。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A Python 萌新花花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值