likes
comments
collection
share

520你准备表白了么?

作者站长头像
站长
· 阅读数 42

春暖花开,万物复苏,五一小长假已经结束了,接着迎来的就是重要的520表白日了,今天就给大家带来一个表白的爱心设计实现,给你的表白增加更多成功的可能性

设计爱心

既然是心,那就要做的生动,这样才真实,足够用心,才能感动对方。

  • 心的颜色是红的,太红了有点影响美观,选择淡一点的粉红,然后做一个放射性的效果;
  • 心的跳动时由小变大的,那就需要设计类似的动画;
  • 设计居中显示我们要说的话。

好了,那么开始吧。

首先创建一个for_love.py的文件:

初始化显示的大小:

CANVAS_WIDTH = 640CANVAS_HEIGHT = 480CANVAS_CENTER_X = CANVAS_WIDTH / 2CANVAS_CENTER_Y = CANVAS_HEIGHT / 2IMAGE_ENLARGE = 11# 设置心的颜色HEART_COLOR = "#FF99CC"

定义居中显示:

def center_window(root, width, height):    screenwidth = root.winfo_screenwidth()  # 获取显示屏宽度
    screenheight = root.winfo_screenheight()  # 获取显示屏高度
    size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) /
                            2, (screenheight - height) / 2)  # 设置窗口居中参数
    root.geometry(size)  # 让窗口居中显示

实现心的跳动效果:

def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):    x = 16 * (sin(t) ** 3)
    y = -(13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t))
    # 放大
    x *= shrink_ratio    y *= shrink_ratio    # 移到画布中央
    x += CANVAS_CENTER_X
    y += CANVAS_CENTER_Y
    return int(x), int(y)

def scatter_inside(x, y, beta=0.15):    ratio_x = - beta * log(random.random())
    ratio_y = - beta * log(random.random())
    dx = ratio_x * (x - CANVAS_CENTER_X)
    dy = ratio_y * (y - CANVAS_CENTER_Y)
    return x - dx, y - dy

def shrink(x, y, ratio):    force = -1 / (((x - CANVAS_CENTER_X) ** 2 +
                   (y - CANVAS_CENTER_Y) ** 2) ** 0.6)
    dx = ratio * force * (x - CANVAS_CENTER_X)
    dy = ratio * force * (y - CANVAS_CENTER_Y)
    return x - dx, y - dy

爱心的放射效果:

 # 爱心内扩散
        for _x, _y in list(self._points):
            for _ in range(3):                x, y = scatter_inside(_x, _y, 0.05)
                self._edge_diffusion_points.add((x, y))
        # 爱心内再次扩散
        point_list = list(self._points)
        for _ in range(4000):            x, y = random.choice(point_list)
            x, y = scatter_inside(x, y, 0.17)
            self._center_diffusion_points.add((x, y))

光环,轮廓:

 # 光环
        heart_halo_point = set()
        for _ in range(halo_number):
            t = random.uniform(0, 2 * pi)
            x, y = heart_function(t, shrink_ratio=11.6)
            x, y = shrink(x, y, halo_radius)
            if (x, y) not in heart_halo_point:                heart_halo_point.add((x, y))
                x += random.randint(-14, 14)
                y += random.randint(-14, 14)
                size = random.choice((1, 2, 2))
                all_points.append((x, y, size))
        # 轮廓
        for x, y in self._points:            x, y = self.calc_position(x, y, ratio)
            size = random.randint(1, 3)
            all_points.append((x, y, size))

好了,把相关内容组合后:

root = Tk()
    root.title("For Love")
    center_window(root, CANVAS_WIDTH, CANVAS_HEIGHT)  # 窗口居中显示
    canvas = Canvas(root, bg='black', height=CANVAS_HEIGHT, width=CANVAS_WIDTH)
    canvas.pack()
    heart = Heart()
    draw(root, canvas, heart)
    Label(root, text="I love you", bg="black", fg="#FF99CC", font="Helvetic 20 bold").place(
        relx=.5, rely=.5, anchor=CENTER)
    root.mainloop()

运行后看看效果吧。

520你准备表白了么?

颜色和内容,可以自己去修改。

能不能成功就靠自己了,我只能帮你们到这里了,哈哈,希望天下所有有情人终成眷属。

需要游戏素材,和完整代码的,关注公众号大嗨无量,回复:520获取,长期有效。

转载自:https://juejin.cn/post/7365848711509835803
评论
请登录