Пример #1
0
class Menu:
    def __init__(self):
        # Création de la fenêtre. Taille : 300x200. Fond : Blanc. Title : "Menu".
        self.window = Window(300, 200, Colors.WHITE.value)
        self.window.title = "Menu"

        # Création de deux World : un pour le menu, l'autre pour le jeu
        self.gworld = World(self.window)
        self.mworld = World(self.window)

        # Création du jeu :
        #  - Un label "JEU" en 10, 10 de couleur noire et écrit en arial 18
        #  - Un bouton "Retour" en 10, 100 qui retourne au menu
        #  - Un bouton "Quitter" en 150, 100 qui quitte le jeu
        self.labeljeu = Label(Vec2(10, 10), "JEU", Colors.BLACK.value,
                              Font("arial", 18))
        self.button1jeu = Button(Vec2(10, 50), "Retour", self.menu)
        self.button2jeu = Button(Vec2(150, 50), "Quitter", self.quitter)

        # Récupération de l'UISystem du monde du jeu et ajout des widgets
        self.uisystemjeu = self.gworld.get_system(UISystem)
        self.uisystemjeu.add_widget(self.labeljeu)
        self.uisystemjeu.add_widget(self.button1jeu)
        self.uisystemjeu.add_widget(self.button2jeu)

        # Création du menu :
        #  - Un label "Menu" en 10, 10 de couleur noire et écrit en arial 18 gras
        #  - Un bouton "Jouer" en 10, 100 qui va au jeu
        #  - Un bouton "Quitter" en 150, 100 qui quitte le jeu
        self.labelmenu = Label(Vec2(10, 10), "MENU", Colors.BLACK.value,
                               Font("arial", 18, True))
        self.button1menu = Button(Vec2(10, 50), "Jouer", self.jouer)
        self.button2menu = Button(Vec2(150, 50), "Quitter", self.quitter)

        # Récupération de l'UISystem du monde du menu et ajout des widgets
        self.uisystemmenu = self.mworld.get_system(UISystem)
        self.uisystemmenu.add_widget(self.labelmenu)
        self.uisystemmenu.add_widget(self.button1menu)
        self.uisystemmenu.add_widget(self.button2menu)

        # Définition du World actuel à celui du menu et lancement de la fenêtre
        self.window.world = self.mworld
        self.window.run()

    # Fonction allant sur le menu
    def menu(self):
        # Définition du World actuel à celui du menu
        self.window.world = self.mworld

    # Fonction allant sur le jeu
    def jouer(self):
        # Définition du World actuel à celui du jeu
        self.window.world = self.gworld

    # Fonction quittant la fenêtre
    def quitter(self):
        # Ferme la fenêtre
        self.window.stop()
Пример #2
0
    def __init__(self):
        # Création de la fenêtre de jeu de taille 800x400, de fond blanc et titre "Pong"
        self.window = Window(800, 400, Colors.WHITE.value)
        self.window.title = "Pong"

        # Définition du callback OUTOFWINDOW
        self.window.set_callback(WindowCallbacks.OUTOFWINDOW, self.outofwindow)

        # Création de l'entité pour la barre du joueur à gauche avec :
        #  - Un PositionComponent avec les positions 10, 175
        #  - Un SpriteComponent avec le sprite texture.png que l'on redimensionne en 20, 50
        #  - Un ControlComponent avec un ControlType UPDOWN auquel on définit les touches à Z et S (azerty)
        #  - Un PhysicsComponent sans l'affection par la gravité
        self.j1 = Entity()
        self.j1.add_component(PositionComponent(Vec2(10, 175)))
        spritej1 = self.j1.add_component(SpriteComponent("images/texture.png"))
        spritej1.size = Vec2(20, 50)
        controlj1 = self.j1.add_component(ControlComponent(ControlType.UPDOWN))
        controlj1.set_control(Controls.UPJUMP, const.K_w)
        controlj1.set_control(Controls.DOWN, const.K_s)
        self.j1.add_component(PhysicsComponent(False))

        # Création de l'entité pour la barre du joueur à droite avec :
        #  - Un PositionComponent avec les positions 770, 175
        #  - Un SpriteComponent avec le sprite texture.png que l'on redimensionne en 20, 50
        #  - Un ControlComponent avec un ControlType UPDOWN auquel on définit les touches aux flèches haut et bas
        #  - Un PhysicsComponent sans l'affection par la gravité
        self.j2 = Entity()
        self.j2.add_component(PositionComponent(Vec2(770, 175)))
        spritej2 = self.j2.add_component(SpriteComponent("images/texture.png"))
        spritej2.size = Vec2(20, 50)
        controlj2 = self.j2.add_component(ControlComponent(ControlType.UPDOWN))
        controlj2.set_control(Controls.UPJUMP, const.K_UP)
        controlj2.set_control(Controls.DOWN, const.K_DOWN)
        self.j2.add_component(PhysicsComponent(False))

        # Création de l'entité pour la balle avec :
        #  - Un PositionComponent avec les positions 390, 190
        #  - Un SpriteComponent avec le sprite texture.png que l'on redimensionne en 20, 20
        #  - Un PhysicsComponent sans l'affection par la gravité dont on définit le callback de collision
        #  - Un MoveComponent avec comme direction random
        self.ball = Entity()
        self.ball.add_component(PositionComponent(Vec2(390, 190)))
        spriteballe = self.ball.add_component(SpriteComponent("images/texture.png"))
        spriteballe.size = Vec2(20, 20)
        physball = self.ball.add_component(PhysicsComponent(False))
        physball.callback = self.collision
        self.ball.add_component(MoveComponent(Vec2(randint(20, 60), randint(20, 60))))

        # Ajout des entités au monde via l'EntitySystem
        entitysystem = self.window.world.get_system(EntitySystem)
        entitysystem.add_entity(self.j1)
        entitysystem.add_entity(self.j2)
        entitysystem.add_entity(self.ball)

        # Lancement du jeu
        self.window.run()
Пример #3
0
    def __init__(self):
        self.window = Window(800, 400, Colors.WHITE.value)
        self.window.title = "Pong"

        self.window.set_callback(WindowCallbacks.OUTOFWINDOW, self.outofwindow)

        self.j1 = Entity()
        self.j1.add_component(PositionComponent(Vec2(10, 175)))
        spritej1 = self.j1.add_component(SpriteComponent("images/sprite0.png"))
        spritej1.size = Vec2(20, 50)
        controlj1 = self.j1.add_component(
            ControlComponent(ControlType.UPDOWN, 3))
        controlj1.set_control(Controls.UPJUMP, const.K_w)
        controlj1.set_control(Controls.DOWN, const.K_s)
        self.j1.add_component(PhysicsComponent(False))

        self.j2 = Entity()
        self.j2.add_component(PositionComponent(Vec2(770, 175)))
        spritej2 = self.j2.add_component(SpriteComponent("images/sprite0.png"))
        spritej2.size = Vec2(20, 50)
        controlj2 = self.j2.add_component(
            ControlComponent(ControlType.UPDOWN, 3))
        controlj2.set_control(Controls.UPJUMP, const.K_UP)
        controlj2.set_control(Controls.DOWN, const.K_DOWN)
        self.j2.add_component(PhysicsComponent(False))

        self.ball = Entity()
        self.ball.add_component(PositionComponent(Vec2(390, 190)))
        spriteballe = self.ball.add_component(
            SpriteComponent("images/sprite0.png"))
        spriteballe.size = Vec2(20, 20)
        physball = self.ball.add_component(PhysicsComponent(False))
        physball.callback = self.collision
        self.ball.add_component(
            MoveComponent(Vec2(randint(50, 100), randint(50, 100))))

        entitysystem = self.window.world.get_system(EntitySystem)
        entitysystem.add_entity(self.j1)
        entitysystem.add_entity(self.j2)
        entitysystem.add_entity(self.ball)

        self.window.run()
Пример #4
0
class Jeu:
    def __init__(self):
        self.window = Window(800, 400, Colors.WHITE.value)
        self.window.title = "Pong"

        self.window.set_callback(WindowCallbacks.OUTOFWINDOW, self.outofwindow)

        self.j1 = Entity()
        self.j1.add_component(PositionComponent(Vec2(10, 175)))
        spritej1 = self.j1.add_component(SpriteComponent("images/sprite0.png"))
        spritej1.size = Vec2(20, 50)
        controlj1 = self.j1.add_component(
            ControlComponent(ControlType.UPDOWN, 3))
        controlj1.set_control(Controls.UPJUMP, const.K_w)
        controlj1.set_control(Controls.DOWN, const.K_s)
        self.j1.add_component(PhysicsComponent(False))

        self.j2 = Entity()
        self.j2.add_component(PositionComponent(Vec2(770, 175)))
        spritej2 = self.j2.add_component(SpriteComponent("images/sprite0.png"))
        spritej2.size = Vec2(20, 50)
        controlj2 = self.j2.add_component(
            ControlComponent(ControlType.UPDOWN, 3))
        controlj2.set_control(Controls.UPJUMP, const.K_UP)
        controlj2.set_control(Controls.DOWN, const.K_DOWN)
        self.j2.add_component(PhysicsComponent(False))

        self.ball = Entity()
        self.ball.add_component(PositionComponent(Vec2(390, 190)))
        spriteballe = self.ball.add_component(
            SpriteComponent("images/sprite0.png"))
        spriteballe.size = Vec2(20, 20)
        physball = self.ball.add_component(PhysicsComponent(False))
        physball.callback = self.collision
        self.ball.add_component(
            MoveComponent(Vec2(randint(50, 100), randint(50, 100))))

        entitysystem = self.window.world.get_system(EntitySystem)
        entitysystem.add_entity(self.j1)
        entitysystem.add_entity(self.j2)
        entitysystem.add_entity(self.ball)

        self.window.run()

    def collision(self, entity, others, space, data):
        move = entity.get_component(MoveComponent)
        move.direction = Vec2(-move.direction.x, move.direction.y)

    def outofwindow(self, obj, pos):
        if obj == self.j1:
            position = self.j1.get_component(PositionComponent)
            if pos.y <= obj.rect.height / 2:
                position.position = Vec2(10, obj.rect.height / 2)
            else:
                position.position = Vec2(10, 400 - obj.rect.height / 2)

        elif obj == self.j2:
            position = self.j2.get_component(PositionComponent)
            if pos.y <= obj.rect.height / 2:
                position.position = Vec2(770, obj.rect.height / 2)
            else:
                position.position = Vec2(770, 400 - obj.rect.height / 2)

        else:
            if pos.x < 10 or pos.x > 790:
                position = self.ball.get_component(PositionComponent)
                position.position = Vec2(390, 190)
                self.ball.get_component(MoveComponent).direction = Vec2(
                    randint(50, 100), randint(50, 100))
            else:
                move = self.ball.get_component(MoveComponent)
                move.direction = Vec2(move.direction.x, -move.direction.y)
Пример #5
0
class Jeu:
    def __init__(self):
        # Création de la fenêtre de jeu de taille 800x400, de fond blanc et titre "Pong"
        self.window = Window(800, 400, Colors.WHITE.value)
        self.window.title = "Pong"

        # Définition du callback OUTOFWINDOW
        self.window.set_callback(WindowCallbacks.OUTOFWINDOW, self.outofwindow)

        # Création de l'entité pour la barre du joueur à gauche avec :
        #  - Un PositionComponent avec les positions 10, 175
        #  - Un SpriteComponent avec le sprite texture.png que l'on redimensionne en 20, 50
        #  - Un ControlComponent avec un ControlType UPDOWN auquel on définit les touches à Z et S (azerty)
        #  - Un PhysicsComponent sans l'affection par la gravité
        self.j1 = Entity()
        self.j1.add_component(PositionComponent(Vec2(10, 175)))
        spritej1 = self.j1.add_component(SpriteComponent("images/texture.png"))
        spritej1.size = Vec2(20, 50)
        controlj1 = self.j1.add_component(ControlComponent(ControlType.UPDOWN))
        controlj1.set_control(Controls.UPJUMP, const.K_w)
        controlj1.set_control(Controls.DOWN, const.K_s)
        self.j1.add_component(PhysicsComponent(False))

        # Création de l'entité pour la barre du joueur à droite avec :
        #  - Un PositionComponent avec les positions 770, 175
        #  - Un SpriteComponent avec le sprite texture.png que l'on redimensionne en 20, 50
        #  - Un ControlComponent avec un ControlType UPDOWN auquel on définit les touches aux flèches haut et bas
        #  - Un PhysicsComponent sans l'affection par la gravité
        self.j2 = Entity()
        self.j2.add_component(PositionComponent(Vec2(770, 175)))
        spritej2 = self.j2.add_component(SpriteComponent("images/texture.png"))
        spritej2.size = Vec2(20, 50)
        controlj2 = self.j2.add_component(ControlComponent(ControlType.UPDOWN))
        controlj2.set_control(Controls.UPJUMP, const.K_UP)
        controlj2.set_control(Controls.DOWN, const.K_DOWN)
        self.j2.add_component(PhysicsComponent(False))

        # Création de l'entité pour la balle avec :
        #  - Un PositionComponent avec les positions 390, 190
        #  - Un SpriteComponent avec le sprite texture.png que l'on redimensionne en 20, 20
        #  - Un PhysicsComponent sans l'affection par la gravité dont on définit le callback de collision
        #  - Un MoveComponent avec comme direction random
        self.ball = Entity()
        self.ball.add_component(PositionComponent(Vec2(390, 190)))
        spriteballe = self.ball.add_component(SpriteComponent("images/texture.png"))
        spriteballe.size = Vec2(20, 20)
        physball = self.ball.add_component(PhysicsComponent(False))
        physball.callback = self.collision
        self.ball.add_component(MoveComponent(Vec2(randint(20, 60), randint(20, 60))))

        # Ajout des entités au monde via l'EntitySystem
        entitysystem = self.window.world.get_system(EntitySystem)
        entitysystem.add_entity(self.j1)
        entitysystem.add_entity(self.j2)
        entitysystem.add_entity(self.ball)

        # Lancement du jeu
        self.window.run()

    # Callback de collision
    # Activé quand la balle rencontre un joueur (étant les seuls autre entités)
    def collision(self, obj, cause):
        # On récupère le MoveComponent de la balle pour inverser sa direction en x
        move = self.ball.get_component(MoveComponent)
        move.direction = Vec2(-move.direction.x, move.direction.y)

    # Callback OUTOFWINDOW
    # Activé quand un élément sort de l'écran
    def outofwindow(self, obj, pos):
        # Si notre objet est le joueur 1
        if obj == self.j1:
            # On récupère le PositionComponent du J1 pour le "bloquer" dans l'écran
            position = self.j1.get_component(PositionComponent)
            if pos.y <= 0:
                position.position = Vec2(10, 0)
            else:
                position.position = Vec2(10, 350)

        # Si notre objet est le joueur 2
        elif obj == self.j2:
            # On récupère le PositionComponent du J2 pour le "bloquer" dans l'écran
            position = self.j2.get_component(PositionComponent)
            if pos.y <= 0:
                position.position = Vec2(770, 0)
            else:
                position.position = Vec2(770, 350)

        # Si notre objet est la balle
        else:
            # Si la balle sort de l'écran sur les cotés
            if pos.x < 10 or pos.x > 790:
                # On replace la balle au centre
                position = self.ball.get_component(PositionComponent)
                position.position = Vec2(390, 190)
                self.ball.get_component(MoveComponent).direction = Vec2(randint(1, 5), randint(1, 5))
            # Si la balle sort de l'écran par le haut
            else:
                # On inverse la direction y du movement de la base
                move = self.ball.get_component(MoveComponent)
                move.direction = Vec2(move.direction.x, -move.direction.y)
Пример #6
0
 def setUp(self):
     self.window = Window(100, 100)
Пример #7
0
class WindowTests(unittest.TestCase):
    def setUp(self):
        self.window = Window(100, 100)

    def test_update_rate(self):
        self.assertEqual(self.window.update_rate, 60)

    def test_title(self):
        self.assertEqual(self.window.title, "PyEngine")
        self.window.title = "OUI"
        self.assertEqual(self.window.title, "OUI")

    def test_is_running(self):
        self.assertFalse(self.window.is_running)
        self.window.run()
        self.assertFalse(self.window.is_running)  # Code blocked while window run.

    def test_color(self):
        self.assertEqual(self.window.color, Color(0, 0, 0))
        self.window.color = Color(2, 4, 5)
        self.assertEqual(self.window.color, Color(2, 4, 5))

    def test_size(self):
        self.assertEqual(self.window.size, (100, 100))
        self.window.size = (110, 110)
        self.assertEqual(self.window.size, (110, 110))

    def test_debug(self):
        self.assertFalse(self.window.debug)
        self.window.debug = True
        self.assertTrue(self.window.debug)

    def test_callbacks(self):
        self.window.set_callback(WindowCallbacks.STOPWINDOW, self.cstop)
        self.window.set_callback(WindowCallbacks.CHANGEWORLD, self.cworld)
        self.window.set_callback(WindowCallbacks.OUTOFWINDOW, self.cout)
        self.window.call(WindowCallbacks.OUTOFWINDOW, None, None)
        self.window.call(WindowCallbacks.CHANGEWORLD)
        self.window.run()

    def cstop(self):
        self.assertFalse(self.window.is_running)

    def cworld(self):
        pass

    def cout(self, entity, pos):
        self.assertIsNone(entity)
        self.assertIsNone(pos)
Пример #8
0
 def setUp(self):
     self.w = Window(2, 2)
     self.world = World(self.w)