使用kivy条件删除对象粒子

2024-05-16 02:11:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要的是两件事: 计算屏幕上敌人的数量。用一个contion从屏幕上移除所有敌人。 第二种选择是允许敌人随机射击

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

我想要的是两件事: 计算屏幕上敌人的数量。用一个contion从屏幕上移除所有敌人。 第二种选择是允许敌人随机射击


Tags: selffalsetrue数量returnif屏幕def
1条回答
网友
1楼 · 发布于 2024-05-16 02:11:32

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

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

因此,任何时候,只要使用PSWidget实例的enemy_count属性,就可以计算活动敌人的数量。无论何时,只要设置PSWidget实例的killall属性,就可以杀死所有活动的敌人

至于你的第三个问题,告诉我们你在编码方面的尝试

如果您使用的是我在另一个问题中给出的答案,我建议使用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()

相关问题 更多 >