C# WPF 复合转换问题
本文关键字:问题 转换 复合 WPF | 更新日期: 2023-09-27 18:34:25
同时
处理平移和旋转转换时遇到问题。我刚刚开始尝试构建小行星,这是我第一次编写 WPF 应用程序。
我的玩家飞船由一个多边形对象表示,它对键控事件执行旋转和平移。
我的旋转变换按预期单独工作。主要问题是,一旦我平移然后尝试再次旋转,旋转变换就会尝试围绕前一个点旋转,即使它指定为获取新的 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>
渲染转换在渲染时应用,不会更改对象本身的状态。如果你想应用相应的翻译,你需要一个TransformGroup。它有一个 Children 属性,您可以按照您希望它们执行的顺序添加转换,以便您可以翻译,然后重新转换,然后再次翻译等。
当然,如果其中许多累积为子级,则可能需要一些时间来计算生成的转换矩阵。在这种情况下,您可能希望定期告诉 TransformGroup 为您提供一个 TransformMatrix(如果它没有针对网络上某些实现的方法搜索(,然后您可以将其用作 TransformGroup 的唯一子项(删除以前的子级(。然后你再次开始添加更多的子项,如翻译变换等,然后如果说你达到 10 个变换,你再次删除它们并为所有这些添加等效的矩阵变换作为变换组的第一个子级,依此类推......