Основи Cocos2d-x

Статті про розробку ігор за допомогою Cocos2d-x

Рух та інші перетворення об'єктів

Posted at — Mar 29, 2020

Ми вже вміємо обробляти події клавіатури або натискання на кнопки. Тепер треба починати реагувати на ці події та щось зробити з об'єктом.

Наприклад, ви хочете, щоб після натиснення кнопки спрайт перемістився з одного місця екрану до іншого. Для того, щоб це виглядало саме як пересування, а не телепортація, координати треба змінювати дуже маленькими, але частими порціями, десятки разів на секунду. Вручну це програмувати незручно, тому у Cococ2d зробили клас Action та його нащадки. Зокрема, для пересування призначений MoveTo, використання якого виглядає так:

void ActionsDemoScene::sideButtonCallback(Ref *pSender) {
  MoveTo* moveTo = MoveTo::create(2, Vec2(320,240));
  greenUfo->runAction(moveTo);
}

Тут greenUfo — спрайт, розміщений на сцені.

moveBy — це акція, що рухатиме спрайт. Фабричний метод MoveTo::create отримує два параметри:

В результаті після натиснення кнопки зелене НЛО почне рухатись і через дві секунди опиниться у новому положенні. Картинками це зобразити важко, але має бути якось так:

Перехід корабля з одного положення в інше

Види перетворень

Cocos2d може виконувати дуже багато різних перетворень:

Більшість перетворень має два варіанти: “To” та “By”, особливої різниці між ними немає. Просто один отримує чіткі параметри, які описують новий стан об'єкту (координати, кут повороту тощо), а іншому задають величину, на яку треба змінити поточні параметри, щоб отримати новий стан.

Апроксимація

За помовчанням протягом акції параметри змінюються рівномірно, але це можна змінити. Наприклад, можно повільно змінювати значення на початку часового інтервалу і швидко у кінці — результат буде схожим на зрушення масивного тіла.

Реалізується це за допомогою класів Easing* — їх багато на будь-який смак.

Використовуються вони так:

MoveBy* bma = MoveBy::create(6, Vec2(360,0));
EaseIn* bea = EaseIn::create(bma, 1.5f);
blueShip->runAction(bea);

Другий параметр конструктора EaseIn — це множник з яким буде змінюватись параметри. Чим він більший, тим помітнішими будуть зміни.

Результат модифікаторів EaseIn та EaseOut:

Різна апроксимація

Зелений корабель рухається стандартно, синій та червоний — з модифікаціями. У підсумку дистанцію вони проходять за один і той самий час, але по-різному.