You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

游戏开发:如何通过变量名引用地图文件中的目标变量?

嘿,我完全懂你遇到的麻烦——你想通过动态拼接的字符串(比如pos变量里的X1Y1)来访问SplashMap类里那些公共变量,但VB.NET不支持直接这么“按字符串名调用变量”。别着急,我给你两种解决思路,优先推荐更合理的重构方案,再讲应急的反射方法。

1. 最优方案:把零散变量换成结构化数据

首先说句实在的,用一堆X1Y1、X5Y4这种零散变量存地图数据,不仅遍历麻烦,后期维护和扩展也很头疼。换成二维数组或者字典会舒服太多,而且性能更好。

用二维数组重构(最推荐)

把SplashMap里的所有XnYm变量替换成一个二维数组,数组的索引对应行和列(注意VB数组索引从0开始,如果你习惯1开头的话,遍历的时候加1就行):

Public Class SplashMap
    ' 替换原来所有X1Y1、X2Y1...这类变量
    Public PixelData As String(,)
    Public xRes As Integer = 10 ' 你的地图宽度(列数)
    Public yRes As Integer = 10 ' 你的地图高度(行数)

    Public Sub New()
        ' 初始化数组,大小匹配你的地图分辨率
        PixelData = New String(xRes - 1, yRes - 1) {}
        ' 对应原来的X1Y1 = "idle"(索引0,0对应第1行第1列)
        PixelData(0, 0) = "idle"
        ' 对应原来的X5Y4 = "xxx"(索引4,3对应第5行第4列)
        PixelData(4, 3) = "some_pixel_value"
        ' 其他像素数据依次赋值...
    End Sub
End Class

然后遍历的代码就简单清晰多了:

Dim targetmap As SplashMap = New SplashMap()
For rowcount = 0 To targetmap.xRes - 1
    For columncount = 0 To targetmap.yRes - 1
        ' 直接通过数组索引获取像素值
        Dim pixelValue = targetmap.PixelData(rowcount, columncount)
        ' 如果PlacePixel需要的是"X1Y1"这种1开头的位置字符串,就把索引+1
        PlacePixel($"X{rowcount + 1}Y{columncount + 1}", pixelValue, vbNull)
    Next
Next

用字典重构(适合需要保留"X1Y1"键名的场景)

如果一定要保留X1Y1这种字符串作为标识,可以用Dictionary来存储:

Public Class SplashMap
    Public PixelData As Dictionary(Of String, String) = New Dictionary(Of String, String)()
    Public xRes As Integer = 10
    Public yRes As Integer = 10

    Public Sub New()
        ' 直接用"X1Y1"作为键赋值
        PixelData.Add("X1Y1", "idle")
        PixelData.Add("X5Y4", "some_pixel_value")
        ' 其他像素...
    End Sub
End Class

遍历的时候直接通过键获取值:

Dim targetmap As SplashMap = New SplashMap()
For rowcount = 1 To targetmap.xRes ' 直接从1开始,对应X1、X2...
    For columncount = 1 To targetmap.yRes
        Dim pos = $"X{rowcount}Y{columncount}"
        ' 先判断键是否存在,避免报错
        If targetmap.PixelData.ContainsKey(pos) Then
            Dim pixelValue = targetmap.PixelData(pos)
            PlacePixel(pos, pixelValue, vbNull)
        End If
    Next
Next

2. 应急方案:用反射动态访问变量

如果你暂时不想重构代码,必须保留现有的XnYm变量,那可以用反射来实现按字符串名访问变量。不过要注意,反射的性能比直接用数组/字典差,而且变量名拼写错了会报错,尽量少用。

代码示例:

Dim targetmap As SplashMap = New SplashMap()
For rowcount = 0 To targetmap.xRes Step 1
    For columncount = 0 To targetmap.yRes Step 1
        Dim pos = "X" & rowcount & "Y" & columncount
        ' 通过反射获取变量的信息
        Dim fieldInfo = GetType(SplashMap).GetField(pos, Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance)
        ' 如果变量存在,就获取它的值
        If fieldInfo IsNot Nothing Then
            Dim pixelValue = fieldInfo.GetValue(targetmap).ToString()
            PlacePixel(pos, pixelValue, vbNull)
        End If
    Next
Next

注意事项

  • 确保SplashMap里的变量是Public的,否则反射无法访问;
  • 如果你的变量名是X0Y0这种从0开始的,那遍历的rowcount和columncount从0开始就没问题;如果是从1开始的,记得把遍历起始值改成1。

内容的提问来源于stack exchange,提问作者Jordan Gray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:11:33