VBA Excel类Rogue游戏开发:对象/类多实例及NPC实例化疑问
关于VBA中创建自定义类实例的
Dim+Set操作必要性解答 嘿,很高兴看到你在Excel VBA里开发Rogue/Nethack风格的GUI游戏——这想法真的很有意思!先给你吃个定心丸:你现在用的Dim NPC as NPCclass声明变量,再在子程序里用Set NPC = New NPCclass创建实例的操作,完全是正确且必要的,甚至是VBA里处理自定义对象的规范做法。
下面给你拆解下背后的逻辑:
- 在VBA里,对象类型(比如你自定义的
NPCclass、Player类,甚至Excel自带的Worksheet对象)和普通数据类型(比如Integer、String)是完全不同的:Dim NPC as NPCclass只是告诉VBA“我要一个能指向NPCclass对象的变量”,但这时候这个变量只是个空指针,指向的是Nothing(没有实际的对象存在)。- 必须用
Set NPC = New NPCclass这一步,才能在内存里真正创建一个NPCclass的实例,让之前声明的变量指向这个实例——只有这样,你才能调用类里的移动方法、访问坐标属性。
举个反例,如果你跳过Set步骤直接写NPC.Move,VBA会立刻抛出**“对象变量或With块变量未设置”**的运行时错误,因为此时根本没有实际的NPC对象可以操作。
至于为什么教程没提这一点,大概率是因为两种情况:
- 有些基础教程会简化写法,直接用
Dim NPC as New NPCclass这种“声明时自动实例化”的语法——但这种写法有隐藏坑:每次你引用NPC变量时,如果它当前是Nothing,VBA会自动帮你创建一个新实例,这可能导致你无意中创建多个重复的NPC实例,或者在逻辑判断时出现意料之外的行为。 - 部分教程默认读者已经了解VBA对象的引用规则,所以省略了这部分基础解释。
回到你的游戏场景,这种手动Set的方式反而更适合你:比如你要生成多个随机移动的NPC时,可以用数组来存储实例:
Dim npcs(1 to 5) as NPCclass Dim i as Integer For i = 1 to 5 Set npcs(i) = New NPCclass ' 初始化每个NPC的初始坐标等属性 npcs(i).X = Int(Rnd() * 10) npcs(i).Y = Int(Rnd() * 10) Next i
这样每个NPC都是独立的实例,各自维护自己的状态,完全符合Rogue类游戏的需求。
内容的提问来源于stack exchange,提问作者user9609468
相关产品推荐
相关产品推荐

