Commandes personnage : détection de touche au clavier + touches d'animation supplémentaires
Deux retours utilisateur sur le panneau "Commandes" (déplacement/
animation automatiques, voir précédent commit) :
- Les champs de touche (haut/bas/gauche/droite/interagir) capturent
maintenant la touche au clavier (clic puis appui — event.key, même
valeur que heldKeys/triggers.js) au lieu d'être tapés à la main,
source d'erreurs ("Espace" vs " ", "flèche haut" vs "ArrowUp"...).
- Nouvelle section "Animations supplémentaires" : un nombre illimité de
touches, chacune liée à UNE pose au choix parmi celles réellement
disponibles pour ce personnage (sauter, attaquer, courir...) — pas
seulement les 4 touches de déplacement + interagir.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
74f7ca396f
commit
5891c82c62
@@ -78,18 +78,29 @@ function forgeRunPersonnageControllerTick(screenData) {
|
||||
});
|
||||
}
|
||||
|
||||
// Ponctuel (keydown, pas heldKeys) — contrairement au déplacement,
|
||||
// "interagir" est une action instantanée (ouvrir un coffre, parler à un
|
||||
// PNJ...), jamais un mouvement continu.
|
||||
// Quelle pose jouer pour une touche d'ACTION (pas de déplacement) donnée —
|
||||
// "interagir" (usage fixe, pose "interact") d'abord, sinon la première
|
||||
// touche supplémentaire (cmd.extra, voir "Animations supplémentaires" du
|
||||
// panneau Commandes) qui correspond, pour un nombre de poses illimité
|
||||
// (sauter, attaquer, courir...) sans ajouter un champ fixe par pose.
|
||||
function forgePersonnageActionAnim(cmd, key) {
|
||||
if (cmd.interagir === key) return 'interact';
|
||||
var extraMatch = (cmd.extra || []).find(function (e) { return e.touche === key; });
|
||||
return extraMatch ? extraMatch.animation : null;
|
||||
}
|
||||
|
||||
// Ponctuel (keydown, pas heldKeys) — contrairement au déplacement, une
|
||||
// touche d'action est une action instantanée (interagir, sauter,
|
||||
// attaquer...), jamais un mouvement continu.
|
||||
function forgeStartPersonnageInteractListener(screenData) {
|
||||
activePersonnageInteractListener = function (ev) {
|
||||
(screenData.elements || []).forEach(function (obj) {
|
||||
if (obj.kind !== 'personnage' || !obj.personnage_commandes) return;
|
||||
if (obj.personnage_commandes.interagir !== ev.key) return;
|
||||
var animName = forgePersonnageActionAnim(obj.personnage_commandes, ev.key);
|
||||
if (!animName || !forgePersonnageAnimExists(obj.id, animName)) return;
|
||||
var targetEl = document.querySelector('[data-object-id="' + obj.id + '"]');
|
||||
if (!targetEl) return;
|
||||
var interactAnim = forgePersonnageAnimExists(obj.id, 'interact') ? 'interact' : null;
|
||||
if (interactAnim) runSpriteAnimation(targetEl, resolveSpriteFrames(obj.id, { animation: interactAnim, fps: 8, loop: false }));
|
||||
runSpriteAnimation(targetEl, resolveSpriteFrames(obj.id, { animation: animName, fps: 8, loop: false }));
|
||||
});
|
||||
};
|
||||
window.addEventListener('keydown', activePersonnageInteractListener);
|
||||
@@ -112,7 +123,7 @@ function forgeStartPersonnageControllers(screenData) {
|
||||
// client.
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = {
|
||||
forgePersonnageAnimExists, forgePersonnageMovementAnim, forgePersonnageIdleAnim,
|
||||
forgePersonnageAnimExists, forgePersonnageMovementAnim, forgePersonnageIdleAnim, forgePersonnageActionAnim,
|
||||
forgeRunPersonnageControllerTick, forgeStartPersonnageControllers, forgeStopPersonnageControllers,
|
||||
forgeStartPersonnageInteractListener,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user