Ashley for C#: IronAshley

Ashley ist ein kleines Entity Component System für Java, welches ich bereits in folgendem Artikel vorgestellt habe: Ashley. Nun habe ich Ashley zu C# portiert, wodurch man es mit jeder Sprache des NET Frameworks nutzen kann.

Getting started

Der Quellcode von IronAshley ist auf gitlab gehosted: source
Die vorkompilierte DLL kann man sich hier downloaden: IronAshley.dll
Da IronAshley sich im Kern nicht von Ashley unterscheidet, kann man sich erst einmal daran orientieren: Ashley und How to use Ashley

Unterschiede zu Ashley

Da C# teilweise eine etwas andere Design Philosophie als Java hat, habe ich den Code von Ashley nicht nur portiert, sondern auch etwas weiter angepasst.

Namensgebung

In Java verwendet man für gewöhnlich camelCase, während man in C# PascalCase verwendet. Dementsprechend habe ich die Methodennamen angepasst. Außerdem ist man es in C# gewöhnt, dass Interfaces mit einem I beginnen, daher habe ich die einzelnen Interfaces von Ashley umbenannt. Zu guter letzt verwendet man in Java Methoden wie length() oder size() um die Länge einer Auflistung zu erhalten. In C# benutzt dafür lieber eine get Property namens Count.

Generics

Ein weiterer Unterschied ist bei den generischen Typen zu finden. In Java wird man häufig folgendes benutzen:

public <T extends Component> T getComponent (Class<T> componentClass) {
  // ...
}
// ...
PositionComponent pos = getComponent(PositionComponent.class);

In C# würde man eher den folgenden Weg gehen:

public T GetComponent<T>() where T : IComponent {
  // ...
}
// ...
PositionComponent pos = GetComponent<PositionComponent>();

IronAshley nutzt wenn möglich letzteres, wobei auch ein Java ähnlicher Ansatz unterstützt wird.

Externe Klassen

Ashley benutzt teilweise Klassen des LibGDX Frameworks. Einige dieser Klassen habe ich zu C# portiert, während ich andere durch Standard NET-Klassen ersetzt habe.
Die folgende Übersicht zeigt welche Klassen betroffen sind:

Ashley IronAshley
Array List
ImmutableArray ReadOnlyCollection
LongMap Dictionary
ObjectMap Dictionary
SnapshotArray (Kombination von Arrays und Listen)
Bag portiert
Bits portiert
Pool portiert
ReflectionPool portiert