Ich habe mir mal die aktuelle Version runtergeladen und muss sagen, dass ich das Gefühl habe, dass du total überfordert bist mit der Aufgabe. Was ich auch nicht verstehe ist, warum du nicht das machst, was man dir sagt. Wir versuchen dir zu helfen und geben Tipps oder weisen dich auf Sachen hin, die so nicht funktionieren oder anders gemacht werden sollten und du ignorierst das einfach. Wie soll man da helfen?
Es wurde mehrmals gesagt, dass du nicht die paint-Methode überlagern (überschreiben) sollst, sondern die paintComponent-Methode.
Die Klasse Keys implementiert ebenfalls noch immer nicht das Interface KeyListener und kann daher auch nicht als solcher verwendet werden => dein Spielfeld bewegt sich nicht. Keys kann auch von KeyAdapter erben, damit ist das Interface KeyListener automatisch implementiert.
In der Klasse MyFrame rufst du zwei mal die Methode add() auf und fügst zuerst ein Level- und dann ein Guy-Object hinzu. JFrame nutzt als default-Einstellung das BorderLayout. Das BorderLayout ist in fünf Bereiche eingeteilt, CENTER, NORTH, EAST, SOUTH und WEST. Die Arbeitsweise von BorderLayout ist die, dass es auch wirklich nur genau eine Komponente pro Feld speichert, also insgesamt genau 5. Ruft man add() nur mit der Komponente auf (also ohne die Himmelsrichtung anzugeben), wird die Komponente automatisch im CENTER-Feld gesetzt. Durch den zweiten Aufruf wird also ein Guy-Objekt gesetzt und das Level-Objekt ist verloren. Das muss also anders gehandhabt werden, das wird so nicht funktionieren. Aber sogar wenn du das änderst, wirst du nicht viel zu Gesicht bekommen (außer NullPointerExceptions, davon dürfte es wohl jede Menge geben ...), da nirgendwo auch nur ansatzweise was richtig initialisiert wird. Nehmen wir mal die Klasse Level, die ja eine zentralte Rolle spielt. Es werden nirgendwo die Felder initialisiert. Die Methoden dafür existieren zwar, aber werden nicht aufgerufen und somit wird es auch nix zu sehen geben.
Apropos Felder ... Was ein Array ist und wie man es benutzt scheinst du noch nicht so ganz raus zu haben, aber immerhin, du hast es versucht ^^
Java:
int[] ints = new int[25];
Dieses Beispiel erzeugt ein Array mit genau 25 Feldern. Der Zugriff auf die einzlenen Felder findet durch die Indezes 0 - 24 statt. In deinem Code hast du die Arrays mit nur 59 Feldern erzeugt (sollten wohl 60 sein) und greifst auf die Felder 0-59 zu. Das sind insgesamt 60 Felder, auf die du zugreifen willst, so groß ist das Array aber nicht und es wird eine ArrayIndexOutOfBoundsException geworfen.
Aber ich würde das mit den Arrays ohnehin noch etwas anders handhaben. Du hast ein 2D-Spielfeld. Da macht es doch Sinn auch ein 2-dimensionales Array zu verwenden. Bei einem Spielfeld von 8x8 Felder (insgesamt 64 Felder) würde das dann so aussehen:
Java:
int[][] ints = new int[8][8];
Der Zugriff auf die Felder ist analog zum 1-dimensionalen Array.