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()
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()
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()
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)
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)
def setUp(self): self.window = Window(100, 100)
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)
def setUp(self): self.w = Window(2, 2) self.world = World(self.w)