Создание нескольких врагов в кивой игре - PullRequest
2 голосов
/ 29 апреля 2020

В настоящее время я работаю над игрой космических злоумышленников в Киви. У меня есть космический корабль, и он стреляет пулями во врагов. Враги движутся вправо, и когда они достигают границы, они поворачивают налево, и это происходит снова и снова. Все работает отлично. Я могу стрелять и враг движется. Но проблема в том, что я не могу создать несколько врагов. Я должен поставить собственный класс для каждого врага и писать один и тот же код снова и снова. Моя идея состояла в том, что я создам список врагов, а затем выведу их из списка. Так что похоже, что есть несколько врагов. Но у меня нет идей, как я могу это сделать, и я не могу сделать это с одного дня. Также, когда у вас есть другие идеи, было бы здорово, если бы вы их предложили. Вот мой код.

Класс врага:

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

Мой файл кв:

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

1 Ответ

2 голосов
/ 01 мая 2020

Одной из основных концепций объектно-ориентированного программирования является то, что каждый объект обрабатывает свое собственное поведение. Итак, ваш 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()
...