У меня довольно сложная проблема. По сути, у меня есть объект, который отслеживает положение игроков, используя алгоритм LOS, чтобы всегда лететь к текущему положению игроков.
Однако у меня возникла проблема, так как я пытаюсь заставить объект стрелять пулями в направлении игрока. Объект использует чистую векторную математику для движения к игроку, но, учитывая то, как работают мои функции, пули должны использовать кватернионы.
Итак, если объект движется к игроку, как я могу сделать вращение кватерниона, которое может использоваться функцией пули для создания пуль, которые также движутся к игроку, а их источником является объект?
Моя функция для рисования объекта, следующего за игроком:
private void drawEnemy(GameTime gameTime)
{
angle += 0.1f;
velocity = Vector3.Normalize(xwingPosition - enemyPos) * 0.02f;
enemyPos = enemyPos + velocity;
enemyWorldMatrix = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(enemyPos);
DrawObject(enemy, enemyWorldMatrix, viewMatrix, projectionMatrix);
//enemyRotation = GetRotation(xwingPosition, enemyPos);
//Quaternion additionalRot = Quaternion.CreateFromAxisAngle(new Vector3(0, -1, 0), -0.1f) * Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), -0.1f);
//enemyRotation *= additionalRot;
double currentTime = gameTime.TotalGameTime.TotalMilliseconds;
if (currentTime - enemyLastBulletTime > 1000)
{
EnemyBullet newBullet = new EnemyBullet();
newBullet.position = new Vector3(enemyPos.X + 0.2f, 71, enemyPos.Z + 0.2f);
newBullet.t = 0.01f;
newBullet.proportion = newBullet.t / 120;
newBullet.playerPosition = xwingPosition;
newBullet.enemyPosition = enemyPos;
newBullet.currentAccel = 0.025f;
enemyBulletList.Add(newBullet);
enemyLastBulletTime = currentTime;
}
}
Как видите, он использует векторную математику для отслеживания и перемещения к игроку.
Как видите, я пытаюсь создать пули. В пулях используется вращение кватерниона, которое, я надеюсь, создал правильно.
Моя функция для обновления позиций маркеров после их создания из первой написанной мной функции.
private void UpdateEnemyBulletPositions()
{
for (int i = 0; i < enemyBulletList.Count; i++)
{
EnemyBullet currentBullet = enemyBulletList[i];
currentBullet.t += 0.01f;
currentBullet.position = enemyPos + (Vector3.Normalize(currentBullet.playerPosition - currentBullet.enemyPosition) * currentBullet.proportion);
MoveForward(ref currentBullet.position, currentBullet.rotation, 0.04f + (currentBullet.currentAccel));
enemyBulletList[i] = currentBullet;
BoundingSphere bulletSphere = new BoundingSphere(currentBullet.position, 0.05f);
CollisionType colType = CheckCollision(bulletSphere);
if (colType != CollisionType.None)
{
enemyBulletList.RemoveAt(i);
i--;
if (colType == CollisionType.Target)
gameSpeed *= 1.05f;
}
}
}
xwingPosition — текущая позиция игрока.
enemyPos — текущая позиция объекта, следующего за игроком.
Проблема показана в этом ролике на YouTube, который я только что подготовил...
http://www.youtube.com/watch?v=PnkCVKdfN9Y
Я думаю, проблема заключается в том, чтобы установить t на общее количество прошедших миллисекунд, а не на счетчик, начинающийся с 0. Дело в том, что я не знаю, как запускать счетчик с 0 каждый раз, когда производится пуля.
t
сбивает с толку; просто назовите это как-то иначе. 14.10.2012for
должна бытьcurrentBullet.position = currentBullet.enemyPos + ...
В противном случае вы бы использовали положение врага сейчас, а не положение, которое было в момент выстрела пули. 15.10.2012