Ajout des bonus #6
|
@ -3,7 +3,6 @@ Le jeux principale.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from telnetlib import DO
|
|
||||||
from engine import Plugin, Scene
|
from engine import Plugin, Scene
|
||||||
from engine.ecs import Entity, World
|
from engine.ecs import Entity, World
|
||||||
from engine.math import Vec2
|
from engine.math import Vec2
|
||||||
|
@ -109,6 +108,54 @@ class StartAnimation(float):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TimeUntilBonus:
|
||||||
|
"""
|
||||||
|
ressource qui represente le temps restant avant d'avoir le bonus
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, time: float, world: World):
|
||||||
|
self.time = time
|
||||||
|
self.started_time = int(world[Time])
|
||||||
|
|
||||||
|
def is_ended(self, world: World):
|
||||||
|
return world[Time] - self.started_time >= self.time
|
||||||
|
|
||||||
|
def start(self, world: World):
|
||||||
|
self.started_time = world[Time]
|
||||||
|
|
||||||
|
|
||||||
|
class LastPlayerTurn:
|
||||||
|
"""
|
||||||
|
un composant qui represente le dernier joueur qui a joué.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class HasBonus:
|
||||||
|
"""
|
||||||
|
un composant qui represente si l'entité a un bonus
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, bonus: "Bonus", time: float, world: World):
|
||||||
|
self.bonus = bonus
|
||||||
|
self.time = time
|
||||||
|
|
||||||
|
self.start_time = world[Time]
|
||||||
|
|
||||||
|
def is_ended(self, world: World):
|
||||||
|
return world[Time] - self.start_time >= self.time
|
||||||
|
|
||||||
|
def suppr_bonus_from_entity(self, entity: Entity):
|
||||||
|
match self.bonus:
|
||||||
|
case Bonus.MULTI:
|
||||||
|
pass
|
||||||
|
case Bonus.BIG:
|
||||||
|
entity[Scale] /= 2
|
||||||
|
case Bonus.FAST:
|
||||||
|
entity[Speed] /= 2
|
||||||
|
case Bonus.REVERSE:
|
||||||
|
entity[UpKey], entity[DownKey] = entity[DownKey], entity[UpKey]
|
||||||
|
|
||||||
|
|
||||||
class Bonus(Enum):
|
class Bonus(Enum):
|
||||||
MULTI = 0
|
MULTI = 0
|
||||||
BIG = 1
|
BIG = 1
|
||||||
|
@ -120,13 +167,13 @@ class Bonus(Enum):
|
||||||
type = random.randint(0, 3)
|
type = random.randint(0, 3)
|
||||||
match type:
|
match type:
|
||||||
case 0:
|
case 0:
|
||||||
return Bonus.FAST
|
return Bonus.MULTI
|
||||||
case 1:
|
case 1:
|
||||||
return Bonus.FAST
|
return Bonus.BIG
|
||||||
case 2:
|
case 2:
|
||||||
return Bonus.FAST
|
return Bonus.FAST
|
||||||
case _:
|
case _:
|
||||||
return Bonus.FAST
|
return Bonus.REVERSE
|
||||||
|
|
||||||
|
|
||||||
def __spawn_ellements(world: World):
|
def __spawn_ellements(world: World):
|
||||||
|
@ -136,6 +183,10 @@ def __spawn_ellements(world: World):
|
||||||
|
|
||||||
world.new_entity().set(SpriteBundle(("background.jpg"), -5))
|
world.new_entity().set(SpriteBundle(("background.jpg"), -5))
|
||||||
|
|
||||||
|
world.set(
|
||||||
|
TimeUntilBonus(5, world),
|
||||||
|
)
|
||||||
|
|
||||||
# Mon mur de gauche
|
# Mon mur de gauche
|
||||||
world.new_entity().set(
|
world.new_entity().set(
|
||||||
Origin(Vec2(1, 0)),
|
Origin(Vec2(1, 0)),
|
||||||
|
@ -186,6 +237,7 @@ def __spawn_ellements(world: World):
|
||||||
UpKey("z"),
|
UpKey("z"),
|
||||||
DownKey("s"),
|
DownKey("s"),
|
||||||
Speed(1000),
|
Speed(1000),
|
||||||
|
LastPlayerTurn(),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Joueur 2
|
# Joueur 2
|
||||||
|
@ -201,11 +253,10 @@ def __spawn_ellements(world: World):
|
||||||
Player2(),
|
Player2(),
|
||||||
(UpKey("up"), DownKey("down"), Speed(1000))
|
(UpKey("up"), DownKey("down"), Speed(1000))
|
||||||
if world[GameMode] == GameMode.TWO
|
if world[GameMode] == GameMode.TWO
|
||||||
else None,
|
else Speed(300),
|
||||||
)
|
)
|
||||||
|
|
||||||
__spawn_ball(world)
|
__spawn_ball(world)
|
||||||
__spawn_bonus(world)
|
|
||||||
|
|
||||||
# Initialisation des scores
|
# Initialisation des scores
|
||||||
world.set(Player1Score(0), Player2Score(0))
|
world.set(Player1Score(0), Player2Score(0))
|
||||||
|
@ -267,33 +318,38 @@ def __spawn_ball(world: World):
|
||||||
|
|
||||||
def __collision_with_ball(a: Entity, b: Entity):
|
def __collision_with_ball(a: Entity, b: Entity):
|
||||||
if Player1 in b or Player2 in b:
|
if Player1 in b or Player2 in b:
|
||||||
|
for player in a.world.query(LastPlayerTurn):
|
||||||
|
del player[LastPlayerTurn]
|
||||||
|
b.set(LastPlayerTurn())
|
||||||
return __bounce_on_player(a, b)
|
return __bounce_on_player(a, b)
|
||||||
elif Bonus in b:
|
elif Bonus in b:
|
||||||
|
if Ball in a:
|
||||||
return __bonus_touched(a, b)
|
return __bonus_touched(a, b)
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def __bonus_touched(ball: Entity, bonus: Entity):
|
def __bonus_touched(ball: Entity, bonus: Entity):
|
||||||
if ball[physics.Velocity].x > 0:
|
player = ball.world.query(LastPlayerTurn).pop()
|
||||||
player = ball.world.query(Player1).pop()
|
|
||||||
else:
|
|
||||||
player = ball.world.query(Player2).pop()
|
|
||||||
match bonus[Bonus]:
|
match bonus[Bonus]:
|
||||||
case Bonus.MULTI:
|
case Bonus.MULTI:
|
||||||
__spawn_ball(bonus.world)
|
__spawn_ball(bonus.world)
|
||||||
__spawn_ball(bonus.world)
|
__spawn_ball(bonus.world)
|
||||||
|
ball.world[TimeUntilBonus].start(ball.world)
|
||||||
case Bonus.BIG:
|
case Bonus.BIG:
|
||||||
player[Scale] *= 2
|
player[Scale] *= 2
|
||||||
|
player.set(HasBonus(Bonus.BIG, 10, bonus.world))
|
||||||
case Bonus.FAST:
|
case Bonus.FAST:
|
||||||
player[Speed] *= 2
|
player[Speed] *= 2
|
||||||
|
player.set(HasBonus(Bonus.FAST, 10, bonus.world))
|
||||||
case Bonus.REVERSE:
|
case Bonus.REVERSE:
|
||||||
if ball[physics.Velocity].x < 0:
|
for entity in ball.world.query(UpKey):
|
||||||
player = ball.world.query(Player1).pop()
|
if LastPlayerTurn in entity:
|
||||||
player[UpKey], player[DownKey] = player[DownKey], player[UpKey]
|
continue
|
||||||
else:
|
entity[UpKey], entity[DownKey] = entity[DownKey], entity[UpKey]
|
||||||
player = ball.world.query(Player2).pop()
|
|
||||||
player[UpKey], player[DownKey] = player[DownKey], player[UpKey]
|
entity.set(HasBonus(Bonus.REVERSE, 10, bonus.world))
|
||||||
|
|
||||||
bonus.destroy()
|
bonus.destroy()
|
||||||
return False
|
return False
|
||||||
|
@ -440,7 +496,7 @@ def _update_bot(world: World):
|
||||||
# On se déplace vers la meilleure option
|
# On se déplace vers la meilleure option
|
||||||
diff = target - bot[Position].y
|
diff = target - bot[Position].y
|
||||||
if abs(diff) > 10:
|
if abs(diff) > 10:
|
||||||
bot[Position].y += (diff / abs(diff)) * 300 * world[Delta]
|
bot[Position].y += (diff / abs(diff)) * bot[Speed] * world[Delta]
|
||||||
|
|
||||||
|
|
||||||
def __update_scores(world: World, ball: Entity):
|
def __update_scores(world: World, ball: Entity):
|
||||||
|
@ -492,9 +548,25 @@ def __update_animation(world: World):
|
||||||
animation.destroy()
|
animation.destroy()
|
||||||
|
|
||||||
|
|
||||||
|
def __update_bonus_time(world: World):
|
||||||
|
"""
|
||||||
|
Fonction qui permet de mettre à jour les bonus.
|
||||||
|
"""
|
||||||
|
for player in world.query(HasBonus):
|
||||||
|
if not player[HasBonus].is_ended(world):
|
||||||
|
return None
|
||||||
|
player[HasBonus].suppr_bonus_from_entity(player)
|
||||||
|
del player[HasBonus]
|
||||||
|
world[TimeUntilBonus].start(world)
|
||||||
|
|
||||||
|
if world.query(Bonus) == set() and world.query(HasBonus) == set():
|
||||||
|
if world[TimeUntilBonus].is_ended(world):
|
||||||
|
__spawn_bonus(world)
|
||||||
|
|
||||||
|
|
||||||
__SCENE = Scene(
|
__SCENE = Scene(
|
||||||
[__spawn_ellements],
|
[__spawn_ellements],
|
||||||
[__update_move, __update_animation],
|
[__update_move, __update_animation, __update_bonus_time],
|
||||||
[],
|
[],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue