1

同时处理平移和旋转转换时遇到问题。我刚刚开始尝试构建小行星,这是我第一次编写 WPF 应用程序。

我的玩家飞船由 Polygon 对象表示,它对 keydown 事件执行旋转和平移。

我的旋转变换按预期单独工作。主要问题是,一旦我平移然后尝试再次旋转,旋转变换会尝试围绕前一个点旋转,即使它指定获取新的 centerX 和 centerY 坐标。

平移变换似乎使多边形大致移动了 +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>
4

1 回答 1

0

渲染变换在渲染时应用,不会改变对象本身的状态。如果要应用后续翻译,则需要一个 TransformGroup。那个有一个 Children 属性,您可以按照希望它们执行的顺序向其中添加变换,这样您就可以翻译,然后旋转,然后再次翻译等。

当然,如果他们中的许多人作为孩子累积,则可能需要一些时间来计算生成的 TransformMatrix。在这种情况下,您可能希望定期告诉 TransformGroup 给您一个 TransformMatrix (如果它没有这样的方法在网上搜索某些实现),然后您可以将其用作 TransformGroup 的唯一子代(删除以前的那些)。然后你再次开始添加更多的子元素,如 TranslateTransform 等,然后如果说你达到 10 个变换,你再次删除它们并为所有它们添加等效的 MatrixTransform 作为 TransformGroup 的第一个子元素,依此类推......

于 2015-11-30T17:14:46.243 回答