为了账号安全,请及时绑定邮箱和手机立即绑定

去除带有 kivy 条件的物体粒子

去除带有 kivy 条件的物体粒子

慕娘9325324 2023-07-27 10:36:48
我想要的是两件事:计算屏幕上敌人的数量。并通过一个动作将所有敌人从屏幕上移除。第二个选择是让敌人随机射击class Enemy(Particle):    active = False    tex_name = 'ufo'    v = 0    def reset(self, created=False):        self.active = False        self.x = -100        self.y = -100        self.v = 0    def advance(self, nap):        if self.active:            if self.check_hit():                self.reset()                return            self.x -= 200 * nap            if self.x < -50:                self.reset()                return            self.y += self.v * nap            if self.y <= 0:                self.v = abs(self.v)            elif self.y >= self.parent.height:                self.v = -abs(self.v)        elif self.parent.spawn_delay <= 0:            self.active = True            self.x = self.parent.width + 50            self.y = self.parent.height * random()            self.v = randint(-100, 100)            self.parent.spawn_delay += 1    def check_hit(self):        if math.hypot(self.parent.player_x - self.x,                      self.parent.player_y - self.y) < 60:            return True        for b in self.parent.bullets:            if not b.active:                continue            if math.hypot(b.x - self.x, b.y - self.y) < 30:                b.reset()                return True我想要的是两件事:计算屏幕上敌人的数量。并通过一个动作将所有敌人从屏幕上移除。第二个选择是让敌人随机射击
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

您可以通过修改类来完成前两个问题PSWidget。通过向类添加两个属性enemy_count和:killall


class PSWidget(Widget):

    indices = []

    vertices = []

    particles = []

    enemy_count = 0

    killall = False

并在方法中使用这些属性update_glsl():


def update_glsl(self, nap):

    self.enemy_count = 0  # initialize enemy count


    for p in self.particles:

        if isinstance(p, Enemy) and p.active:

            if self.killall:

                p.reset()    # kill this enemy

            else:

                self.enemy_count += 1    # increment enemy count

        p.advance(nap)

        p.update()


    self.canvas.clear()


    with self.canvas:

        Mesh(fmt=self.vfmt, mode='triangles',

             indices=self.indices, vertices=self.vertices,

             texture=self.texture)


    # reset killall

    self.killall = False

因此,任何时候你想要统计活跃敌人的数量,只需使用实例enemy_count的属性即可PSWidget。每当你想杀死所有活跃的敌人时,只需设置实例killall的属性即可PSWidget。


至于你的第三个问题,请向我们展示你对此进行编码的尝试。


如果您使用的是我在另一个问题中给出的答案,我建议使用该on_enter()方法来启动游戏更新,那么您可以使用on_leave()它来停止更新。每次进入时游戏动作都会更快,MainScreen因为每次进入都会安排更多更新。MainScreen这是处理该问题的修改:


class MainScreen(Screen):

    started = BooleanProperty(False)


    def on_enter(self, *args):

        if not self.started:

            self.ids.game.initialize()

            self.started = True

        self.update_event = Clock.schedule_interval(self.ids.game.update_glsl, 1.0/60.0)


    def on_leave(self, *args):

        if self.update_event is not None:

            self.update_event.cancel()


查看完整回答
反对 回复 2023-07-27
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号