Du hast nicht gesagt womit du entwickelst. Daher kann man nur "sowas" sagen:
1. Du legst dir ein paar Klassen zurecht die du für die Ausgabe/Eingabe usw. brauchst (z.B. eine Shader Klasse, eine für Matrizen...).
2. Man baut auf 1 auf und entwickelt sich Klassen mit denen man einfach(er) Dinge Beeinflussen (wie z.B. Positionieren oder Rotieren kann) kann. Dazu kommt dann auch sowas wie Kollisionserkennung (ein Beispiel wäre eine Sprite Klasse).
3. Man guckt welche Objekte es im Spiel gibt (Spielfigur, Gegner, Geschosse, ...) und schreibt diese auf Grundlage von 1 und 2. So kann man z.B. für ein Geschoss eine Klasse ableiten die von Sprite erbt und zusätzlich eine Geschwindigkeit hat.
4. Man führt alles zusammen. Dazu kann man z.B. Container verwenden oder auch eigene Resourcen Manager schreiben (um z.B. effektiver zu rendern oder für kompliziertere Kollisionserkennung).
Wo der main loop gesetzt wird spielt keine Rolle. Ich halte das im Moment so:
a. main() zum aufsetzen des Fensters sowie des render Kontextes.
b. eine "loop()" Funktion für den main loop.
c. in loop() werden dann verschiedene Funktionen aufgerufen, je nachdem was gebraucht wird (z.B. "render()", "logic()", ...).
Das meiste musst du selbst herausfinden. Das war bis jetzt mein Weg, grob gesagt. Aber niemand sagt das das optimal ist. Z. B. kann man auch alles in eine Klasse packen, also main loop und Co.
Viel Spaß beim Programmieren!