游戏开发:如何通过变量名引用地图文件中的目标变量?
嘿,我完全懂你遇到的麻烦——你想通过动态拼接的字符串(比如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
相关产品推荐
相关产品推荐

