平行移動と回転の変換を同時に処理する際に問題が発生します。小惑星の構築を試み始めたばかりで、WPF アプリケーションをプログラミングするのはこれが初めてです。
私のプレイヤー シップは Polygon オブジェクトで表され、キーダウン イベントで回転と移動を実行します。
私の回転変換は、個別に期待どおりに機能します。主な問題は、一度移動してから再度回転しようとすると、新しい centerX および centerY 座標を取得するように指定されていても、回転変換が前のポイントを中心に回転しようとすることです。
平行移動変換は、Polygon をおおよそ +50x および +50y に移動するように見え (変換で使用される座標がそうでないことを証明しているにもかかわらず)、回転によって指定された方向に正しく移動します。
誰かが私に与えることができる助けを前もってありがとう!
ここに私のC#があります:
public void handleRotate(KeyEventArgs e)
{
if (e.Key == Key.Right)
{
this.rotate(10);
}
if (e.Key == Key.Left)
{
this.rotate(-10);
}
}
public void handleUpDown(KeyEventArgs e)
{
if (e.Key == Key.Up)
{
this.move();
}
}
public double convertToRadians(double angle)
{
return (Math.PI / 180) * (angle - 90);
}
public void move()
{
double radians = convertToRadians(playerShip.getHeading());
double xMovement = Math.Cos(radians) * 10;
double yMovement = Math.Sin(radians) * 10;
playerShip.setShipCenterX(xMovement += playerShip.getShipCenterX());
playerShip.setShipCenterY(yMovement += playerShip.getShipCenterY());
MessageBox.Show("Heading: " + playerShip.getHeading().ToString() + " centerx: " + playerShip.getShipCenterX().ToString() + " centery: " + playerShip.getShipCenterY().ToString());
TranslateTransform translate = new TranslateTransform(xMovement, yMovement);
theShipShape.RenderTransform = translate;
}
public void rotate(double rotation)
{
double newHeading = playerShip.getHeading() + rotation;
RotateTransform rotate = new RotateTransform(newHeading, playerShip.getShipCenterX(), playerShip.getShipCenterY());
MessageBox.Show("Heading: " + newHeading.ToString() + " centerx: " + playerShip.getShipCenterX().ToString() + " centery: " + playerShip.getShipCenterY().ToString());
theShipShape.RenderTransform = rotate;
playerShip.setHeading(newHeading);
}
}
ここに私のxamlがあります:
<Window x:Name="GameWindow" x:Class="AsteroidsAttempt2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Canvas x:Name="GameCanvas" Focusable="True" IsEnabled="True" HorizontalAlignment="Left" Height="320" VerticalAlignment="Top" Width="517" KeyDown="GameCanvas_KeyDown"/>
</Window>