Du mußt über einen Vektor arbeiten. Momentan arbeitest du mit einem skalaren Wert, der die Richtung angibt. Ein Vektor beinhaltet Informationen über die Richtung und die Geschwindigkeit.
An sich kannnst du den Vektor aus zwei Richtungsangaben zusammensetzen. Beispielsweise bedeutet der Vektor (1, 1), daß du eine Einheit nach oben und eine nach rechts gehst; (-2, 5) würde bedeuten, daß du zwei Einheiten nach links und fünf nach oben gehst.

Was die Sache mit den Kommawerten angeht: Wenn du pixelgenaue Bewegungen unterstützt könntest du einfach auf den nächsten Pixel runden (entweder gleich bei der Bewegung oder später bei der Anzeige*). Wenn du nur tileweise Bewegungen zuläßt solltest du erst mal generell auf ganze Tiles runden.


* Ob es Sinn macht, intern mit sub-Pixel-Einheiten zu arbeiten, mußt du selbst entscheiden. Ein Spiel, das sowas macht (warum auch immer), wäre Super Metroid, wo die Position auf 1/65535 Pixel genau verarbeitet wird.