Матихельпар. W Rapangle () ротация issuC#

Место общения программистов C#
Ответить
Anonymous
 Матихельпар. W Rapangle () ротация issu

Сообщение Anonymous »

Моя игра включает в себя корабли, движущиеся и вращающиеся вокруг цели (то есть вражеский корабль). Вращение зависит от того, хочет ли пользователь поворачиваться по порту/правый борт или просто на ближайшей стороне к врагу. Сохранение углов между PI и -PI отлично работает, пока вращающийся корабль не достигнет точки, где -3.141 не станет 3,141 (и наоборот). Например, корабль правильно вращается до порта, затем, когда он попадает в эту линию, он переворачивается через правый борт, затем снова обратно в порт, затем снова правый борт и т. Д. 'barrier'
[*]Point out any inefficiencies in my code (I'm sure there are many, and I'm sure there are many other ways to do this more efficiently)
[*]Link to any relevant articles or tutorials that can help me overcome this issue (this is my first game)

Additional Information:

Код: Выделить всё

Ship.ShipMoveState.NoMoveRotate
- это, по сути, флаг, который сообщает кораблю вращаться (начиная с 100 -й максимальной скорости, пока мы не достигнем максимальной скорости) либо порт, либо правый борт, в зависимости от того, что самое близкое. Корабль вращается к этим сторонам, так как именно там находится оружие. Shipmovestate.awaitfurterorders говорит, что корабль вращается в зависимости от разницы в угле между ближайшей стороной (порт/правый борт) и углом к ​​врагу.
ShipCompartment primeCompartment = TargetShip.CenterCompartment;
if (FireState == ShipFireState.FireAtTarget)
primeCompartment = TargetCompartment;

// If ship is to the left of target, below will work
Vector2 distanceToDestination = primeCompartment.Position - CenterCompartment.Position;
float angleToEnemy = (float)Math.Atan2(distanceToDestination.Y, distanceToDestination.X);
angleToEnemy = MathHelper.WrapAngle(angleToEnemy);

CenterCompartment.Rotation = MathHelper.WrapAngle(CenterCompartment.Rotation);
float portBatteryAngle = MathHelper.WrapAngle(CenterCompartment.Rotation - Helpers.RightAngle);
float starboardBatteryAngle = MathHelper.WrapAngle(CenterCompartment.Rotation + Helpers.RightAngle);

float allowance = 0.005f;
bool portIsClosest = false;

switch (primaryFacing)
{
case PreferredFacing.None:
// If port battery not facing enemy
if (angleToEnemy > (MathHelper.WrapAngle(portBatteryAngle + allowance))
|| angleToEnemy < (MathHelper.WrapAngle(portBatteryAngle - allowance)))
{
// And starboard battery not facing either
if (angleToEnemy > (MathHelper.WrapAngle(starboardBatteryAngle + allowance))
|| angleToEnemy < (MathHelper.WrapAngle(starboardBatteryAngle - allowance)))
MoveState = Ship.ShipMoveState.NoMoveRotate;
else
MoveState = ShipMoveState.AwaitFurtherOrders;
}
else
{
portIsClosest = true;
MoveState = ShipMoveState.AwaitFurtherOrders;
}

if (MoveState == ShipMoveState.AwaitFurtherOrders)
{
float diff = 0f;

if (portIsClosest)
diff = angleToEnemy - portBatteryAngle;
else
diff = angleToEnemy - starboardBatteryAngle;

RotateShip(diff);
}
else if (MoveState == Ship.ShipMoveState.NoMoveRotate)
{
// Turn to port (if target is between 6 and 9 o'clock)
if (angleToEnemy < portBatteryAngle)
RotateShip(-MaxRotation / 100);
// Turn to starboard (if target is between 3 and 6 o'clock)
else if (angleToEnemy > starboardBatteryAngle)
RotateShip(MaxRotation / 100);
else
{
if (angleToEnemy > portBatteryAngle && angleToEnemy < starboardBatteryAngle)
{
// Turn to starboard (if target is between 9 and 12 o'clock)
if (angleToEnemy < CenterCompartment.Rotation)
RotateShip(MaxRotation / 100);
// Turn to port (if target is between 12 and 3 o'clock)
else
RotateShip(-MaxRotation / 100);
}
}
}
break;
}
< /code>
Пожалуйста, дайте мне знать, если вам требуется дополнительная информация. Большое спасибо за вашу помощь.

Подробнее здесь: https://stackoverflow.com/questions/241 ... tion-issue
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»