我有一个MapTile
类,它包含一个tile精灵和tile的属性。我想创建一个2D数组,例如在10x10网格中保存100个图块。我使用一个只有瓷砖精灵的普通旧2D数组绘制了一个瓷砖地图,并且工作正常。但是,现在当我将一个tile精灵分配给名为mapData
且包含MapTile
类且使用mapData[i][j].tileSprite = tileNum
的2D数组时,会为该列中的每个元素分配tileNum
值。我已经尝试了所有我想到的工作。我是Ruby新手的C ++程序员。
class MapTile
attr_accessor :tileSprite, :attribute
def initialize(sprite, attr)
@tileSprite = sprite
@attribute = attr
end
def tileSprite
@tileSprite
end
def attribute
@attribute
end
end
def array2D(width,height)
a = Array.new(width, MapTile.new(123,0))
a.map! { Array.new(height, MapTile.new(123,0)) }
return a
end
@mapData = array2D(@mapSize,@mapSize)
mapData[1][j].tileSprite = tileNum #Now every tileSprite in column 1 is tileNum
解决方案
将array2D方法更改为
def array2D(width,height)
a = Array.new(width) { MapTile.new(10,0)}
a.map! { Array.new(height) { MapTile.new(10,0) } }
return a
end
谢谢迈克尔!
答案 0 :(得分:1)
您为每个数组元素使用相同的对象。请尝试使用Array.new(width) { MapTile.new(123,0) }
。
来自docs:
# only one copy of the object is created
a = Array.new(2, Hash.new)
# here multiple copies are created
a = Array.new(2) { Hash.new }
BTW:你的代码中有些东西是相当单一的Ruby,你可能希望通过Code Review Stack Exchange来运行它。