【问题标题】:Creating multiple Enemies in kivy game在 kivy 游戏中创建多个敌人
【发布时间】:2020-04-29 10:22:00
【问题描述】:

我目前正在 kivy 开发一款太空探索者游戏。我有一艘宇宙飞船,它向敌人发射子弹。敌人向右移动,当他们撞到边界时,他们向左转,这种情况一次又一次地发生。一切都很完美。我可以射击并且敌人正在移动。但问题是我不能制造多个敌人。我必须为每个敌人设置一个自己的类,并一次又一次地编写相同的代码。我的想法是创建一个敌人列表,然后从列表中显示它们。所以看起来有多个敌人。但是我不知道我该怎么做,而且我从一天开始就失败了。另外,当您有其他想法时,如果您提出建议,那就太好了。这是我的代码。

敌人类:

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 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)

App 类

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. 

【问题讨论】:

    标签: python for-loop kivy kivy-language


    【解决方案1】:

    面向对象编程的主要概念之一是每个对象处理自己的行为。所以,你的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()
    

    【讨论】:

    • 嗨,太棒了。非常感谢。但是我有两个问题,我可以控制敌人的数量吗?例如,我想要 6 个敌人,而不是在 5 秒内添加敌人。我该如何处理分数。我可以处理碰撞,但我无法处理 kv 文件中的分数。我无法从 kv 文件中获取参考
    • 我修好了,我只是需要一个或循环来处理我希望的敌人。但是你能帮我得分吗?在我的 kv 文件中,我有文本:str(root.enemy.score)。在敌人类中,我有 score = NumericProperty(0) 并且每次碰撞时我都会添加 self.score += 1.但我收到一个错误,它无法获取我的标签的引用。我无法将我的标签与我的敌人阶级联系起来
    • 我认为 tat 应该作为一个单独的问题提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多