python 如何在manim中进行碰撞?

nbnkbykc  于 2023-05-21  发布在  Python
关注(0)|答案(1)|浏览(130)

我怎样才能在我的代码中做一个弹性碰撞,当条件语句为真时,只向前移动子弹,而不反弹,我错了吗?

class Problem2(Scene):
    def construct(self):
        square = Square(side_length=3)
        string = Line(square.get_corner(
            UP), [0, 4, 0], buff=0)

        bullet = Circle(radius=0.2, fill_color=GREY, fill_opacity=1)
        bullet.shift(6*LEFT)

        def updatebullet(bullet, dt):
            bullet_vel = 2
            bullet.shift(bullet_vel*dt)

            if bullet.get_x() >= square.get_x():
                bullet_vel = -bullet_vel

        bullet.add_updater(updatebullet)

        self.play(FadeIn(square, string))
        self.play(FadeIn(bullet))
        self.wait(10)
2nbm6dog

2nbm6dog1#

class Problem2(Scene):
    def construct(self):
        square = Square(side_length=3)
        string = Line(square.get_corner(
            UP), [0, 4, 0], buff=0)

        bullet = Circle(radius=0.2, fill_color=GREY, fill_opacity=1)
        bullet.shift(6*LEFT+DOWN)
        self.flag = False
        

        def updatebullet(bullet: Mobject, dt):
            if bullet.get_x() >= square.get_x() or self.flag:
                bullet_vel = -2
                self.flag = True
            else:
                bullet_vel = 2
            bullet.shift(np.array([bullet_vel, 0, 0])*dt)

        bullet.add_updater(updatebullet)

        self.play(FadeIn(square, string))
        self.play(FadeIn(bullet))
        self.wait(10)

你的问题是,每次调用函数时,bullet_vel都被自动分配给2,然后移位完成,然后它被更改。这意味着更改从未生效,因为每次调用该函数时都会重置。我在这段代码中所做的就是在子弹移动之前移动速度的变化(我还添加了一个标志,这样它就不会在正负速度之间交替出现)

相关问题