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

30.04.2018, 16:33

Genesis Game Engine - OpenSource 2D Game Engine in Java

Genesis Game Engine
OpenSource 2D Game Engine in Java

Hallo Community, anbei möchte ich euch mein Projekt vorstellen. Durch mein Interesse am Programmieren und an jeglicher Art von Spielen habe ich begonnen eine 2D Game Engine zu Schreiben. Ich habe mich dabei bewusst für Java entschieden, nicht zuletzt wegen der Plattform Unabhängigkeit, denn Java ist laut dem Tiobe Index die am meist genutzten Sprache und eine recht einfach zu lernende Sprache, so dass ich mit dem Projekt möglichst viele User erreichen kann. Sei es Entwickler die Linux nutzen oder mit dem Programmieren erst begonnen haben. Da das ganze ein Hobby Projekt ist, bin ich noch recht am Anfang der Entwicklung. Es existiert zwar bereits eine Version, jedoch ist diese sehr veraltet und hatte nicht so viele Features wie die an der ich Jetzt arbeite.

Aufbau der Engine

Die Engine ist sehr Simpel aufgebaut, wie man dem Diagramm sehen kann



Besitzt die Engine eine Zenralle "Game" Klasse, in diese unendlich viele Szenen Hinzugefügt werden können, in den Szenen befinden sich die Eigentlichen GameElemente. Die GameElemente enthalten die Informationen für das Rendern und die Spielmechanik. Das Spielverhalten eines GameElements kann über die so genannten GameBehaviors gesteuert werden, sei es z.b. die Kollisions, Gravitations oder AI Berechnung. Da die "Basis Klasse" alt Interface bereit gestellt wird, können ganz eigene Klassen erstellt und Hinzugefügt werden, dafür lassen wir einfach unsere eigene klasse von dem GameBehavior erben.





Light System

Jedes gutes Spiel verfügt über eine Ambiente Beleuchtung um dem Spiel an Charm zu verlein und einen WoW Effekt bei dem Spieler zu erzeugen, an diesem Punkt wird gerade gearbeitet. Derzeit lassen sich den einzelnen Szenen eine beliebige anzahl von Lightmaps hinzufügen, diese werden entweder Statisch (das heißt zu beginn des Spieles) oder Dynamisch (Echtzeit) gerendert, somit können wir z.b. dem Spiel Charakter mit einer "Taschenlampe" ausstatten, welche Dynamisch gerendert wird, die Beleuchtung der Map z.b. bei einer Straßenlampe aber Statisch was Ressourcen spart und mehr Performance bietet. Ein kleines Beispiel aus der GUI die Paralell zu der Engine entwickelt wird.



Wie auch bei dem GameBehavior kann von der ILight Klasse geerbt werden und daraus dann eigene Individuelle Beleuchtungseffekte erzeugt werden.



Das Userinterface

Ein Ebenso wichtiger Punkt eines guten Spieles ist die einfache und gut Designte Benutzeroberfläche, ein gutes User Interface zu gestalten ist oftmals eine menge arbeit und nimmt einiges an Zeit in Anspruch, auch hier bietet die Engine einiges an Möglichkeiten. Jedem game kann eine beliebige anzahl von Canvases hinzugefügt werden. Auf dieses so genannte Canvas werden dann die Einzelnen UIElemente oder auch Controls genannt hinzugefügt. Auch von dieser Klasse kann geerbt werden, so das das erstellen eigener Controls ermöglicht wird. Dezeit befinden sich in der Engine:

  • Label
  • Button
  • Progressbar
  • Picturebox
  • GridView

weitere werden natürlich noch folgen. Die verfügen über ActionListener, so dass man ein Event beim Klicken auf den Button z.b. ausführen kann, wie etwa das ändern eines Textes etc.



Anbei noch ein Beispielcode, in der das userinterface auf dem Screenshot erstellt wird.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public void start() throws IOException
    {
        // 1. Create JFrame
        JFrame frame = new JFrame();
        frame.setTitle("UI Sample");
        frame.setSize(800, 600);
        
        // 2. Create Game
        Game game = new Game(this);
        
        // 3. Create Scene
        Scene MyScene = new Genesis.Scene("MyScene", new Vector2(800,600));
        game.AddScene(MyScene);
        game.LoadScene(0);
        
        // 4. Create a Canvas
        Canvas MySampleUI = new Canvas(new Vector2(0,0), new Vector2(800,600));
        
        
        // 5. Create your Controls
        label = new Label("Mein Label", "Mouse Position");
        label.setLocation(new Vector2(20,20));
        label.setSize(new Vector2(200, 30));
        MySampleUI.AddElement(label);
        MySampleUI.AddUIActionListener(new CanvasActionListener(label));
        
        Label MyButtonLabel = new Label("MyButtonLabel", "Nothing has happened yet!");
        MyButtonLabel.setLocation(new Vector2(20, 50));
        MyButtonLabel.setSize(new Vector2(200,30));
        MySampleUI.AddElement(MyButtonLabel);
        
        Button btn = new Button("MeinButton", "Button1");
        btn.setLocation(new Vector2(20, 150));
        btn.setSize(new Vector2(200, 35));
        btn.AddUIActionListener(new ButtonActionListener(MyButtonLabel));
        MySampleUI.AddElement(btn);
        
        Progressbar bar = new Progressbar();
        bar.setLocation(new Vector2(20, 80));
        bar.setSize(new Vector2(200, 20));
        bar.setCurrent(60);
        bar.setSpace(1);
        bar.setIncrementValue(10);
        MySampleUI.AddElement(bar);
        
        Button MyProgressbarBtn = new Button("MeinProgressbarBtn", "Increase");
        MyProgressbarBtn.setLocation(new Vector2(230, 80));
        MyProgressbarBtn.setSize(new Vector2(60, 20));
        MyProgressbarBtn.AddUIActionListener(new ProgressbarUpdater(bar));
        MySampleUI.AddElement(MyProgressbarBtn);
        
        Button MyProgressbarBtn2 = new Button("MeinProgressbarBtn2", "Decrease");
        MyProgressbarBtn2.setLocation(new Vector2(292, 80));
        MyProgressbarBtn2.setSize(new Vector2(60, 20));
        MyProgressbarBtn2.AddUIActionListener(new ProgressbarDecrease(bar));
        MySampleUI.AddElement(MyProgressbarBtn2);
        
        PictureBox picB = new PictureBox(new Vector2(20, 190), new Vector2(300, 300), ImageIO.read(this.getClass().getResource("images/Human.png")));
        MySampleUI.AddElement(picB);
                
        GridView grid = new GridView("Grid", new Vector2(370, 20), 8, 4, 48, 48);
        grid.AddUIActionListener(new ListViewActionListener());
        grid.AddItem(new GridViewItem("MyGridItem", "GridViewItem", ImageIO.read(this.getClass().getResource("images/Sprite.png"))));
        grid.AddItem(new GridViewItem("MyGridItem", "GridViewItem", ImageIO.read(this.getClass().getResource("images/Sprite.png"))));
        grid.AddItem(new GridViewItem("MyGridItem", "GridViewItem", ImageIO.read(this.getClass().getResource("images/Sprite.png"))));
        grid.AddItem(new GridViewItem("MyGridItem", "GridViewItem", ImageIO.read(this.getClass().getResource("images/Sprite.png"))));
        MySampleUI.AddElement(grid);
        
        game.AddCanvas(MySampleUI);
        
        // X. Add the game to the frame and set is visible
        frame.add(game);
        frame.setVisible(true);
        
        // X. The Loop
        game.TheLoop();

    }



Wo finde ich die Engine

Derzeit ist die Engine noch nicht veröffentlicht worden, eine erste Version wird denke ich erst gegen ende Mai veröffentlicht werden. Allternativ findet man die Engine auf IndieDB


(Link)


Über weitere Updates und Entwicklungsfortschritte werde ich natürlich hier im Forum weiterhin berichten. Dennoch bitte ich euch zu Bedenken das es sich um ein Hobby Projekt handelt, jedoch ist geplant damit nach Release ein Spiel auf Steam zu veröffentlichen :)

Ich freue mich über euer Feedback.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Ahead Studios« (30.04.2018, 16:40)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

01.05.2018, 08:07

"Make games, not engines"

Die Kommentare im Beispielcode halte ich für äußerst sinnfrei, ehrlich gesagt. Typischerweise findet man solche Kommentare eigentlich nur in Anfänger-Code.

Bei "LoadScene" hätte ich erwartet, dass man den Namen übergibt und keine Index-Nummer. "TheLoop" müsste "doTheLoop" heißen oder etwas ähnliches. Verb zuerst und Camel-Case. Genauso auch bei den ganzen "Add*"-Methoden, sowieso den Variablen "MySampleUI" (richtiger wäre wohl "canvas"), "MyScene", "MyButtonLabel", etc. Persönlich würde ich sagen, dass du dich da in etwas verrennst, was ein Anfänger nicht tun sollte. Bau ein Spiel. Wenn dabei am Ende eine flexible Engine mit raus fallen sollte, die sich wiederverwenden lässt, toll. Wenn nicht, hat keiner was davon.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (01.05.2018, 08:16)


3

01.05.2018, 10:39

Hallo danke für dein Feedback, ich habe bereits paar kleinere Spiele mit Java gemacht und Programmiere bereits seid 2010, würde also nicht sagen das ich ein Anfänger bin. Ich habe die Code comments, da ich damit ein "Beispiel" bzw. Tutorial aufbauen möchte um den Nutzern zu zeigen, wie das Spiel Initialisiert werden soll. Werde aber die Punkte die du genannt hast gerne verbessern :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ahead Studios« (01.05.2018, 10:55)


4

01.05.2018, 15:28

Ich find's ja grundsätzlich keine schlechte Idee, sich mal selbst an einer Engine zu versuchen. Das gibt einem ein gutes Grundverständis für den Aufbau eines Spiels. Man sollte sich einfach bewusst sein, dass man nicht mal kurz ne neue Engine bauen kann, aber so zum Spaß und zum Lernen macht das durchaus Sinn.

Die Kritik bezüglich Kommentare verstehe ich nicht so ganz. Kann schon sinnvoll sein, einzelne Blöcke mit einer Überschrift zu versehen!
Ansonsten stimme ich zu: der Code muss möglichst aussagekräftig sein. Da spielt die Benennung von Methoden und Variablen eine entscheidende Rolle.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

01.05.2018, 21:02

Die Kritik bezüglich Kommentare verstehe ich nicht so ganz. Kann schon sinnvoll sein, einzelne Blöcke mit einer Überschrift zu versehen!
Aber doch nicht, wenn die Zeile darunter genau dasselbe nochmal erzählt. Dann ist das nur unnötiger Noise. Wo ist bitte der Mehrwert von sowas?

C-/C++-Quelltext

1
2
        // 2. Create Game
        Game game = new Game(this);
Das sind zwei Zeilen, die genau dasselbe sagen. Und so sehen alle Kommentare aus. Bitte sagt mir nicht, dass ihr so programmiert und eure Zeit mit solch überflüssigen Kommentaren vergeudet.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

01.05.2018, 21:43

Kommentare machen idR schon Sinn. Aber wie BlueCobold schon sagt, wenn das einzeilige Kommentar keine zusätzliche Info gibt, ist es ziemlich unnütz.
Java bietet aber - wenn ich mich recht erinnere - mit dem DocTool eine Möglichkeit das etwas effizienter zu gestalten: http://www.oracle.com/technetwork/java/j…dex-137868.html

(Müsste glaube ich das Pendant zu den XML-Comments für C++/C# aus Visual Studio darstellen)

7

02.05.2018, 11:47

Wie gesagt, ich habe die Überschriften im Code, da das ganze ein Tutorial bzw. beispiel Projekt werden soll, welches sich auch an Anfänger richten soll und wie BlueCobold schon geschrieben hat "Typischerweise findet man solche Kommentare eigentlich nur in Anfänger-Code.". Es soll einfach nur eine Hilfestellung für Anfänger sein, nicht für mich :) die Namenskonvention werde ich jedenfalls überarbeiten.

Werbeanzeige