2013-04-11 12 views
1

Я пытаюсь создать эффект, когда два снаряда выйдут на заданный объект с заданным смещением игрока. Это была быстрая реализация;Вращение вокруг объекта с заданным смещением

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()); 

ответ

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 

(вторые производные:.. Грех сначала растут, потому плоская в начале Проверьте свои графики) Это и немного больше интуиции полезно для написания графики код - если мы рассмотрим случай, когда theta = 0 вернем исходный код. Единственное исключение: вы получаете второе смещение относительно первого смещения: я бы этого не сделал и вместо этого сделал две копии m_owner->GetSprite().getPosition(); или сбросил offset после создания первого снаряда.

+0

Мне явно нужна ложка, питающаяся этим, даже после отличного объяснения, оно все еще не погружается. Я считаю, что сущность вращения была в градусах, поэтому я преобразовал ее в радианы, а затем попытался выполнить код выше. 'код (радиан = математика :: to_rad (m_owner-> GetSprite() getRotation());. offset.x = 5 * sin (рад); offset.y = -5 * соз (рад) createProjectile (offset, rad);) ' Кроме того, код, который вы указываете, сокращает исходное положение, как я могу применить его обратно к оригинальному? – user1725794

+0

Это работало? Судя по вашему исходному коду 'createProjectile', нужно взять градусы, не так ли? Возможно, поместите код 'createProjectile' в ваш исходный вопрос. –

+0

После двойной проверки createProjectile() принимает вращение в градусах, так как оно затем применяется к спрайту, который принимает его в дедугию. Так что я был прав, превратив его из града в рад, я сделал что-то правильно на этот раз! – user1725794