the reason I'm asking is I'll have to make loads of the fields in each block public so the Room class can get at them to do its _spritebatch.Draw eg. block._position
Assuming you have many rooms and in each room many blocks, you can give each room and each block a public or protected Draw() method, then all the fields of the block do not need to be public.
class Block
{
... // private fields about Block
...
Public void Draw(GameTime gt, SpriteBatch sb)
{
sb.Draw(private block fields here);
}
}
Then for the Rooms
class Room
{
... // private fields about room
...
List<Block> blocks;
Public void Draw(GameTime gt, SpriteBatch sb)
{
sb.Draw(private room fields here);
foreach(Block b in blocks)
b.Draw(gt, sb)
}
}
Then in the main game class
//fields section
List<Room> rooms;
// in the Draw
spriteBatch.Begin();
foreach(Room r in rooms)
r.Draw(gt, spriteBatch);
spriteBatch.End();
In this scenario, there is a single Begin/End block for the whole frame.