C# wpf 中的 2D 相机

Hui Liu-MSFT 48,711 信誉分 Microsoft 外部员工
2024-02-27T09:22:31.69+00:00

我知道这不是正确的选择,但我正在尝试用 wpf 制作游戏引擎。 当然,这个游戏引擎应该有一个 2D 相机。 有谁知道如何做到这一点? 我将用左右箭头键移动它 Note:此问题总结整理于 2D camera in c# wpf

开发人员技术 | Windows Presentation Foundation
0 个注释 无注释
{count} 票

问题作者接受的答案
  1. 匿名
    2024-02-27T09:35:25.6566667+00:00

    下面是一个如何使用 ScrollViewer 使其保持在“相机”视野中的示例。 你可以尝试参考一下

    xaml的代码:

    <Window x:Class="_2dCameraDemo.MainWindow"  
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  
            xmlns:local="clr-namespace:_2dCameraDemo"  
            mc:Ignorable="d"  
            Title="MainWindow"  
            Loaded="Window_Loaded"  
            SizeToContent="WidthAndHeight"  
            PreviewKeyDown="Window_PreviewKeyDown">  
        <Grid>  
            <ScrollViewer x:Name="CanvasViewer"   HorizontalScrollBarVisibility="Hidden"  VerticalScrollBarVisibility="Hidden">  
                <Canvas x:Name="Canvas"  IsHitTestVisible="False" >  
                    <Canvas.Background>  
                        <ImageBrush ImageSource="11.jpg"/>  
                    </Canvas.Background>  
                </Canvas>  
            </ScrollViewer>  
        </Grid>  
    </Window>
    

    xaml.cs的代码:

    public partial class MainWindow : Window  
      {  
        double _playerSize;  
    
        Rectangle _playerRect;  
        Vector _playerPosition;  
    
        public MainWindow()  
        {  
          InitializeComponent();  
        }  
        private void Window_Loaded(object sender, RoutedEventArgs e)  
        {  
          InitializeSizes();  
          InitializePlayerRect();  
        }  
        private void InitializeSizes()  
        {  
          _playerSize = 30;  
          Canvas.Width = 700;  
          Canvas.Height = 700;  
    
          CanvasViewer.Width = 400;  
          CanvasViewer.Height = 400;  
        }  
        private void InitializePlayerRect()  
        {  
          _playerRect = new Rectangle  
          {  
            Fill = Brushes.LightPink,  
            Width = _playerSize,  
            Height = _playerSize,  
            HorizontalAlignment = HorizontalAlignment.Left,  
            VerticalAlignment = VerticalAlignment.Top  
          };  
    
          Canvas.Children.Add(_playerRect);  
        }  
        private void Window_PreviewKeyDown(object sender, KeyEventArgs e)  
        {  
          switch (e.Key)  
          {  
            case Key.Left: MovePlayerLeft(); break;  
            case Key.Up: MovePlayerUp(); break;  
            case Key.Right: MovePlayerRight(); break;  
            case Key.Down: MovePlayerDown(); break;  
          }  
        }  
        private void MovePlayerLeft()  
        {  
          var newX = _playerPosition.X - _playerSize;  
          _playerPosition.X = Math.Max(0, newX);  
          UpdatePlayerPositionAndCamera();  
        }  
    
        private void MovePlayerUp()  
        {  
          var newY = _playerPosition.Y - _playerSize;  
          _playerPosition.Y = Math.Max(0, newY);  
          UpdatePlayerPositionAndCamera();  
        }  
    
        private void MovePlayerRight()  
        {  
          var newX = _playerPosition.X + _playerSize;  
          _playerPosition.X = Math.Min(Canvas.Width - _playerSize, newX);  
          UpdatePlayerPositionAndCamera();  
        }  
        private void MovePlayerDown()  
        {  
          var newY = _playerPosition.Y + _playerSize;  
         _playerPosition.Y = Math.Min(Canvas.Height - _playerSize, newY);  
          UpdatePlayerPositionAndCamera();  
        }  
        private void UpdatePlayerPositionAndCamera()  
        {  
          UpdatePlayerPosition();  
          UpdateCamera();  
        }  
        private void UpdatePlayerPosition()  
        {  
          _playerRect.Margin = new Thickness(_playerPosition.X, _playerPosition.Y, 0, 0);  
        }  
        private void UpdateCamera()  
        {  
          var offsetX = _playerPosition.X / 2;  
          var offsetY = _playerPosition.Y / 2;  
          CanvasViewer.ScrollToHorizontalOffset(offsetX);  
          CanvasViewer.ScrollToVerticalOffset(offsetY);  
        }  
      }
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。