Added map animations

This commit is contained in:
mibi88 2023-01-08 12:20:03 +01:00
parent 12ed26362c
commit 2702a61839
4 changed files with 79 additions and 12 deletions

View File

@ -48,6 +48,25 @@ map0 = """
########################################################
"""
animations = {
"replace_animations": {
'-': {
"frames": ['=', '-'],
"animation_frame": 0
},
'=': {
"frames": ['-', '='],
"animation_frame": 0
}
},
"coords_animations": {
"4, 4": {
"frames": ['^', ' '],
"animation_frame": 0
}
}
}
world = {
"dmode": STICKY,
"map_num": 0,
@ -56,7 +75,8 @@ world = {
"layers": [
{
"data": map0,
"transp_char": None
"transp_char": None,
"animations": animations
}
],
"jumps": [
@ -105,18 +125,25 @@ world = {
* `STICKYBLOCKS` : La carte s'affiche comme dans `BLOCKS`, mais elle remplit toujours l'écran.
* `map_num` : Le numéro de la carte sur laquelle on va démarrer le jeu.
* `maps` : Une liste de plusieurs cartes, chacune constituée de :
* `layers` : les différentes couches qui contituent les maps. Ces layers sont dessinés du premier au dernier.
* `layers` : les différentes couches qui constituent les maps. Ces layers sont dessinés du premier au dernier.
* `data` : Une string qui contient le layer (`map0` dans l'exemple).
* `transp_char` : Le caractère qui ne sera pas affiché : permet de voir le layer d'en dessous. Si il est à `None`, aucun caractère ne sera enlevé.
* `animations` (**Optionnel**) : Dictionnaire qui permet d'ajouter des animations à la map constitué de :
* `replace_animations` : Dictionnaire pour les animations où un caractère est remplacé par un autre sur toute la map. Pour chaque caractère qui doit être animé, il faut y ajouter un autre dictionnaire où le nom est le caractère qui doit être animé. Ces dictionnaires sont constitués de :
* `frames` : Liste qui contient les différent caractères qui constituent l'animation.
* `animation_frame` : Quel caractère de l'animation va être affiché. C'est une position dans `frames`.
* `coords_animations` : Dictionnaire pour les animations où un caractère est remplacé par un autre uniquement à une position bien précise. Pour chaque position qui doit être animée, il faut y ajouter un autre dictionnaire où le nom est `"x, y"` où x doit être remplacé par l'abscisse et y par l'ordonnée du caractère qui doit être animé. Ces dictionnaires sont constitués de :
* `frames` : Liste qui contient les différent caractères qui constituent l'animation.
* `animation_frame` : Quel caractère de l'animation va être affiché. C'est une position dans `frames`.
* `jumps` : Liste des endroits où le joueur peut sauter d'une map à l'autre et/ou d'une position à l'autre. Cette liste est constituée de dictionnaires constituées de :
* `x` et `y` : La position de départ.
* `to_x` et `to_y` : La position de d'arrivée.
* `to_map` : La map de l'arrivée.
* `isactive` : Bolléen : est ce que ce jump peut téléporter le joueur ?
* `isactive` : Booléen : est ce que ce jump peut téléporter le joueur ?
* `npc` : Liste des pnj qui sont des dictionnaires constituée de :
* `x` et `y` : Leur position sur la map.
* `isvisible` : est ce qu'ils sont visibles.
* `collision_check` : Bolléen : est ce qu'on peut entrer en collision avec eux.
* `collision_check` : Booléen : est ce qu'on peut entrer en collision avec eux.
* `layer` : Au dessus de quel layer ils s'affichent.
* `map` : Sur quelle map ils sont.
* `char` : Quel caractère est utilisé pour les afficher.
@ -141,7 +168,7 @@ player = {
* `x` et `y` : Sa position sur la map.
* `isvisible` : est ce qu'il est visible.
* `collision_check` : Bolléen : est ce qu'il est stoppé par les objets durs et les pnj.
* `collision_check` : Booléen : est ce qu'il est stoppé par les objets durs et les pnj.
* `layer` : Au dessus de quel layer ils s'affiche.
La map sur laquelle il est est déjà définie dans `map_num` de `world`.
@ -151,19 +178,19 @@ La map sur laquelle il est est déjà définie dans `map_num` de `world`.
`self` est la classe `Scii`.
* `mainloop(self)` : Lance la boucle du jeu.
* Déjà uilisés dans mainloop :
* Déjà utilisés dans mainloop :
* `get_map_width(self, map_data)` : Retourne la largeur de la map.
* `map_data` : dictionnaire de la map comme il est dans `world["maps"]`
* `get_map_height(self, map_data)` : Retourne la hauteur de la map.
* `map_data` : dictionnaire de la map comme il est dans `world["maps"]`
* `draw_map(self, mode, show_player)`
* `mode` : Mode de dessin de la map (`STICKY`, `CENTERED`, `BLOCKS` ou `STICKYBLOCKS`)
* `show_player` : Bolléen : est ce que le joueur doit être affiché.
* `show_player` : Booléen : est ce que le joueur doit être affiché.
* `def show_text(self, text)` : Affiche du texte. L'historique du texte affiché est disponible en appuyant sur `scii_keys["old_messages"]` ou en appelant `show_old_messages(self)`.
* `text` : Texte à afficher.
* `portrait` (**Optionnel**) : Affiche un portrait à côté du texte.
* `show_old_messages(self)` : Affiche les anciennes conversations.
* `ask_choice(self, text, choices)` : Demande à l'utilisateur de faire un choix parmi les choix proposés dans `choices`. Retourne le choix fait. Le premier choix est le numéro 1, et les prochains sont à chaque fois de 1 plus grands : dans `["Oui", "Non", "Je ne sais pas"]` "Oui" est le choix numéro 1, "Non" est le choix numéro 2 et "Je ne sais pas" est le choix numéro 3.
* `text` : Texte à afficher avant de demander à l'utilisateur quel proposition il fait. Les choix seront affichés en dessous.
* `choices` : Liste de chaines de caractères des choix que l'utilisateur.
* `portrait` (**Optionnel**) : Affiche un portrait à côté du texte.
* `choices` : Liste de chaînes de caractères des choix que l'utilisateur.
* `portrait` (**Optionnel**) : Affiche un portrait à côté du texte.

View File

@ -173,11 +173,22 @@ class Scii:
while("" in data): data.remove("")
map_width = self.get_map_width(map_data)
map_height = self.get_map_height(map_data)
if "animations" in i:
animations = 1
replace_animations = i["animations"]["replace_animations"]
coords_animations = i["animations"]["coords_animations"]
else:
animations = 0
for y in range(self.screen_height):
for x in range(self.screen_width):
try:
if sx+x >= 0 and sx+x < map_width and sy+y >= 0 and sy+y < map_height:
c = data[sy+y][sx+x]
if animations:
if c in replace_animations:
c = replace_animations[c]["frames"][replace_animations[c]["animation_frame"]]
if "{}, {}".format(sx+x, sy+y) in coords_animations:
c = coords_animations["{}, {}".format(sx+x, sy+y)]["frames"][coords_animations["{}, {}".format(sx+x, sy+y)]["animation_frame"]]
if c != i["transp_char"]:
self._setc(x, y, c)
except: pass
@ -185,6 +196,15 @@ class Scii:
if npc["layer"] == layerc and npc["map"] == self.map_num and npc["isvisible"]:
self._setc(px + (npc["x"] - osx), py + (npc["y"] - osy), npc["char"])
if layerc == self.player["layer"] and show_player: self._setc(px, py, self.player["playerc"])
if animations:
for key in i["animations"]["replace_animations"]:
i["animations"]["replace_animations"][key]["animation_frame"] += 1
if i["animations"]["replace_animations"][key]["animation_frame"] >= len(i["animations"]["replace_animations"][key]["frames"]):
i["animations"]["replace_animations"][key]["animation_frame"] = 0
for key in i["animations"]["coords_animations"]:
i["animations"]["coords_animations"][key]["animation_frame"] += 1
if i["animations"]["coords_animations"][key]["animation_frame"] >= len(i["animations"]["coords_animations"][key]["frames"]):
i["animations"]["coords_animations"][key]["animation_frame"] = 0
layerc += 1
self._dvram()
def show_text(self, text, portrait = None):

View File

@ -19,6 +19,25 @@ portrait = """
/ \\
"""
animations = {
"replace_animations": {
'-': {
"frames": ['=', '-'],
"animation_frame": 0
},
'=': {
"frames": ['-', '='],
"animation_frame": 0
}
},
"coords_animations": {
"4, 4": {
"frames": ['^', ' '],
"animation_frame": 0
}
}
}
def npc_collision(self, npc):
global portrait
if npc["name"] == "lephenixnoir":
@ -39,7 +58,8 @@ world = {
"layers": [
{
"data": map0,
"transp_char": None
"transp_char": None,
"animations": animations
}
],
"jumps": [

View File

@ -1,4 +1,4 @@
# ToDo
- [ ] Animated maps
- [ ] Bigger tiles than one char
* [x] Animated maps
- [ ] Bigger tiles than one char