Precisely. I'm guessing you thought @data would be an array of Symbols, and, each time you pushed a new Sprite_TitleCommand in (which would call an update method to change its position), you thought the array's size would increase by one, effectively putting each new sprite below the previous. Problem is that @data will never be an array object, based on the way you are initializing your sprites:
@commands << Sprite_TitleCommand.new(nil, command)
where 'command' is iterating over
TITLE_COMMANDS =[:new_game, :new_game_plus, :continue, :manual, :website,
:shutdown]
So your best solution would probably be to overload your Sprite_TitleCommand to take another parameter for index position, as you said.
def initialize(viewport, data, index)
@item_draw_index = index
...
super(viewport, data)
end
...
def update_position
@org_pos = [Graphics.width / 2, (26 * @item_draw_index) + 200]
...
EDIT:
To achieve the effect you were probably going for, you would need to do
@commands << Sprite_TitleCommand.new(nil, @commands + [command])
but this will cause errors with some of your methods.