2012-04-01 29 views
0

私はタイルスプライトとタイルの属性を保持するMapTileクラスを持っています。私は10x10グリッドで例えば100タイルを保持する2D配列を作成したいと思います。私は、タイルスプライトだけを保持している普通の古い2D配列を使用してタイルマップを描画し、うまくいきました。しかし、mapDataという名前の2D配列にMapTileクラスを含むタイルスプライトを割り当て、mapData[i][j].tileSprite = tileNumを使用すると、列のすべての要素にtileNumという値が割り当てられます。私は、これを動作させるために考えられるすべてを試しました。私はRubyを初めて使うC++プログラマーです。Rubyで2D配列のクラスオブジェクトに値を代入する方法

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 

ソリューション

def array2D(width,height) 
a = Array.new(width) { MapTile.new(10,0)} 
a.map! { Array.new(height) { MapTile.new(10,0) } } 
return a 
end 

にarray2D方法を変更しましたおかげでマイケル!

答えて

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 } 

ところで:ルビーむしろunidiomaticているあなたのコード内のいくつかのものがありますが、あなたはCode Review Stack Exchangeによってそのを実行したいことがあります。

+0

マイケルさん!変更を反映するために質問を編集しました。あなたのソリューションは機能しました。コードレビュースタックエクスチェンジでコードを実行します。素晴らしいサイトのように見えます!助けてくれてありがとう! – Spencer

+0

Ehm Spencer、あなたはあなたのために働いた答えを受け入れるよう訴えられます。 – steenslag

+0

ありがとうございます。今修正されました。 – Spencer

関連する問題