【问题标题】:How would I make a label or a picture box less opaque?如何使标签或图片框不那么不透明?
【发布时间】:2021-05-20 00:07:37
【问题描述】:

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

【问题讨论】:

  • 您是在说这是一个 Windows 窗体应用程序吗?
  • SO 明确要求每个问题只需要一个主题。如果您有两个问题,则需要发布两个单独的问题。您需要编辑此问题并删除第二段,然后将其作为单独的问题发布。这是一个示例,说明为什么您应该在收到提示时进行现场参观。
  • 是的,抱歉,它是一个 Windows 窗体应用程序,我刚刚对其进行了编辑。我的坏,不知道
  • 这可以在 vb.net 中使用吗?

标签: vb.net visual-studio game-development


【解决方案1】:

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

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, 100, 100)
    End With
End Sub

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

在你的情况下,因为LabelPictureBox 的父级,你仍然可以像往常一样移动PictureBox,透明的Label 会随之移动。请注意,您不能在设计器中将子控件添加到 PictureBox,因此您必须像我在上面所做的那样在代码中完成。

编辑:

我不会在这里做,但值得注意的是,您实际上可以创建自己的自定义控件,该控件继承 PictureBox,然后在构造函数中创建自己的子 Label。然后,您可以通过控件的属性公开LabelBackColor,然后您可以通过该属性设置该叠加层的颜色和透明度级别。您可以选择单独公开透明度级别,或者只使用 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, 240)。您可以将前导 0 更改为最高 255 的任何其他值,您会看到叠加层变得更加不透明。如果您希望覆盖不是默认的Control 颜色,您也可以更改其他值。

【讨论】:

    【解决方案2】:

    虽然执行此操作的方法因游戏引擎和语言而异,但这里有一些方法可以为您工作。

    在播放器屏幕上叠加一个“晕影图像”。一个这样的图像可能是这样的:vignette image - click me 这个图像,对于一个加电功能,可以用一个稍微“黑暗”(因为没有更好的词)的图像替换,以增加查看区域。调整大小(增加图像的宽度和高度,并调整 x 和 y 坐标以使其保持在中间)也可以。

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

    Unity 还有一个晕影功能。它在 UI 中:

    如果您需要更多帮助(关于 Unity 方法),这里有一个值得查看的资源:@​​987654324@

    让我知道这些是否有效。我不确定你是如何制作游戏的,所以我的回答可能对你的具体情况有效,也可能无效。

    【讨论】:

    • 不,这是在 Visual Basic 中作为 Windows 窗体应用程序,而不是通过实际的游戏引擎。非常感谢你:D
    • 那太糟糕了,我不熟悉。如果我找到任何东西,我一定会分享!
    猜你喜欢
    • 2013-09-20
    • 2018-03-08
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多