围绕具有给定偏移的对象旋转

时间:2013-04-11 15:00:14

标签: c++ math sfml

我正在尝试创建一种效果,其中两个射弹将在给定的实体上以给定的偏移量出现给玩家。这是一个快速实施;

sf::Vector2f offset = m_owner->GetSprite().getPosition();

offset.y -= 5;
createProjectile(offset, m_owner->GetSprite().getRotation());
offset.y += 10;
createProjectile(offset, m_owner->GetSprite().getRotation());

如果你的实体只想在.x轴上射击,这种情况非常好。但是一旦你旋转了玩家,它就会因为偏移量没有偏离玩家当前的旋转而破裂。

我尝试了很多这方面的实现,但似乎没有任何工作,因为我在数学方面表现不佳,我不能自己解决。

void Weapon::createProjectile(const sf::Vector2f& position, float angle)
{
        m_owner->_state->addEntity(new Projectile(m_owner, position, angle,*m_texture, m_velocity, m_damage));
}

Projectile::Projectile(Entity* emitter, const sf::Vector2f& position, float angle,
    const sf::Texture& image, int speed, int damage) :
    Entity(emitter->_state, true, entityName::entityBullet, speed)
{
        Load(_state->getApp()->gettextureManager().Get("Content/ball.png"));
    GetSprite().setRotation(angle);

        SetPosition(position.x,position.y);
        GetSprite().setScale(0.4f,0.4);
}

解答:

float rad;
offset = m_owner->GetSprite().getPosition();

rad = math::to_rad(m_owner->GetSprite().getRotation());

offset.x += 5*sin(rad);
offset.y += -5*cos(rad);

createProjectile(offset,m_owner->GetSprite().getRotation());

offset = m_owner->GetSprite().getPosition();

offset.x += -5*sin(rad);
offset.y += 5*cos(rad);

createProjectile(offset,m_owner->GetSprite().getRotation());

1 个答案:

答案 0 :(得分:2)

你需要研究的数学是三角学。这非常有用!

如果你的角色从“直线向上”顺时针旋转theta弧度,则顶部 偏移量将是:

offset.x += 5*sin(theta);
offset.y += -5*cos(theta);

而另一个将是

offset.x += -5*sin(theta);
offset.y += 5*cos(theta);

这是“圆形数学”(三角学)5是你所说的偏移,也称为圆的半径。在进行这种数学运算时,快速检查是要考虑在0弧度下会发生什么。 sincos的一些简要说明:

sin(0) = 0
cos(0) = 1
sin'(0) = 1
cos'(0) = 0

(第二个是衍生物:sin最初在增加,cos在开始时是平的。检查它们的图。)这个和更多的直觉有助于编写图形代码 - 如果我们考虑{{1}时的情况我们找回原始代码。一个例外:你得到相对于第一个偏移的第二个偏移:我会避免这样做,而是在创建第一个抛射物后制作两个theta = 0副本或重置m_owner->GetSprite().getPosition();