Мне нравится использовать объектно-ориентированный подход к решению подобных проблем.
Вы упомянули вам сетку плиток (ваш мир) для рисования. Я предполагаю, что вы также будете использовать это для столкновения, но это не упоминается, поэтому я проигнорирую это.
Вы также упоминаете, что вам нужен игрок (если хотите, Марио). Это должно занять позицию в вашем мире.
У меня было бы два класса. Один для вас, игрок, имеющий позицию в мире координаты (НЕ относительные координаты). Тогда у меня будет класс, описывающий тайлы мира (ваша карта тайлов). Затем вы можете нарисовать тайлы на основе их мировых координат, преобразованных какой-либо матрицей камеры (матрицей перевода, используемой для смещения обзора мира). Идея в том, чтобы переместить камеру , а не двигать мир. Вы можете нарисовать игрока с той же матрицей преобразования камеры.
Поскольку игрок понятия не имеет, что за ним наблюдает камера, камера должна знать, что ей делать. Поэтому камера должна «следить» за игроком. Вы могли бы дать камере координату «Target», и у камеры могли бы быть правила того, как следовать за игроком.
Затем камера может определить, нужно ли ей «прокручивать» быстрее или медленнее, чтобы не отставать от игрока. Камера должна быть в состоянии определить, нарисован ли игрок около края экрана, и сдвинуть его в сторону. Etc.
Надеюсь, это было полезно:)