Skip to content
Advertisement

Remove object particle with kivy condition

What I want is two things: count the number of enemies on the screen. And remove all enemies from the screen with a contion. The second chose is to allow enemies to shoot randomly

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

What I want is two things: count the number of enemies on the screen. And remove all enemies from the screen with a contion. The second chose is to allow enemies to shoot randomly

Advertisement

Answer

You can accomplish the first two of your questions by modifying the PSWidget class. By adding two attributes enemy_count and killall to the class:

class PSWidget(Widget):
    indices = []
    vertices = []
    particles = []
    enemy_count = 0
    killall = False

And using those attributes in the update_glsl() method:

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

So, anytime you want the count of active enemies, just use the enemy_count attribute of the PSWidget instance. And whenever you want to kill all the active enemies, just set the killall attribute of the PSWidget instance.

As far as your third question, show us your attempt at coding that.

If you are using an answer that I gave in another question, where I suggested using the on_enter() method to start the game updates, then you can use on_leave() to stop the updates. The game movements are faster every time you enter MainScreen because more updates are scheduled on each entry. Here is a modified MainScreen that handles that handles that issue:

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()
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement