Одновременно у персонажа может проигрываться только одна анимация и когда включается другая, то предыдущая выключается. Такой механизм проще все описать с помощью машины состояний. Чтобы определить состояния нашей моли давайте добавим такой компонент:
state("idle", ["idle", "fly", "walk", "cut", "bite", "jump"]),
Полный код моли теперь выглядит так:let player = add([
controllerComp(joystick),
animatorComp(joystick),
state("idle", ["idle", "fly", "walk", "cut", "bite", "jump"]),
sprite("moth"),
anchor("center"),
scale(4),
pos(80, 80),
area({ scale: vec2(1/5,1/5) }),
body(),
]);
Про машину состояний написано в документации kaboomjs.com/#state .Чтобы переключать состояния и анимации давайте создадим новый компонент
animatorComp в новом файле импортируем его game.js и добавим игроку. Мы это уже умеем делать. Затем сделаем так чтобы в воздухе проигрывалась анимация полёта, а на земле - спокойствия:export default function animatorComp(joystick) {
return {
id: "animatorComp",
require: ["pos"],
add() {
this.onFallOff(() => {
this.enterState("fly")
})
this.onStateEnter("fly", () => {
this.play("fly")
})
this.onGround(() => {
this.enterState("idle")
})
this.onStateEnter("idle", () => {
this.play("idle")
})
},
update() {
},
}
}
События onFallOff и onGround добавляются объекту компонентом body, kaboomjs.com/#BodyCompА событие onStateEnter компонентом state kaboomjs.com/#StateComp
так же как и метод enterState
Если переводить код на русский, то там написано: когда объект (моль) начинает падать она входит в состояние полёта, когда она входит в состояние полёта, то включается анимация полёта. Когда моль приземляется включается состояние покоя и вместе с состоянием покоя включается анимация покоя. Всё максимально просто и понятно.