A parte de física é complicada no começo mesmo.
Se vc quer realmente ir sem lib (como raylib por exemplo), experimenta olhar como colisões são implementadas em engines open source (como gdevelop e godot) e vc vai ver que não é tanta mágica.
Vc vai perceber que é comum criar um bounding box
ao redor dos elementos, então não só é armazenado o X e Y, mas também o tamanho e altura pra ter o X2 e Y2, pra que sempre que outro objeto passe pra dentro desse bounding box, significa que houve colisão.
Claro, considerando que o bounding box é de um objeto quadrado, se for redondo aí eu já não vou saber dizer muito, embora seja utilizado bounding box também.