我正在尝试创建一种效果,其中两个射弹将在给定的实体上以给定的偏移量出现给玩家。这是一个快速实施;
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());
答案 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弧度下会发生什么。 sin
和cos
的一些简要说明:
sin(0) = 0
cos(0) = 1
sin'(0) = 1
cos'(0) = 0
(第二个是衍生物:sin最初在增加,cos在开始时是平的。检查它们的图。)这个和更多的直觉有助于编写图形代码 - 如果我们考虑{{1}时的情况我们找回原始代码。一个例外:你得到相对于第一个偏移的第二个偏移:我会避免这样做,而是在创建第一个抛射物后制作两个theta = 0
副本或重置m_owner->GetSprite().getPosition();
。