\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[x=6]{Engine}{
        clock : horloge\\
        state : \texttt{EngineState}
    }{
        update() : vide\\
        draw() : vide\\
        start() : vide\\
        addObject(objet : \texttt{Object}) : vide
    }

    \umlclass{EngineState}{
        objects : tableau d'\texttt{Object}\\
        keys : tableau de booléens\\
        delta : flottant
    }{}

    \umlabstract[y=-5.5]{Object}{
        acceleration : vecteur\\
        velocity : vecteur\\
        position : vecteur\\
        mass : flottant\\
        charge : flottant\\
        restitution : flottant\\
        layer : entier
    }{
        \umlvirt{draw() : vide}\\
        \umlvirt{getForces(état : \texttt{EngineState}) : vecteur}\\
        \umlvirt{update(état : \texttt{EngineState}) : vide}\\
        \umlvirt{getAABB() : boîte}\\
        \umlvirt{getCollisionInfo(balle : \texttt{Ball}) : vecteur, flottant}\\
        \umlvirt{getCollisionInfo(bloc : \texttt{Block}) : vecteur, flottant}\\
        collide(objet : \texttt{Object}) : vide
    }

    \umlclass[y=-11,x=4]{Ball}{}{
        getForces(état : \texttt{EngineState}) : vecteur\\
        draw() : vide\\
        getAABB() : boîte\\
        getCollisionInfo(balle : \texttt{Ball}) : vecteur, flottant\\
        getCollisionInfo(bloc : \texttt{Block}) : vecteur, flottant
    }

    \umlclass[y=-11,x=-4]{Block}{}{
        draw() : vide\\
        getAABB() : boîte\\
        getCollisionInfo(balle : \texttt{Ball}) : vecteur, flottant\\
        getCollisionInfo(bloc : \texttt{Block}) : vecteur, flottant
    }

    \umlunicompo{EngineState}{Object}
    \umluniassoc{Engine}{EngineState}
    \umlinherit{Object}{Block}
    \umlinherit{Object}{Ball}
\end{tikzpicture}
\end{document}
