Nie ma tego dużo, więc powinieneś sobie poradzić sam, największym wyzwaniem dla ciebie będzie moim zdaniem ogarnięcie SFML w C#, jest nawet zrobiony oficjalny binding do c# (https://www.sfml-dev.org/download/sfml.net/) aczkolwiek nie jest to najnowsza wersja.
Na twoim miejscu zaczął bym od tego właśnie, pobranie SFML i spięcie tego z c#, jeżeli będziesz w stanie odpalić okno gry to potem pójdzie już z górki. Możesz nawet spróbować mniej więcej zrobić copy-paste kodu który już masz, zobaczyć czy działa, naprawić błędy i na koniec refaktorować aby dopasować nazwy klas, zmiennych, funkcji itp do konwencji C#.
Btw. Mała podpowiedź do kodu c++, w funkcji CBlue::update() zamiast pisać całego drzewka ifów może zrobić coś takiego
const MovingData& MoveData = SpriteMoving[choise];
sprite.move(MoveData.Direction);
sprite.setRotation(MoveData.Rotation);
gdzie wypełnienie SpriteMoving byłoby wykonywane tylko raz, np w konstruktorze
struct MovingData
{
sf::Vector2f Direction;
float Rotation;
MovingData(){}
MovingData(float InX, float InY, float InRotation )
: Direction(InX, InY)
, Rotation(InRotation)
{}
};
std::map<SIDE, MovingData> SpriteMoving;
SpriteMoving.emplace(SIDE::W, MovingData(-velocity, 0.f, 0.f) );
SpriteMoving.emplace(SIDE::E, MovingData(velocity, 0.f, 180.f) );
SpriteMoving.emplace(SIDE::N, MovingData(0.f, -velocity, 90.f) );
SpriteMoving.emplace(SIDE::S, MovingData(0.f, -velocity, 270.f) );
SpriteMoving.emplace(SIDE::SW, MovingData(-velocity, velocity, 315.f) );
SpriteMoving.emplace(SIDE::NW, MovingData(-velocity, -velocity, 45.f) );
SpriteMoving.emplace(SIDE::NE, MovingData(velocity, -velocity, 135.f) );
SpriteMoving.emplace(SIDE::SE, MovingData(velocity, velocity, 225.f) );
możesz pójść jeszcze dalej i zrobić tą mapę jako pole statyczne, wtedy przy uzupełnianiu mapy każde velocity zamienisz na 1.0f
SpriteMoving.emplace(SIDE::W, MovingData(-1.f, 0.f, 0.f) );
SpriteMoving.emplace(SIDE::E, MovingData(1.f, 0.f, 180.f) );
SpriteMoving.emplace(SIDE::N, MovingData(0.f, -1.f, 90.f) );
SpriteMoving.emplace(SIDE::S, MovingData(0.f, -1.f, 270.f) );
SpriteMoving.emplace(SIDE::SW, MovingData(-1.f, 1.f, 315.f) );
SpriteMoving.emplace(SIDE::NW, MovingData(-1.f, -1.f, 45.f) );
SpriteMoving.emplace(SIDE::NE, MovingData(1.f, -1.f, 135.f) );
SpriteMoving.emplace(SIDE::SE, MovingData(1.f, 1.f, 225.f) );
i poruszanie robisz tak:
const MovingData& MoveData = SpriteMoving[choise];
sprite.move(MoveData.Direction * velocity);
a rotacja zostaje bez zmiany.