Войти
Box2DФорумОбщее

Поворот сцены

#0
0:25, 6 апр. 2014

Каким образом повернуть всю сцену на 90 градусов так, чтобы персонаж и враги не оказались на боку?


#1
4:06, 6 апр. 2014

Сменить гравитацию и отрисовку сцены. Объекты отрисовывать сообразно ориентации экрана.

#2
18:58, 8 апр. 2014

Но получится без анимации, а хотелось бы, чтобы было красиво

#3
19:39, 8 апр. 2014

latenal
> Но получится без анимации
В чем принципиальная проблема анимировать?
Делаем флаг isNeedUpdateGravity, а также gravityBegin, gravityEnd, animationDuration, timeRemaining
Далее в цикле update

if (isNeedUpdateGravity)
{
timeRemaining -= updateTimeInterval;
factor = clampf(timeRemaining/animationDuration, 0.0, 1.0);
gravity = (vector2d)((factor) * (gravityEnd - gravityBegin) + gravityBegin) / (gravityEnd - gravityBegin);
// рисуем сцену повернутую на нужный синус и косинус
// ...
if (timeRemaining <= 0.0f)
{
isNeedUpdateGravity = NO;
}

К примеру, если делаешь проект в cocos2d-x - в сцене делаешь CCNode, располагаешь по центру экрана. К этой ноде привязываешь все остальное отображение. Сцену надо повернуть? Оке - поворачиваем ноду, и меняем вектор гравитации. Сами игровые объекты (player/NPC) при отрисовке дополнительно поворачиваем в зависимости от угла главной ноды.

P.S. Честно говоря, мне бы Ваши проблемы ;)

#4
3:03, 9 апр. 2014
// рисуем сцену повернутую на нужный синус и косинус

То есть статические объекты сцены нужно будет удалять и заново отрисовывать?
К примеру, если делаешь проект в cocos2d-x - в сцене делаешь CCNode, располагаешь по центру экрана. К этой ноде привязываешь все остальное отображение.

Я делаю на box2dweb, есть ли аналог CCNode?
#5
19:45, 10 апр. 2014

Решил проблему; CasDev, спасибо за помощь.

Если кому-то будет интересно решение:

        var rotationPeriod = 1.0; // За сколько секунд должна повернуться сцена
        var angle = -Math.PI / (2 * 60 * rotationPeriod); // Угол поворота за 1/60 сек (частота кадров)
        var rotationMatrix = new b2Mat22();
        rotationMatrix.col1 = new b2Vec2(Math.cos(angle), Math.sin(angle));
        rotationMatrix.col2 = new b2Vec2(-Math.sin(angle), Math.cos(angle));       
        
        var axis = new b2Vec2(screenWidth/ratio/2, screenHeight/ratio/2); // центр экрана
               
        timeToRotate++;
        if (timeToRotate > 60 * 5) { // 3 sec
            rotationTime = rotationPeriod;
            timeToRotate = 0;
        }
        
        // В процессе поворота
        if (rotationTime > 0) {
            rotationTime -= 1/60;
            
            // рисуем сцену повернутую на нужный синус и косинус
            for (var body = world.GetBodyList(); body; body = body.GetNext()) {
                body.SetPosition(b2Math.AddVV(b2Math.MulMV(rotationMatrix, b2Math.SubtractVV(body.GetPosition(), axis)), axis));

                if (body !== PLAYER) { // поврачиваем сцену на угол angle (кроме персонажа)
                    body.SetAngle(body.GetAngle() + angle);
                }
            }
        }

Box2DФорумОбщее

Тема в архиве.