我如何使标签或图片框不那么不透明?

问题描述

我正在制作一个游戏,其中玩家的可见度有限,并且可以使用通电和检查点在整个​​游戏中改变这种可见度。由于我不知道如何以正确的方式实现可见性,因此我决定在播放器上放置一个标签/图片框并将其用作可见性限制器。我的问题是,我不知道如何使图片框或标签的不透明性低于同一个表单上的另一个

解决方法

以下是您的一般问题的解决方案示例。创建一个新的 Windows 窗体应用程序项目并向窗体添加两个 PictureBox 控件和两个 Label 控件。在每个 Image 控件中设置一个 PictureBox。将以下代码添加到表单中:

Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
    With Label1
        .AutoSize = False
        .Size = PictureBox1.Size
        .Location = Point.Empty
        .Parent = PictureBox1
        .BackColor = Color.FromArgb(100,100,100)
    End With

    With Label2
        .AutoSize = False
        .Size = PictureBox2.Size
        .Location = Point.Empty
        .Parent = PictureBox2
        .BackColor = Color.FromArgb(100,100)
    End With
End Sub

运行该项目,您将看到两个 PictureBox 控件与 Label 控件重叠。第一个 PictureBox 被相应的 Label 完全遮住,因为 Label 是不透明的,而第二个 PictureBox 显示通过第二个 Label,因为BackColor 是透明的{1}} Label

在您的情况下,因为 LabelPictureBox 的父级,您仍然可以照常移动 PictureBox,透明的 Label 将随之移动.请注意,您无法在设计器中向 PictureBox 添加子控件,因此您必须像我上面所做的那样在代码中进行。

编辑:

我不会在这里做,但值得注意的是,您实际上可以创建自己的自定义控件,该控件继承了 PictureBox,然后在构造函数中创建了自己的子项 Label。然后,您可以通过控件的属性公开 BackColorLabel,然后可以通过该属性设置该叠加层的颜色和透明度级别。您可以选择单独显示透明度级别,或者只使用该 Color 属性的 Alpha 通道。

编辑:

我说过我不会在这里做,但这里是我上面提到的自定义控件的实现:

Imports System.ComponentModel

''' <summary>
''' A picture box control with a transparent overlay.
''' </summary>
Public Class OverlaidPictureBox
    Inherits PictureBox

    'The label that provides the overlay.
    Private WithEvents overlayLabel As Label

    ''' <summary>
    ''' Creates a new instance of the <see cref="OverlaidPictureBox"/> class.
    ''' </summary>
    ''' <remarks>
    ''' The overlay color is the default back color but fully transparent.
    ''' </remarks>
    Public Sub New()
        Me.New(Color.FromArgb(0,DefaultBackColor.R,DefaultBackColor.G,DefaultBackColor.B))
    End Sub

    ''' <summary>
    ''' Creates a new instance of the <see cref="OverlaidPictureBox"/> class.
    ''' </summary>
    ''' <param name="overlayColor">
    ''' The overlay color,including the transparency level.
    ''' </param>
    Public Sub New(overlayColor As Color)
        overlayLabel = New Label With {.BackColor = overlayColor,.Dock = DockStyle.Fill}

        Controls.Add(overlayLabel)
    End Sub

    ''' <summary>
    ''' The overlay color,including the transparency level.
    ''' </summary>
    ''' <returns>
    ''' A <see cref="Color"/> value representing the overlay color.
    ''' </returns>
    <Category("Appearance")>
    Public Property OverlayColor As Color
        Get
            Return overlayLabel.BackColor
        End Get
        Set
            overlayLabel.BackColor = Value
        End Set
    End Property

    ''' <summary>
    ''' Occurs when the value of the <see cref="OverlayColor"/> property changes.
    ''' </summary>
    Public Event OverlayColorChanged As EventHandler

    Private Sub overlayLabel_BackColorChanged(sender As Object,e As EventArgs) Handles overlayLabel.BackColorChanged
        OnOverlayColorChanged(EventArgs.Empty)
    End Sub

    ''' <summary>
    ''' Raises the <see cref="OverlayColorChanged"/> event.
    ''' </summary>
    ''' <param name="e">
    ''' The data fr the event.
    ''' </param>
    Protected Overridable Sub OnOverlayColorChanged(e As EventArgs)
        RaiseEvent OverlayColorChanged(Me,e)
    End Sub

End Class

只需将该类添加到您的项目并构建,然后新控件就会出现在工具箱中,您可以像使用任何其他控件一样使用它。默认情况下,它的行为与任何其他 PictureBox 一样,但您会在 Properties 窗口中看到一个新的 OverlayColor 属性。默认情况下应该是 (0,240,240)。您可以将前导 0 更改为最多 255 的任何其他值,您会看到叠加层变得更加不透明。如果您希望叠加层不是默认的 Control 颜色,您也可以更改其他值。

,

尽管执行此操作的方法因游戏引擎和语言而异,但这里有一些方法对您有用。

在播放器的屏幕上覆盖一个“小插图图像”。一个这样的图像可能是这样的:vignette image - click me 这个图像,对于一个加电功能,可以用一个稍微少一点的“黑暗”(因为没有更好的词)来代替,以增加可视区域。调整大小(增加图像的宽度和高度,并调整 x 和 y 坐标以将其保持在中间)同样有效。

在虚幻引擎中,我相信软件中有一个可编辑的属性。有关更多信息,请参阅虚幻引擎关于晕影系统的文档:unreal engine's documentation - click me

Unity 还具有小插图功能。这是在用户界面中:unity vignette feature

如果您需要更多帮助(关于 Unity 方法),这里有一个值得查看的资源:jimmy vegas' unity vignette tutorial - click me

让我知道这些是否有效。我不确定您是如何制作游戏的,因此我的回答可能适用于您的特定情况,也可能无效。