【问题标题】:how to naturally rotate a ball according to its velocity on a surface, a wall如何根据球在表面、墙壁上的速度自然地旋转球
【发布时间】:2015-11-19 13:08:05
【问题描述】:

我正在用 cocos2d-x 开发一个游戏,里面有一个球精灵。我通过触摸事件在表面(墙壁)上移动球。是否可以根据球的速度自然地旋转球?

如果我在 update(float dt) 方法中使用 ballSprite->runAction(..) 那么它不会旋转。

我使用以下代码:

void GameLayer::updateBall(float dt)
{
  float deltaRotateX = 360.0f * _ballVelocityX;
  _ballSprite->setRotation(90.0f- CC_RADIANS_TO_DEGREES(deltaRotateX));
}

但球不会自然旋转。它离散地旋转。
它不能根据它的速度自然旋转。

谢谢。

【问题讨论】:

  • 您正在混合度数和弧度。您将乘以 360,然后将其从弧度转换为度数。

标签: rotation cocos2d-x sprite velocity


【解决方案1】:

你的问题可能意味着几件事。你想在一个表面上“滚动”的同时让球旋转吗?您是否希望球始终根据其移动速度旋转?你想让球在从墙上反弹后以某种方式旋转吗?所有这些都有不同的答案。

对于您的问题,我假设您想将球拖到墙上,并且它必须在移动时“滚动”。要实现这种行为将很难与速度相结合,因为您正在“拖动”球并且它不会基于运动而移动。所以我会用球在我的 onTouchMoved 函数中移动的增量来更新我的精灵的旋转。

ballSprite->setRotation(ballSprite->getRotation() + touch->getDelta().distance);

这将导致您的精灵在玩家将其拖过屏幕时旋转。

【讨论】:

    【解决方案2】:

    试试这个,

    Vec2 _lastBallPosition;//Declare this in your header file, it represents the las position of your ball
    
    void GameLayer::updateBall(float dt)
    {
    
        if (!_lastBallPosition.equals(getPosition())) {
            Vec2 delta=getPosition()-_lastBallPosition;
            setRotation(getRotation()+ delta.length());
           _lastBallPosition=getPosition();
        }
    
    }
    

    如果您的 cocos2dx 版本为 ,请使用 CCPoint 而不是 Vec2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多