\documentclass[tikz,border=30pt]{standalone}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usepackage{tikz-uml}
\usepackage[french]{babel}

\begin{document}
\begin{tikzpicture}
    \umlclass{Manager}{
        window : fenêtre\\
        clock : horloge\\
        elapsed\_time : flottant\\
        resource\_manager : \texttt{ResourceManager}\\
        keys : \texttt{[booléen]}\\
        view : \texttt{View}
    }{
        start() : vide\\
        getWindow() : fenêtre\\
        getElapsedTime() : flottant\\
        getResourceManager() : \texttt{ResourceManager}\\
        isKeyPressed(key : touche) : booléen
    }

    \umlabstract[x=-4,y=-4.5]{View}{
        manager : \texttt{Manager}
    }{
        \umlvirt{frame() : vide}
    }
    \umluniassoc{Manager}{View}

    \umlclass[x=4,y=-4.5]{ResourceManager}{
        textures : dictionnaire \texttt{string -> texture}
    }{
        getTexture(name : string) : texture
    }
    \umluniassoc{Manager}{ResourceManager}

    \umlabstract[x=-4,y=-8.5]{Level}{
        name : chaîne de caractères\\
        background : sprite\\
        objects : \texttt{[Object]}\\
        zone : \texttt{[[flottant, flottant]]}
    }{
        \umlvirt{frame() : vide}\\
        draw() : vide\\
        load(file : fichier en lecture) : vide\\
        save(file : fichier en écriture) : vide
    }
    \umlinherit{View}{Level}

    \umlclass[x=-7,y=-12.5]{Editor}{}{
        frame() : vide
    }
    \umlinherit{Level}{Editor}

    \umlclass[x=-1,y=-12.5]{Game}{}{
        frame() : vide\\
        update() : vide
    }
    \umlinherit{Level}{Game}

    \umlabstract[x=-4,y=-19]{Object}{
        acceleration : vecteur\\
        velocity : vecteur\\
        position : vecteur\\
        mass : flottant\\
        charge : flottant\\
        restitution : flottant\\
        static\_friction : flottant\\
        dynamic\_friction : flottant\\
        layer : entier
    }{
        \umlvirt{draw() : vide}\\
        \umlvirt{getForces(manager : \texttt{Manager}, objects : \texttt{[Object]}) : vecteur}\\
        \umlvirt{draw(manager : \texttt{Manager}) : vide}\\
        \umlvirt{getAABB() : boîte}\\
        \hfill\\
        updateVelocity(manager : \texttt{Manager}, objects : \texttt{[Object]}, delta : flottant) : vide\\
        updatePosition(manager : \texttt{Manager}, objects : \texttt{[Object]}, delta : flottant) : vide\\
        detectCollision(object : \texttt{Object}) : \texttt{CollisionData}\\
        solveCollision(object : \texttt{Object}, normal : vecteur) : vide\\
        positionalCorrection(object : \texttt{Object}, normal : vecteur, depth : flottant) : vide\\
    }
    \umlunicompo{Game}{Object}
    \umlunicompo{Editor}{Object}

    \umlclass[x=-8,y=-26]{Player}{
        player\_number : entier non-signé
    }{
        getForces(manager : \texttt{Manager}, objects : \texttt{[Object]}) : vecteur\\
        draw(manager : \texttt{Manager}) : vide\\
        getAABB() : boîte
    }
    \umlinherit{Object}{Player}

    \umlclass[y=-26]{Block}{}{
        draw(manager : \texttt{Manager}) : vide\\
        getAABB() : boîte
    }
    \umlinherit{Object}{Block}
\end{tikzpicture}
\end{document}
