Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.08.2013, 02:42

[.NET] XGL - Open Source GameLibrary

Hey.
Nach gut 5 Monaten Arbeit fühlen wir uns mittlerweile bereit, unsere GameLibrary der Öffentlichkeit vorzustellen. XGL ist eine komponentenbasierte, stark abstrahierte GameLibrary mit dem Ziel, Spiele sehr einfach auf andere System portieren zu können. Rendering und Sound sind dabei momentan bereits abstrahiert und die XGL unterstützt alle gängigen Features für 2D Spiele.

Wer sind wir eigentlich?
Xemio Network ist eine momentan aus 3 Leuten bestehende Indiegame Gruppierung, die bereits seit etwa 4 Jahren besteht. Wir arbeiten momentan hauptsächlich an unserer Engine, planen aber in Zukunft einige kleinere Titel zu releasen.

Homepage: http://blog.xemio.net/
GitHub: https://github.com/XemioNetwork
Youtube: http://www.youtube.com/user/XemioDevelopment

Namespaces
Components
Der ComponentManager, das Herzstück der XGL, kann hinzugefügte Komponenten nach Interfaces auflösen. Interfaces, die mit dem AbstractComponent Attribut gekennzeichnet wurden, werden ebenfalls als aufzulösender Typ dem Komponentensystem hinzugefügt.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
[AbstractComponent]
public interface ITestComponent : IComponent
{
    void DoSomething();
}
public class MyTestComponent : ITestComponent
{
    public void DoSomething()
    {
        Console.WriteLine("Hallo Welt");
    }
}


C#-Quelltext

1
2
3
4
XGL.Components.Add(new MyTestComponent());

var testComponent1 = XGL.Components.Get<ITestComponent>();
var testComponent2 = XGL.Components.Get<MyTestComponent>(); //Selbe Instanz wie testComponent1


Content
Der ContentManager ist ähnlich nutzbar wie Microsofts XNA ContentManager. Mithilfe unserer Content.Load<T> Methode können Datentypen über das Serialisierungsframework aufgelöst und geladen werden. Der ContentManager berücksichtigt dabei das aktuelle IFileSystem, d.H. Daten müssen nicht zwangsläufig von der Festplatte kommen.

C#-Quelltext

1
ITexture texture = this.Content.Load<ITexture>("./Resources/sprite.png");


.FileSystem
Die XGL bietet unterschiedliche Dateisystemabstraktionen, unter anderem für virtuelle Dateisysteme, die ihren Content aus einer Datei laden können. Geplant sind außerdem IFileSystem Implementierungen für einen Zip-Ordner und via FTP.

.Serialization
Umfangreiches Serialisierungsframework, das über den ContentManager aufgelöst werden kann. Jeder Serializer ist einem Type zugeordnet. In diesem Namespace befinden sich Serializer für alle Basisdatentypen.

.Texts
Vereinfachte Serialisierung von Texten.

Entities
Komponentenbasiertes Entity-System. Der Entities Namespace bietet außerdem Zugriff auf DataContainer und EntityComponents, wobei DataContainer serialisierbare Daten einer Entity darstellen und EntityComponents die Logik einer Entity beschreiben. Alle DataContainer werden dabei automatisch serialisiert.

Events
Im Vergleich zur Vorgängerversion hat sich die Performance des Eventsystems um einiges verbessert. Im Zuge unserer Kollisionsimplementierung wurde auch das Eventsystem geupdated, da der alte EventManager zu langsam für die unzähligen Events des Kollisionssystems war.

C#-Quelltext

1
2
var eventManager = XGL.Components.Get<EventManager>();
eventManager.Publish(new TestEvent());


Game
.Scenes
GameScene Management. Das neue System unterstützt unter anderem hierarchische Verschachtelung von Szenen, Tick und Render Indizes.

.Timing
Der Timing Namespace stellt Klassen wie den GameLoop und eine GameTime Klasse bereit, die anders als in XNA für die Handhabung virtueller Tage bzw. Zeitsimulationen eines Spiels zuständig ist.

Input
Anders als in vielen anderen Gamelibraries handhaben wir Mauseingaben ebenfalls als Key, d.H. LeftMouse und RightMouse sind ebenfalls Mitglieder unseres Key Enums. Dabei bietet der InputManager Support für Mehrspielerinputs, die unter anderem über unsere Syncput Library auch über das Netzwerk kommen können und so einfach Multiplayer Games möglich machen. Der InputManager hält zusätzlich IInputListener Instanzen und unterstützt somit verschiedene Devices, eine externe GamePad Library bzw. Kinect Support wären damit problemlos machbar.

C#-Quelltext

1
2
3
4
5
6
InputManager inputManager = XGL.Components.Get<InputManager>();
PlayerInput playerInput = inputManager.LocalInput; //für weitere Inputs => inputManager[playerIndex]

if (playerInput.IsKeyPressed(Keys.Enter))
{
}


Localization
Namespace für mehrsprachige Anwendungen.

Math
Namespace für allgemeine mathematische- und Vektoroperationen.

.Collision
Die XGL unterstützt in der neuen Version lediglich ein CollisionGrid, das auf dem Spatial Hash Grid Prinzip basiert und selbst bei über 1000 Entities noch extrem performant läuft.

Network
Client und Server wurden mittlerweile abstrahiert, sodass unter anderem eigene Implementierungen möglich sind. Das Netzwerksystem ist paketbasiert, wobei Client und Server ihre eigene Logik über die IClientLogic und IServerLogic Schnittstellen implementieren können. Pakete werden automatisch serialisiert und es gibt im Kern der Library bereits einen Mechanismus zur Bestimmung der Latenz zwischen Clients und Server.

Zudem sind sämtliche Protokolle abstrahiert, d.H. um von TCP auf ein beliebiges anderes Protokoll umzusteigen wird lediglich eine Zeile Code benötigt, unter anderem bietet die XGL auch ein LocalProtocol, das für Singleplayerspiele mit Netzwerkcode genutzt werden kann.

Plugins
Der Plugins Namespace bietet umfangreiche Möglichkeiten zur Erweiterung der XGL. Unter anderem basiert die gesamte Library auf dem ImplementationManager, der Interfaces mit einer eindeutigen Id in eine Instanz auflösen kann. Sämtliche Abstrahierungen können ohne Probleme durch externe Libraries erweitert werden, mit ILibraryInitializern kann sich eine externe Library zusätzlich an unsere Event- und Komponentensysteme anmelden. Ein Beispiel dafür ist unser Script System: Alle durch das ICommand Interface abstrahierten Commands können sich auch in externen Libraries befinden.

C#-Quelltext

1
2
ImplementationManager implementations = XGL.Components.Get<ImplementationManager>();
ICommand command = implementations.Get<string, ICommand>("TestCommand"); //Wird auch aus externen Assemblies aufgelöst.


Rendering
Umfangreiche Abstrahierung unseres Rendering-Systems. Momentan gibt es einen GDI+ und XNA Renderer, die mit je einer Codezeile ausgetauscht werden können. Das Rendersystem unterstützt zudem Spritesheets, Animationen, Anti Aliasing, Geometrieoperationen und RenderTargets.

Script
Das Script-System basiert auf C# und bedient sich somit der gesamten Funktionsfähigkeit des .NET Frameworks. Das besondere daran ist, dass Commands die Scriptausführung unterbrechen und vom Tick des GameLoops abhängig machen. Gedacht ist diese Funktionalität zur stabilen Ausführung von Scripts, ohne das Spiel dabei für längere Zeit zu unterbrechen oder auf Multithreading zurückzugreifen.

Sound
Sound Abstrahierung.

Configuration
Die XGL lässt sich in der neuen Version zudem fluent konfigurieren:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MainForm mainForm = new MainForm();
mainForm.ClientSize = new Size(800, 600);

var config = XGL.Configure()
    .FrameRate(60)
    .BackBuffer(800, 600)
    .DefaultComponents()
    .DefaultInput()
    .Components(new MyComponent())
    .Graphics<GDIGraphicsInitializer>() //wahlweise XnaGraphicsInitializer
    .Scenes(new MainScene(), new DebugOverlay())
    .BuildConfiguration();
            
XGL.Run(mainForm, config);


NuGet Packages
Alle Libraries und Erweiterungen zur XGL gibt es auch als NuGet Paket.

Trello Project Management
Features, Vorschläge und geplante Änderungen dokumentieren und planen wir in unserem Trello Projekt. Sollte also jemand Lust haben, zu sehen, was wir für die XGL geplant haben, einfach reinschauen. Votes und Kommentare sind auch für Gäste aktiviert.

Xemio Syncput
Syncput ist eine von uns als Erweiterung für die XGL entwickelte Netzwerkbibliothek, die Inputsynchronisation aller teilnehmenden Spieler ermöglicht. Dabei können alle Spieler eine Lobby betreten, der Host das Spiel starten und ohne, dass der Entwickler seinen Code auf netzwerktauglichkeit ausgelegt hat läuft in allen Clients parallel die selbe Simulation ab. Das System ist primär auf Gameplay über LAN Netzwerke ausgelegt und für Internetspiele eher ungeeignet.


(Link)




Der Sourcecode für Syncput befindet sich in unserem Contrib Projekt.

Open Source
Der gesamte Sourcecode der XGL kann hier eingesehen werden. Bei Verwendung bitte auf unsere Lizenz achten. Alle Erweiterungen der XGL befinden sich ebenfalls im Contrib Projekt.

mint

Frischling

Beiträge: 23

Beruf: Softwareentwickler

  • Private Nachricht senden

2

15.08.2013, 07:21

Wenn der Code auf möglichst vielen Plattformen laufen soll, dann ist C# nicht die richtige Wahl. Ich habe mal ein Werbeblatt von Microsoft gesehen, da stand drauf: "Mit C# plattformunabhängig programmieren - Windows XP/Vista/7/8." Für Microsoft existiert kein Ubuntu, MacOS, Android oder iOS, deswegen kann man mit C# auch plattformunabhängig programmieren :D Die Laufzeitumgebungen werden unter Ubuntu GNU/Linux z.B. afaik zwar bereitgestellt, aber nur in der Grundversion. Es fehlen viele Erweiterungen.

Eine Bibliothek die die von euch genannten Features tatsächlich auf allen - auch mobilen - Plattformen unterstützt wäre z.B. https://www.allegro.cc/.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

15.08.2013, 07:49

Das stimmt nicht was du sagst. Schau dir doch mal Xamarin an ;) Meiner Meinung nach ist Mono schon eine Weile auf Stand von .NET 4, sogar die TPL soll schon gut funktionieren.

Was mich besonders interessiert: Ihr sprecht von einer Netzwerkbiliothek, die automatisch interpoliert. Extrapolieren kann sie aber nicht oder? Inwieweit ist das ganze konfigurierbar? Funktioniert das nur für eindimensionale interpolation oder auch zwei oder sogar dreidimensional?

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

4

15.08.2013, 07:53

Da Platformunabhaengigkeit eines euer USPs ist: Welche Platformen werden bisher unterstuetzt?

mint: Mono unterstuetzt C# 4.0 nach ECMA Standard und alle gaengigen Platformen. Es gibt auch z.B. CIL -> Javascript compiler womit man C# Code im Web zum laufen bringen kann. Damit kann man das Web, Android, iOS, MacOS, Linux und Windows abdecken.

mint

Frischling

Beiträge: 23

Beruf: Softwareentwickler

  • Private Nachricht senden

5

15.08.2013, 08:27

Ich habe vergessen zu erwähnen, dass das, was ich schreibe, nur meine persönliche Meinung ist (die sich im Laufe der Zeit auch ändern kann). Augenblicklich wäre also für mich die Verwendung von C# argumentativ zumindest ein Negativpunkt - das muss aber nicht für jeden gelten.

Das letzte Mal als ich überprüft habe was mit C# z.B. unter Ubuntu ist, da wurden C#-Anwendungen als Standardanwendungen fallengelassen und durch andere ersetzt, die nicht in C# geschrieben waren. Angeblich sollte Mono komplett aus Ubuntu entfernt werden, das waren aber tatsächlich nur Gerüchte. Nichtsdestotrotz werden C#-Anwendungen stiefmütterlich behandelt, weil man befürchtet, Microsoft wolle Softwarepatente anmelden: http://www.linuxuser.co.uk/features/mono…software-column

benjs

Frischling

Beiträge: 19

Beruf: Schüler

  • Private Nachricht senden

6

15.08.2013, 09:37

Welche Platformen werden bisher unterstuetzt?

Ich spreche zwar nicht für den Autor, aber wenn die Library auf dem .Net Framework 4.0 basiert, sollte das auf XP, Vista, Win7, Win8, Linux und MacOS laufen (für Mac/Linux siehe Mono - Compatibility) ^^

C# ist für mich aber auch eher ein Positivpunkt, weil man mit Visual Studio im Zusammenspiel mit C# + die .Net Standard Bibliotheken echt tolle Features geboten bekommt und man damit schnell zu seinem Ziel kommt.

MfG benjs

7

15.08.2013, 18:48

Welche Platformen werden bisher unterstuetzt?

Ich spreche zwar nicht für den Autor, aber wenn die Library auf dem .Net Framework 4.0 basiert, sollte das auf XP, Vista, Win7, Win8, Linux und MacOS laufen (für Mac/Linux siehe Mono - Compatibility) ^^


Das kann man speziell was Linux und Mac angeht leider nicht auf alle Libraries verallgemeinern, die .Net / C# verwenden. Knackpunkt sind die verwendeten Dependencies (die eventuell selbst nicht Mono-tauglich sind) sowie jegliche Aufrufe von Funktionen in Unmanaged Code, welcher via DllImport eingebunden wird. Mono an sich ist noch keine ultimative Lösung für Plattformunabhängigkeit. Ein bisschen Arbeit muss man schon reinstecken, damit das auch wirklich funktioniert.

Werbeanzeige