void CCMissile::step(float dt) { // position of target and aimed CCNode* target = getTarget(); CCPoint t = target->getPosition(); CCPoint a = m_aimed->getPosition(); // position vector degree CCPoint v = ccpSub(a, t); float r = ccpToAngle(v); float d = -CC_RADIANS_TO_DEGREES(r); d -= m_presetDegree; // save dest degree if(m_dstDegree != d) { m_dstDegree = d; } // rotate to dst degree gradually if(m_dstDegree > target->getRotation()) { float cur = MIN(m_dstDegree, target->getRotation() + dt * ANGULAR_VELOCITY); target->setRotation(cur); } else if(m_dstDegree < target->getRotation()) { float cur = MAX(m_dstDegree, target->getRotation() - dt * ANGULAR_VELOCITY); target->setRotation(cur); } // move target by velocity float move = m_velocity * dt; float distance = ccpLength(v); if(move >= distance) { target->setPosition(a); } else { t.x += move * cosf(r); t.y += move * sinf(r); target->setPosition(t); } // is done? m_done = getTarget()->getPositionX() == m_aimed->getPositionX() && getTarget()->getPositionY() == m_aimed->getPositionY(); // done callback if(m_done && m_doneCallFunc) { m_doneCallFunc->execute(); } }