.pos = pos self.pos0 = pos self.size = size self.f = f def draw(self): screen.draw.filled_rect(Rect((10*self.f*self.pos[0] + 400, -10*self.f*self.pos[1] + 300), self.size), 'hot pink') def update(self, t): df = 1 + (2 - 1.5) * sin(t * 3) / 8 self.pos = self.pos0[0] * df, self.pos0[1] * df ... t = 0 def draw(): screen.clear() for p in particles: p.draw() def update(dt): global t t += dt for p in particles: p.update(t)
- 剧中爱心跳动时,靠中间的点波动的幅度更大,有一种扩张的效果。所以再根据每个点距离原点的远近,再加上一个系数,离得越近,系数越大。
class Particle(): ... def update(self, t): df = 1 + (2 - 1.5 * self.f) * sin(t * 3) / 8 self.pos = self.pos0[0] * df, self.pos0[1] * df
- 最后再用同样的方法画一个更大一点的爱心,这个爱心不需要跳动,只要每一帧随机绘制就可以了。
def draw(): ... t = 0 while t < 2*pi: f = random.gauss(1.1, 0.1) x = 16*sin(t)**3 y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t) size = (random.uniform(0.5,2.5), random.uniform(0.5,2.5)) screen.draw.filled_rect(Rect((10*f*x + 400, -10*f*y + 300), size), 'hot pink') t += dt * 3
合在一起,搞定!
总结一下,就是在原本的基础爱心曲线上加上一个正态分布的随机量、一个随时间变化的正弦函数和一个跟距离成反比的系数,外面再套一层更大的随机爱心,就得到类似剧中的跳动爱心效果。
但话说回来,真有人会在考场上这么干吗?
除非真的是超级大学霸,不然就是食堂伙食太好--
吃太饱撑的……
代码已开源:python666.cn/c/9
如二创发布请注明代码来源:Crossin的编程教室
|