[C++/LUA]Aide pour créer une cinématique avec le moteur Solarus

Démarré par MetalZelda, 20 Avril 2013 à 19:54

0 Membres et 1 Invité sur ce sujet

20 Avril 2013 à 19:54 Dernière édition: 22 Avril 2013 à 15:20 par MetalZelda
Suite à la demande de Chris, je crée ce topic, ce topic vient en aide à ceux qui décident de créer/réimporter leur propre jeux Zelda (ou autre) en se basant sur le moteur Zelda Solarus de la Team Zelda Solarus.

Il faut être précis dans vos questions et aussi savoir quel réponce précise vous voulez.

Toutes questions allant au hors-sujet (Excepté ceux qui touchent au making) sera sans doute banni par les modérateurs

-------------------------------------------------------------------------------------------------------------------

Voici mes questions (Concernant la création des maps) :

- Y'a t-il des bandes noires pour simuler une cinématique ?
- Comment créer une cinématique réaliste avec personnages qui bougent/Parlent automatiquement (Y'a pas mal de cinoches dans Eternal Struggle RPG Maker :s) ?

EDIT de Chris : je renomme le topic par rapport à ta demande particulière. Il est préférable de séparer les questions dans des topics différents pour que les gens s'y retrouvent mieux. (Tout comme il y a plusieurs topics sur RPG Maker, il peut y en avoir plusieurs sur Solarus ou sur chaque logiciel de création.)

Voici ou revoici le lien de la documentation sur l'API Lua : http://www.solarus-games.org/doc/1.0.0/lua_api.html
(j'espère que ça ne te dérange pas que ce soit en anglais ^^ j'ai pas encore fait de version française de la documentation - la version anglaise étant déjà elle-même toute fraîche)

1) Pour les bandes noires, c'est facile à faire. Tu crées une surface que tu remplis en noir et tu l'affiches à l'écran. Concrètement, dans le script de ta map, tu peux faire quelque chose du genre :

map:on_started()
  -- Fonction appelée au démarrage de la map : on crée les bandes noires une fois pour toutes.
  self.black_bar = sol.surface.create(640, 30)  -- Créer une surface de 640x30 pixels
  self.black_bar:fill_color({0,0,0})  -- La remplir de noir
end

map:on_draw(destination_surface)
  -- Fonction appelée à chaque frame pour redessiner la map
  self.black_bar:draw(destination_surface, 0, 0)  -- Afficher une bande noire en haut
  self.black_bar:draw(destination_surface, 0, 450)   -- Afficher une bande noire en bas
end


2) Il faut créer des personnages avec l'éditeur et les déplacer et démarrer les dialogues dans ton script de map. Par exemple, voici en quelques lignes comment faire bouger un personnage non joueur (PNJ, ou NPC en anglais) et afficher un dialogue une fois que le trajet est fini :

local movement = sol.movement.create("path")  -- Création d'un mouvement de type chemin
movement:set_path{2,2,4,4,4,4}  -- 2 pas vers le nord et 4 pas vers l'ouest (un pas = 8 pixels)
movement:set_speed(24)  -- 24 pixels par seconde
-- Attribuer le mouvement au PNJ :
ton_pnj:start_movement(movement, function()
  -- Cette fonction interne est appelée quand le mouvement se termine
  map:start_dialog(id_du_dialogue)
end)


Voilà, j'espère que ces exemples t'éclairent et que tu ne seras pas trop perdu ^^
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

Oups, j'avais pas vu le site que tu avais mis ^_^

Tutoriel très claire et réponse très claire :)
Merci :D

Et pour faire bouger le héros, la syntaxe reste la même ou faut rajouter le prefixe "hero" dans une ligne ?

J'aimerais aussi savoir comment forcer le jeu à être sur une map dés l'ecran titre sans que sa soit la starting_map (par défaut 0), en ce moment, je suis en train d'experimenter un title screen automatisé sur map (et dis donc, je dois reconnaitre que c'est facile pour faire sa  :ninja: J'en reviens pas  :P.)

Merci :)

Citation de: MetalZelda le 26 Avril 2013 à 14:25
Et pour faire bouger le héros, la syntaxe reste la même ou faut rajouter le prefixe "hero" dans une ligne ?
Si tu remplaces tom_pnj par hero dans le code de mon post, ça devrait marcher. (Car l'entitié du héros s'appelle "hero".) Cependant, la fonction start_movement est expérimentale dans le cas du héros. Pour les PNJ, elle fonctionne bien, Pour le héros, je ne l'ai pas encore testée. Je te conseille de faire hero:freeze() avant de l'appeler, sinon je ne sais pas trop ce qui va se passer si le joueur tente de le contrôler.

Une autre possibilité est d'utiliser la fonction hero:walk() si c'est un mouvement de marche. Mais le jour où start_movement marchera bien dans le cas du héros, je supprimerai hero:walk() de l'API car start_movement est beaucoup plus général et flexible.

Encore une autre possibilité, si c'est dans une cinématique, c'est de faire un PNJ qui a le même sprite du héros, au lieu d'utiliser le héros lui-même. comme ça tu ne risques aucun conflit avec les mouvements du joueur.

Citation de: MetalZelda le 26 Avril 2013 à 14:25
J'aimerais aussi savoir comment forcer le jeu à être sur une map dés l'ecran titre sans que sa soit la starting_map (par défaut 0)
Je ne suis pas sûr d'avoir compris. Il n'y a plus de notion de starting map et encore moins de map 0 par défaut. Les id des maps sont maintenant des string.

Quand on lance le programme, tu veux démarrer une partie directement ? Sans écran-titre ? Quand est-ce que tu choisis la sauvegarde dans ce cas ? Il n'y a pas de map tant qu'une partie n'est pas démarrée.

Ou alors, tu veux faire un écran-titre un peu évolué avec des personnages qui se déplacent ? Si c'est cela, comme tu es en dehors de toute partie (game), tu ne peux pas utiliser de maps ni de map entity (PNJ, héros, ennemis, etc...). Mais tu peux afficher des images fixes, des sprites animés, du texte et créer des mouvements sur ces objets.
[/quote]

Citation de: MetalZelda le 26 Avril 2013 à 14:25
en ce moment, je suis en train d'experimenter un title screen automatisé sur map (et dis donc, je dois reconnaitre que c'est facile pour faire sa  :ninja: J'en reviens pas  :P.)

Merci :)
Merci pour ces compliments, c'est encourageant pour la suite ^^
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

Citation de: Christopho le 26 Avril 2013 à 14:43
Citation de: MetalZelda le 26 Avril 2013 à 14:25
J'aimerais aussi savoir comment forcer le jeu à être sur une map dés l'ecran titre sans que sa soit la starting_map (par défaut 0)
Je ne suis pas sûr d'avoir compris. Il n'y a plus de notion de starting map et encore moins de map 0 par défaut. Les id des maps sont maintenant des string.

Quand on lance le programme, tu veux démarrer une partie directement ? Sans écran-titre ? Quand est-ce que tu choisis la sauvegarde dans ce cas ? Il n'y a pas de map tant qu'une partie n'est pas démarrée.

Ou alors, tu veux faire un écran-titre un peu évolué avec des personnages qui se déplacent ? Si c'est cela, comme tu es en dehors de toute partie (game), tu ne peux pas utiliser de maps ni de map entity (PNJ, héros, ennemis, etc...). Mais tu peux afficher des images fixes, des sprites animés, du texte et créer des mouvements sur ces objets.

Oui je voulais utiliser une map comme ecran titre :p, mais si sa fonctionne pas, j'ai d'autres idées (une carte en image png sa devrait fonctionner non, a moin que sa soit vraiment fixe ?) mais j'ai pas compris un truc :P :
- "tu ne peux pas utiliser de maps ni de map entity (PNJ, héros, ennemis, etc...). Mais tu peux afficher des images fixes (sa oui j'ai compris :D), des sprites animés, du texte et créer des mouvements sur ces objets."
Je t'avouerais que c'est le bazar dans ma tête la  :P


Tout ce qui est map entity : http://www.solarus-games.org/doc/1.0.0/lua_api_entity.html sont des entités qui n'existent que sur une map, donc uniquement pendant une game.  Les map entity incluent le héros, les ennemis, les PNJ, les coffres, les vases, les téléporteurs, les tiles, les portes, bref tout ce qui est placé sur une map.

En dehors d'une game, tu ne peux pas avoir de maps, et donc pas de map entities. Par contre, tout le reste de l'API Lua est disponible : http://www.solarus-games.org/doc/1.0.0/lua_api.html. Tu peux faire notamment des sons, des musiques, des timers, des images (fixes : surfaces ou animées : sprites), du texte et des mouvements. C'est ce qui permet de faire un écran-titre, un écran de sauvegarde ou autres selon ce qu'on veut, avant qu'une partie soit démarrée.

Toute l'astuce, c'est que les sprites ne sont pas des map entity :)

Et donc, en particulier, on peut créer et afficher des sprites animés même en dehors d'une map. Au lieu de les ajouter sur un ennemi ou un PNJ, on les affiche directement.
Et on peut même créer des mouvements sur des sprites (et aussi sur des images fixes).
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

Citation de: Christopho le 26 Avril 2013 à 15:11
Toute l'astuce, c'est que les sprites ne sont pas des map entity :)

Et donc, en particulier, on peut créer et afficher des sprites animés même en dehors d'une map. Au lieu de les ajouter sur un ennemi ou un PNJ, on les affiche directement.
Et on peut même créer des mouvements sur des sprites (et aussi sur des images fixes).


Exact, j'avais pas lu la remarque quand j'avais lu l'API ^^
Donc, le mieu a faire c'est de faire tout sa sous forme d'images animées et de sprites dynamiques (par dynamique j'entends qui bougent ^_^)

Je me met au boulot de suite :D

CitationRemarks
Note that sprites and movements are not map entities, but they can be attached to map entities (to display them and to move them, respectively). Sprites and movements can also be used outside a map, for example in your title screen or in other menus.