在 kivy 游戏中创建多个敌人

Creating multiple Enemies in kivy game

我目前正在 kivy 开发 space inavders 游戏。我有一艘 space 飞船,它向敌人发射子弹。敌人向右移动,当他们到达边界时他们向左转,这种情况一次又一次发生。一切都很完美。我可以射击,而敌人正在移动。但问题是我不能制造多个敌人。我必须为每个敌人放一个自己的 class 并一次又一次地编写相同的代码。我的想法是我将创建一个敌人列表,然后从列表中显示它们。以至于看起来有多个敌人。但是我不知道我该怎么做,当你有另一个想法时,我无法从一个 day.Also 做到这一点,如果你提出建议,那就太好了。这是我的代码。

敌人class:

class Enemy(Widget):
    def collision(self,ball,enemy,enemy1):
        if self.collide_widget(ball):
            enemy.y = randint(300,500)
            enemy1.y = randint(300,500)
            ball.x = -1000
            ball.y = self.height / self.width


我的主游戏Class:

class SapceGame(Widget):
enemy = ObjectProperty(None)
    enemy = ObjectProperty(None)
    x_change = NumericProperty(3)
    y_change = NumericProperty(-50)

    def enemy_movement(self, *args):
        self.enemy.x -= self.x_change
        if self.enemy.x  >= self.width -64:
            self.x_change = 3
            self.enemy.y += self.y_change
        elif self.enemy.x  <=0:
            self.x_change = -3
            self.enemy.y += self.y_change
        elif self.enemy.y < 0:
            print('Game Over')
    def update(self,dt):
        self.enemy_movement()

我的kv文件:

<Enemy>:
    size: 64,64
    canvas:
        Rectangle:
            pos:self.pos
            size: self.size
            source:'alien.png'
<SpaceGame>:
    ball: pong_ball
    ship: space_ship
    enemy: enemy_ship
    Enemy:
       id:enemy_ship
       x:root.random_generator(2,root.width-64)
       y:root.random_generator(300,550)

应用程序 class

class SpaceApp(App):

    def build(self):
        game = PongGame()

        # pro second 60 frames are shown
        Clock.schedule_interval(game.update, 1.0/60.0)

        return game



SpaceApp().run()


Now when I want to create more enemies I have to write the same code again and again. 

面向对象编程的主要概念之一是每个对象处理自己的行为。所以,你的 Enemy 对象应该知道如何移动。然后,您只需要保留 Enemy 个对象的列表,并告诉每个对象在每次更新时执行其移动行为。

这是您的代码的修改版本:

from random import randint
from kivy.app import App
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty, NumericProperty, ListProperty
from kivy.uix.widget import Widget


class Enemy(Widget):
    x_change = NumericProperty(3)
    y_change = NumericProperty(-50)

    def collision(self,ball,enemy,enemy1):
        if self.collide_widget(ball):
            enemy.y = randint(300,500)
            enemy1.y = randint(300,500)
            ball.x = -1000
            ball.y = self.height / self.width

    def move(self, *args):
        self.x -= self.x_change
        if self.x  >= self.parent.width -64:
            self.x_change = 3
            self.y += self.y_change
        elif self.x  <=0:
            self.x_change = -3
            self.y += self.y_change
        if self.y < 0:
            print('Game Over')
            App.get_running_app().stop_game()


class SpaceGame(Widget):
    enemies = ListProperty([])

    def add_enemy(self, *args):
        enemy = Enemy()
        enemy.pos = (randint(0, self.width - 64), self.height - 64)
        self.add_widget(enemy)
        self.enemies.append(enemy)

    def update(self,dt):
        for enemy in self.enemies:
            enemy.move()

Builder.load_string('''
<Enemy>:
    size_hint: None, None
    size: 64,64
    canvas:
        Rectangle:
            pos:self.pos
            size: self.size
            source:'alien.png'
''')


class SpaceApp(App):

    def build(self):
        game = SpaceGame()

        # add enemies at 5 second intervals
        self.new_enemy_event = Clock.schedule_interval(game.add_enemy, 5)

        # pro second 60 frames are shown
        self.updateEvent = Clock.schedule_interval(game.update, 1.0/60.0)

        return game

    def stop_game(self):
        self.updateEvent.cancel()
        self.new_enemy_event.cancel()


SpaceApp().run()