Skip to content

Commit

Permalink
Transition graphique lors d'un warp
Browse files Browse the repository at this point in the history
+ Ajout d'une map vide (map 0)
+ Lors d'un warp, l'écran devient désormais sombre puis s'éclaircit le temps que le joueur soit déplacé d'une map à l'autre
+ Petites avancées sur #5 : commentaires, passage aux f-strings

NOTE : Il y a un petit déplacement entre le moment où l'on sort de la transition et où l'on peut bouger. Ainsi, il faut déplacer quelques portails/spawns pour que le joueur ne se retrouve pas coincé
  • Loading branch information
fmkr-project committed Apr 14, 2022
1 parent 0c3afee commit d206289
Show file tree
Hide file tree
Showing 9 changed files with 186 additions and 20 deletions.
Binary file modified res/game_data.db
Binary file not shown.
2 changes: 1 addition & 1 deletion res/maps/h009.tmx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.5" tiledversion="2021.03.23" orientation="orthogonal" renderorder="right-down" width="100" height="100" tilewidth="32" tileheight="32" infinite="0" nextlayerid="4" nextobjectid="7">
<map version="1.5" tiledversion="2021.03.23" orientation="orthogonal" renderorder="right-down" width="100" height="100" tilewidth="32" tileheight="32" infinite="0" nextlayerid="4" nextobjectid="8">
<tileset firstgid="1" name="jeu de tuiles" tilewidth="32" tileheight="32" tilecount="240" columns="20">
<image source="../textures/tiles.png" trans="ff00ff" width="646" height="401"/>
</tileset>
Expand Down
4 changes: 2 additions & 2 deletions res/maps/niv_1.tmx
Original file line number Diff line number Diff line change
Expand Up @@ -290,10 +290,10 @@
</object>
<object id="110" name="to_o101_main" x="2880" y="4032" width="64" height="32"/>
<object id="111" name="to_o101_sub" x="3072" y="4032" width="64" height="32"/>
<object id="112" name="exit_o101_main" x="2880" y="4000">
<object id="112" name="exit_o101_main" x="2880" y="3989">
<point/>
</object>
<object id="113" name="exit_o101_sub" x="3072" y="4000">
<object id="113" name="exit_o101_sub" x="3072" y="3989">
<point/>
</object>
<object id="115" type="mur" x="2848" y="3808" width="192" height="96"/>
Expand Down
109 changes: 109 additions & 0 deletions res/maps/void.tmx

Large diffs are not rendered by default.

Binary file added res/sounds/music/void.mp3
Binary file not shown.
2 changes: 1 addition & 1 deletion src/internalclock.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ def __init__(self, game):
self.pgclock = pg.time.Clock()

# Compteurs de ticks
self.ticks_since_epoch = 0 # TODO Trouver un moyen d'enregistrer le nb de ticks depuis le dernier reset
self.ticks_since_epoch = 0 # TODO Enregistrer le nb de ticks depuis le dernier reset
self.ticks_since_sessionstart = 0

# Horloge du jeu
Expand Down
62 changes: 52 additions & 10 deletions src/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
"""Gère le joueur"""

import pygame as pg
from copy import deepcopy

import debug
import save

class Player(pg.sprite.Sprite):
Expand Down Expand Up @@ -37,6 +37,7 @@ def __init__(self, game):
# Variables d'état
self.is_animated = False # Le sprite du joueur défile
self.is_sprinting = False # Le joueur sprinte
self.is_warping = False # Le joueur se téléporte
self.can_move = True # Le joueur est capable de bouger
self.boop = False # Le joueur est en collision

Expand Down Expand Up @@ -80,15 +81,52 @@ def is_colliding(self):
# Collision avec un portail
index = self.feet.collidelist(self.game.map_manager.portals)
if index >= 0: # Le joueur est dans un portail
# On récupère l'endroit où téléporter le joueur
[to_world, to_point] = self.game.game_data_db.execute("SELECT to_world, to_point FROM portals WHERE id = ?", (self.game.map_manager.portals_id[index],)).fetchall()[0]
old_bgm = self.game.map_manager.sound_manager.music_file
self.game.map_manager.load_map(to_world, old_bgm) # On charge la nouvelle carte
self.game.map_manager.teleport_player(to_point) # on téléporte le joueur à la destination
self.can_move = False
self.warp(index)
self.is_warping = True
return True
else:
# Collision avec les murs
return True if self.feet.collidelist(self.game.map_manager.walls) > -1 else False

def warp(self, tp_point):
"""Téléportation du joueur vers une nouvelle map"""
transition_step = 5
# On récupère l'endroit où téléporter le joueur
[to_world, to_point] = self.game.game_data_db.execute("SELECT to_world, to_point FROM portals WHERE id = ?", (self.game.map_manager.portals_id[tp_point],)).fetchall()[0]
old_bgm = self.game.map_manager.sound_manager.music_file
# Transition vers un écran noir
fader = pg.Surface(self.game.window_size).convert() # Fond noir initialement transparent
fader.set_alpha(0)
while fader.get_alpha() < 255:
self.game.screen.blit(fader, (0, 0))
fader.set_alpha(fader.get_alpha() + 2.2) # L'opacité du fond noir est augmentée
if self.game.debug:
debug.show_debug_menu(self.game) # Conservation du menu de debug à l'écran
pg.display.flip()
pg.time.delay(transition_step)
# Téléportation
self.game.map_manager.load_map(to_world, old_bgm) # On charge la nouvelle carte
self.game.map_manager.teleport_player(to_point) # on téléporte le joueur à la destination
self.update()
self.game.map_manager.draw()
pg.display.flip()

def end_warp(self):
"""Fin de la transition de warp"""
transition_step = 1
void = pg.Surface(self.game.window_size).convert() # Fond noir initialement opaque
void.set_alpha(255)
bg = self.game.screen.convert() # Arrière-plan final
bg.set_alpha(255)
while void.get_alpha() > 0:
self.game.map_manager.draw()
self.game.screen.blit(bg, (0, 0))
self.game.screen.blit(void, (0, 0))
void.set_alpha(void.get_alpha() - 17)
pg.display.flip()
pg.time.delay(transition_step)


def move(self, list_directions, sprinting):
"""Méthode de déplacement du joueur"""
Expand All @@ -100,13 +138,13 @@ def move(self, list_directions, sprinting):

# On calcule le déplacement potentiel en x et en y en fonction des touche préssées
deplacement = [0, 0]
if list_directions[0]: #Haut
if list_directions[0]: # Haut
deplacement[1] -= 1
if list_directions[1]: #Droite
if list_directions[1]: # Droite
deplacement[0] += 1
if list_directions[2]: #Bas
if list_directions[2]: # Bas
deplacement[1] += 1
if list_directions[3]: #Gauche
if list_directions[3]: # Gauche
deplacement[0] -= 1

if deplacement[0] != 0 or deplacement[1] != 0: # Si le déplacement n'est pas nul
Expand Down Expand Up @@ -145,6 +183,10 @@ def update(self):
animation_cooldown = self.SPRINT_ANIMATION_COOLDOWN if self.is_sprinting else self.WALK_ANIMATION_COOLDOWN
if self.is_animated == True:
self.current_sprite = (int(self.game.internal_clock.ticks_since_epoch / animation_cooldown) % 3)
if self.is_warping:
self.end_warp()
self.is_warping = False
self.can_move = True

def get_image(self, x, y):
"""Retourne une partie de l'image du joueur"""
Expand Down
14 changes: 11 additions & 3 deletions src/scriptmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,11 @@ def update(self):
if self.moving_direction == "left":
self.game.player.move([False, False, False, True], self.sprint_during_script)
dist = ((self.initial_coords[0] - self.game.player.position[0])**2 + (self.initial_coords[1] - self.game.player.position[1])**2) ** 0.5 # Distance totale parcourue pendant le script
if dist > self.movement_boundary or self.game.player.boop: # Le mouvement s'est déroulé normalement ou le joueur s'est pris un mur
if dist > self.movement_boundary: # Le mouvement s'est déroulé normalement ou le joueur s'est pris un mur
self.exit_movingscript()
elif self.game.player.boop:
self.exit_movingscript()
print("debug : script_boop")
elif self.game.dialogue is not None or self.game.menu_manager.choicebox is not None or self.game.mgm_manager.running_mg is not None: # On laisse le dialogue défiler s'il existe, ou ou attend les résultats de la choicebox
pass
elif self.current_script_command() >= len(self.game.running_script.contents) or self.abort: # Le script courant est terminé ou on force l'arrêt
Expand All @@ -138,7 +141,7 @@ def update(self):
self.game.input_lock = False # Déblocage du clavier
else: # Le jeu est disponible pour passer à l'étape suivante
start = self.game.running_script
command = "self." + self.game.running_script.contents[self.current_script_command()] # Correction syntaxique
command = f"self.{self.game.running_script.contents[self.current_script_command()]}" # Correction syntaxique
eval(command)
if self.game.script_tree[-1][0] == start: # Le script en cours de traitement est le même
self.game.script_tree[-1][1] += 1 # Augmentation du n° de la commande courante
Expand Down Expand Up @@ -176,7 +179,7 @@ def save(self):
print("Impossible d'accéder à la base de donnée lors de la sauvegarde. Cela peut être dû à une réinitialisation des données...")


# Fonctions graphiques
# Fonctions graphiques et de mouvement
def changelayer(self, layer):
"""Déplacement du sprite du joueur sur un nouveau calque"""
if layer == "bg":
Expand All @@ -192,6 +195,11 @@ def move(self, direction, pix, sprint = False):
self.movement_boundary = pix
self.sprint_during_script = sprint

def warp(self, target_map, target_coords):
"""Téléportation du joueur vers une nouvelle map"""
self.game.map_manager.load_map(target_map, self.game.map_manager.sound_manager.music_file) # Chargement de la nouvelle map
self.game.player.position = target_coords


# Fonctions du temps
def getday(self):
Expand Down
13 changes: 10 additions & 3 deletions src/scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,10 @@ def brrr():
"""infobox()""",
"""dialogue(self.current_npc, 3)""",
"""runscript('denis_brogniart')""",
"""move('right', 8000, True)"""])
"""move('right', 8000, True)""",
"""move('right', 200, True)""",
"""move('down', 200, True)""",
"""move('right', 1000, True)"""])

def denis_brogniart():
return(["""loadtext(6)""",
Expand Down Expand Up @@ -231,10 +234,14 @@ def horodat():
def testporte():
return(["""loadtext("background")""",
"""infobox()""",
"""changelayer("bg")""",
"""changelayer('bg')""",
"""loadtext("foreground")""",
"""infobox()""",
"""changelayer("fg")"""])
"""changelayer('fg')""",
"""loadtext("bye")""",
"""infobox()""",
"""warp(0, [1500, 1500])""",
"""changelayer('bg')"""])

def flaginator():
return(["""testflag(-1,0)""",
Expand Down

0 comments on commit d206289

Please sign in to comment.