选择正确的分辨率

时间:2017-04-26 08:17:18

标签: c# wpf image xaml resolution

我正在制作视频游戏并且屏幕分辨率有问题。 早些时候,几个月前,我问过非常相似的问题。

Need images with lower resolution "stretched" to screen size

那时候,我得到的答案(使用ViewBox)似乎很完美,但现在我遇到了问题。

我希望我的游戏中的每一个图像和控件都有一些适合分辨率的不同可能的变化。 例如,如果用户设置分辨率为800x600,则所有图像和按钮都会缩小为正确的尺寸。但我确实希望我的游戏只是全屏,而不是窗口。

因此,如果分辨率低于最终用户监视器,则必须拉伸所有图像并使其看起来“模糊”。如果更高,部分必须在屏幕之外。

现在,我的代码只是为最终用户监视器设置解决方案,无论它是什么。这绝对不是我想要的。

我得到了什么:

enter image description here

我需要的一个非常粗略的例子:

enter image description here

我现在将xaml展示出来。当然它并不完整,但我会展示开头和一些元素,所以你会知道它是如何构建的。

<Window
    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" mc:Ignorable="d" x:Name="wdwMain" x:Class="RealityIncognita.MainWindow"
    Height="900" Width="1600" ResizeMode="NoResize" WindowState="Maximized" Cursor="Cross" WindowStyle="None" Loaded="wdwMain_Loaded">

<Viewbox x:Name="viewMain" Stretch="Fill">
    <Grid x:Name="areaContainer" HorizontalAlignment="Left" Height="900" VerticalAlignment="Top" Width="1600">

      <Grid x:Name="areaMain">
            <Grid.Background>
                <ImageBrush ImageSource="Resources/Images/Interface/main_interface.jpg"/>
            </Grid.Background>
            <Label x:Name="lblTextOutput" Content="Label" HorizontalAlignment="Center" Height="52" Margin="55,726,31,0" VerticalAlignment="Top" Width="1514" FontFamily="Arial" FontSize="22" FontWeight="Bold" HorizontalContentAlignment="Center"/>
            <Button x:Name="btnExit" HorizontalAlignment="Left" Height="106" Margin="1464,771,0,0" VerticalAlignment="Top" Width="126" Click="btnExit_Click" Background="{x:Null}" BorderBrush="{x:Null}" Foreground="{x:Null}">
                <Button.Template>
                    <ControlTemplate>
                        <Image Source="/Resources/Images/Interface/Blank.png" Stretch="Fill" Margin="12,0,6,0"/>
                    </ControlTemplate>
               </Button.Template>
            </Button>

            <Grid x:Name="areaShowers" HorizontalAlignment="Left" Height="700" Margin="1653,790,-1561,-590" VerticalAlignment="Top" Width="1508"  IsVisibleChanged="areaShowers_IsVisibleChanged">
                <Grid.Background>
                    <ImageBrush ImageSource="Resources/Images/Rooms/Showers/shower_room.jpg" />
                </Grid.Background>


                <Button x:Name="objShowersSoap" HorizontalAlignment="Left" Height="29" Margin="613,423,0,0" VerticalAlignment="Top" Width="17" MouseLeave="MouseLeaveAnyObject" RenderTransformOrigin="11.706,1.897" Click="objShowersSoap_Click" MouseEnter="objShowersSoap_MouseEnter">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Resources/Images/Rooms/Showers/soap.png" Stretch="Fill" Margin="0,0,0,0"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
                <Image x:Name="imgShowersOpenMachine" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" Source="Resources/Images/Rooms/Showers/drying_machine_open.png" RenderTransformOrigin="0.808,0.471" Stretch="Fill"/>
                </Button>                   
            </Grid>

            <Grid x:Name="areaLockerRoom" Height="700" VerticalAlignment="Top" Width="1508" IsVisibleChanged="areaLockerRoom_IsVisibleChanged" Margin="1653,17,-1561,0" MouseDown="areaLockerRoom_MouseDown" MouseEnter="areaLockerRoom_MouseEnter" MouseMove="areaLockerRoom_MouseMove">
                <Grid.Background>
                    <ImageBrush ImageSource="Resources/Images/Rooms/LockerRoom/locker_room_ready.png"/>
                </Grid.Background>

                <Button x:Name="objLockerRoomCrowbar" Content="" HorizontalAlignment="Left" Height="243" Margin="604,328,0,0" VerticalAlignment="Top" Width="51" MouseEnter="objCrowbar_MouseEnter" Panel.ZIndex="1" Click="objCrowbar_Click" MouseLeave="MouseLeaveAnyObject">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Resources/Images/Rooms/LockerRoom/crowbar_only.png" Stretch="Fill" Margin="0,0,0,0"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>

                <Button x:Name="objLockerRoomOdyssey" HorizontalAlignment="Left" Height="53" Margin="797,638,0,0" VerticalAlignment="Top" Width="61" Click="objBookOdyssey_Click" MouseLeave="MouseLeaveAnyObject" MouseEnter="objBookOdyssey_MouseEnter">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Resources/Images/Rooms/LockerRoom/img_book_odyssey.png" Stretch="Fill" Margin="0,0,0,0"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>
                <Button x:Name="objLockerRoomEdda" HorizontalAlignment="Left" Height="53" Margin="1335,549,0,0" VerticalAlignment="Top" Width="61" MouseLeave="MouseLeaveAnyObject" Click="objBookEdda_Click" MouseEnter="objBookEdda_MouseEnter">
                    <Button.Template>
                        <ControlTemplate>
                            <Image Source="Resources/Images/Rooms/LockerRoom/img_book_edda.png" Stretch="Fill" Margin="0,0,0,0"/>
                        </ControlTemplate>
                    </Button.Template>
                </Button>

总结结构是这样的:

主窗口 - Viewbox - areaContainer(主网格) - 游戏区域(网格) - 每个网格的图像和按钮

总结一下: 我得到的:游戏屏幕设置为最终用户的显示器分辨率。 我需要的是:游戏将所有图像设置为特定分辨率,如果分辨率低于最终用户,则使其“模糊”,如果分辨率较高,则将其“削减”。

提前谢谢你, 叶甫盖尼

增加: 如果我理解它是如何工作的 - 包含所有其他项目的容器网格应该调整大小,如果需要,图像应该变小(默认情况下它们是1600x900)。然后,这个容器网格必须符合用户的屏幕分辨率,保持小图像质量。

更简化它:我可以缩小大图像,然后直接在Visual Studio中将它们更改为大(并且丢失质量)吗?

1 个答案:

答案 0 :(得分:0)

实际上只是简单地调整视图就可以了。

<Viewbox x:Name="viewMain" VerticalAlignment="Center" HorizontalAlignment="Center">

在代码中,我必须更改MaxWidth和MaxHeight,而不是常规的。

viewMain.MaxWidth = 1024;
viewMain.MaxHeight = 768;