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

08.12.2013, 21:22

Quilly2D

Quilly2D – Simple Java 2D-Engine
von Quillraven


Releases
Noch nicht vorhanden
GitHub Projektlink



Was ist Quilly2D?

Quilly2D ist der Name einer simplen Java 2D-Engine, die es Benutzern ermöglichen soll, möglichst einfach 2D-Anwendungen(Spiele) zu erstellen. Die Engine unterstützt dabei vor allem bei Folgendem:
  • Erstellung der Anwendungsoberfläche (Fenster, Bilder pro Sekunde, Tripple Buffering, …)
  • Darstellung und Animierung von Grafiken (Sprites, Text, Ebenenunterstützung)
  • Wiedergabe von Ton
  • Verarbeitung von Tastatur- und Mausevents
  • Erstellung von eigenen Spieleentitäten (Kollision, Updatemechanismus, …)
  • Kamera für Sichtfeld und Bewegungen
  • Szenenerstellungen (Karteneditor: noch nicht fertiggestellt)

Quilly2D ist weiters ein Open Source Projekt an dem sich gerne jeder beteiligen darf. Änderungen bzw. Erweiterungen werden von mir jedoch vorher überprüft und erst dann in eine „offizielle“ Version übernommen.


Welche Technologien verwendet Quilly2D?

Quilly2D basiert auf Java1.7 und greift dabei auf folgende Bibliotheken zurück:
  • Swing (JFrame, ImageIcon)
  • JavaFX für Tonwiedergabe (JFXPanel, MediaPlayer)
  • AWT (Canvas, Mouse- /Keyevents)

Anwendungsbeispiele

Nachdem man das entsprechende quilly2d.jar in sein Projekt eingebunden hat, kann man alle Features der Engine verwenden.
Das Kernstück einer jeden Anwendung stellt dabei die Klasse Q2DApplication dar.
Ein einfaches Beispiel zeigt der folgende Code.
In der „onInit“ Methode sollten dabei die ganzen Initialisierungsschritte der Anwendung geschehen. Die Werte für keyCode und mouseButton können dabei der Klasse AWT.event.KeyEvent und AWT.event.MouseEvent entnommen werden.

Java-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
public class Q2DWindowTest extends Q2DApplication
{

    public Q2DWindowTest()
    {
        super(  "Fenster Test",     // window title 
                800,                // window width
                600,                // window height
                false,              // fullscreen?
                60,                 // frames per second
                true);              // trippleBuffering?
        this.setWindowIcon("graphics/icons/window.png");
    }

    @Override
    public void onInit()
    {       
    }

    @Override
    public void onKeyPressed(int keyCode)
    {       
    }

    @Override
    public void onKeyReleased(int keyCode)
    {       
    }

    @Override
    public void onMousePressed(int mouseButton, int mouseX, int mouseY)
    {       
    }

    @Override
    public void onMouseReleased(int mouseButton, int mouseX, int mouseY)
    {       
    }

    public static void main(String[] args)
    {
        new Q2DWindowTest();
    }
}


Eine weitere nützliche Klasse der Engine ist die Q2DTimer Klasse. Mit ihr kann Code in einem gewissen Intervall, mit einer gewissen Verzögerung und einer gewissen Dauer ausgeführt werden.
Folgendes Codebeispiel zeigt die Klasse im Einsatz. Dabei wird ein Ton (Q2DSound) nach einer Sekunde nach Anwendungsstart abgespielt (startDelay = 1.0), nach einer weiteren Sekunde noch einmal abgespielt (periodicTime=1.0) und dabei auch beendet (duration=3.0).

Java-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
79
80
81
82
83
84
85
86
87
88
public class Q2DTimerTest extends Q2DApplication
{
    public Q2DTimerTest()
    {
        super("Timer Test",     // window title 
                640,            // window width
                480,            // window height
                true,           // fullscreen?
                60,             // frames per second
                true);          // trippleBuffering?
        this.setWindowIcon("graphics/icons/window.png");
    }

    @Override
    public void onInit()
    {
        Q2DTimer timer = this.createTimer(  1.0,                // start delay time in seconds
                                            1.0,                // timer periodic time in seconds
                                            3.0,                // timer duration in seconds
                                            TestTimer.class);   // timer type to be created
        Q2DSound sndFX = this.createSound("sounds/fire_cast.mp3");
        ((TestTimer)timer).setSndFX(sndFX);
    }

    @Override
    public void onKeyPressed(int keyCode)
    {
    }

    @Override
    public void onKeyReleased(int keyCode)
    {
        if( KeyEvent.VK_ESCAPE == keyCode )
            this.stopGame();
    }

    @Override
    public void onMousePressed(int mouseButton, int mouseX, int mouseY)
    {
    }

    @Override
    public void onMouseReleased(int mouseButton, int mouseX, int mouseY)
    {
    }

    public static void main(String[] args)
    {
        new Q2DTimerTest();
    }

    public static class TestTimer extends Q2DTimer
    {
        private Q2DSound    sndFX   = null;

        public TestTimer(double delayTime, double periodicTime, double endTime)
        {
            super(delayTime, periodicTime, endTime);
        }

        @Override
        public void onTick()
        {
            sndFX.setVolumne(0.5);
            sndFX.setLoop(false);
            sndFX.play();
        }

        @Override
        public void onFinish()
        {
            sndFX.setVolumne(0.5);
            sndFX.setLoop(false);
            sndFX.play();
        }

        public Q2DSound getSndFX()
        {
            return sndFX;
        }

        public void setSndFX(Q2DSound sndFX)
        {
            this.sndFX = sndFX;
        }

    }
}


Geplante Features

  • Karteneditor zur Szenenerstellung
  • Einfacher Triggereditor für den Karteneditor
  • Pixelgenaue Kollision
  • Erweiterungen für die Spriteklasse (Farbton setzen, Alphakanal setzen)



Beispielvideos






Demo

Wird noch überarbeitet
Q2DDemo.jar

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Draculark« (26.12.2013, 10:18)


2

08.12.2013, 21:33

Hey,

das sieht doch ziemlich gut aus (auch die Secret of Mana-Grafiken). Was genau hast Du denn noch vor? Das konnte ich hier nicht herauslesen, aber es sieht ja vielversprechend aus. Du könntest das Projekt auch auf GitHub hosten (wenn es sowieso open source ist) und vielleicht beteiligen sich ja dann auch ein paar daran - ich hätte zumindest Lust da mal reinzuschauen (ja, ich weiß, Du hast den Code hier auch geposted).

Hast Du eigentlich auch ein Spiel in Aussicht oder entwickelst Du die Engine nur, weil Du sie selbst einmal basteln wolltest (was Du ja erwähnt hattest)?

3

08.12.2013, 22:07

Geplant war das Ganze für ein kleines RPG von mir, das ich damals in C++ einmal für die Konsole geschrieben hatte. Da ich mittlerweile aber nicht mehr allzu oft mit C++ zu tun hatte und arbeitsbedingt eigentlich nur mehr mit Java unterwegs bin, wollte ich das Spiel in Java schreiben.
Ebenso wollte ich mir das neue JavaFX anschauen, was recht vielversprechend für so etwas aussah imo, aber hatte mich dann doch für die Swinggrundlage entschieden, weil ich mich da von Unizeiten damals noch mehr auskannte und nicht wirklich Zeit hatte mich in JavaFX einzuarbeiten.

Geplant hätte ich noch Folgendes:
  • Map Editor
  • Simple Triggerunterstützung (stelle es mir ähnlich wie beim RPG Maker z.B., dass man bei Mapbetretung irgendetwas ausführen kann, NPCs als "Events" platzieren kann und da entsprechenden Customcode ausführen kann, etc..)
  • Szenenuntersützung und Szenenübergänge. Eine Szene wäre für mich jetzt z.B. eine Map aus dem Editor, d.h. die ganzen Sprites/GameEntities der Map. Wenn man dann von einer Map zur anderen wechselt, ändert sich die Szene und dafür hätte ich gerne Übergangseffekte (z.B. Fadeout/Fadein). Weiß aber nicht, was Java in der Hinsicht da zulässt, also muss ich da noch schauen, ob das möglich ist.
  • Sprite Klasse ausbauen um Alphachannel setzen zu können, Farben zu ändern und pixelgenaue Kollision zu erlauben

Wenn das dann alles soweit stehen würde, wäre ich persönlich sehr zufrieden und könnte das dann als Grundlage für meine 2D-Spieleideen benutzen :)

Ich wollte GitHub früher oder später auch einrichten für das Projekt, aber bin sehr untalentiert, was "Konfigurationsgeschichten" anbelangt und wollte da bisher noch nicht meine Zeit opfern um mich damit herumschlagen zu müssen. Aber irgendwann muss ich natürlich die "Localhistory" Unterstützung von Eclipse und Dropbow ablösen, weil sonst wird es etwas schwierig die Übersicht der einzelnen Versionen gewisser Klassen zu behalten^^

4

11.12.2013, 20:03

Hab den Eröffnungspost überarbeitet. Weitere Codesnippets folgen die Tage noch.

Kann man den Threadtitel bitte umbenennen auf "Quilly2D - Java Engine für 2D-Anwendungen"?

Und gibt es irgendeinen <bb> code um den Quellcode ein-/ausklappbar zu machen? Ich finde,dass das sonst ein wenig unübersichtlich wird.

5

21.12.2013, 13:23

Habe jetzt mit dem Editor angefangen. Ist noch nicht sonderlich weit, aber man sieht schon den groben Aufbau der Arbeitsoberfläche.

Hatte mir überlegt, die ganzen "Attribute" wie Name, Größe, etc. in einen "Erstellungsdialog" zu packen, aber irgendwie find ich es so angenehmer.
Rechts werden noch Buttons ergänzt um auf die einzelnen Ebenen Zugriff zu bekommen und um Kollisionstiles zu setzen.

Integrierung von animierten Tiles ist ebenfalls schon durchgeplant (das wird aber zwingend über einen Extradialog erfolgen, in dem man die FPS, Anzahl Reihen/Spalten, usw. definiert).

Die Q2DEngine wird es dann ermöglichen, diese Maps direkt in der Anwendung zu laden.

Auch hier kann ich keinen Releasetermin nennen. Ist je nach Lust und Laune :)


MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

6

21.12.2013, 13:28

Schön das man schon Fortschritte erkennen kann, aber wozu muss man in einem Level-Editor die Hintergrundmusik festlegen? Solche Werte werden doch wo anders hinterlegt und nicht in der Layout-Datei...

7

21.12.2013, 15:50

ich habe ehrlich gesagt keine ahnung, wie das normal gehandhabt wird.

ich dachte nur, dass z.b. bei snes RPGs eine Karte immer eine Hintergrundmusik besitzt und deshalb kann man hier eben auch die Hintergrundmusik der Karte festlegen.

und es ist ja auch nicht nur ein reiner mapeditor (auch wenn es momentan noch danach aussieht). Später soll man darüber ja auch simple trigger erstellen können :)

8

22.12.2013, 11:51



Habe jetzt eine simple "Pinselfunktion" eingebaut. Das Previewbild rechts macht momentan noch wenig Sinn, weil man die Selektion auch links sieht, aber das ist für später geplant, wenn man sich den Pinsel selbst befüllen kann um eine Art "Template" zu erstellen.

edit: habe den github link jetzt in den anfangspost reineditiert.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Draculark« (22.12.2013, 13:58)


9

22.12.2013, 14:23

Darf ich dich fragen, warum du den üblichen Weg über tilesets gehst?
Ich fand das bei den RPG Makern XXX eigentlich immer recht umständlich. Gut, der XP hat ermöglicht, das man beliebig große Tilesets nutzen konnte, aber dann muss man sich doch erst die Mühe machen und die Sets erst zusammen kopieren.
Würde mich mal interessieren, warum du das trotzdem machst ;)

10

25.12.2013, 15:20

Der Grund dafür ist, dass ich das nur so kenne :D
Mein Spieleprogrammierwissen basiert auf Büchern, die ich vor grob 6-7 Jahren einmal gelesen habe. Da wurden unter anderem "tile based maps" vorgestellt und ich fand die von der Theorie her sehr einfach und passend.

Was würde es denn als Alternativen geben?
Vielleicht meinst du aber auch etwas anderes und das folgende Video beantwortet die Fragen:

Bin mit dem Editor soweit schon sehr zufrieden. Muss jetzt aber einmal etwas Refactoring betreiben, weil ich das Ganze etwas "stressig" programmiert habe und da noch einmal drüberschauen möchte.
Im Video sieht man:
  • Multi tileset Unterstützung
  • Pencil Funktion
  • "Pencil Template" Funktion (Sieht man, wenn ich den "Advanced" Knopf drücke)
  • Multi layer Support

Was noch fehlt
  • Laden von animierten Tiles
  • Kollisionsebenenerstellung
  • Löschfunktion
  • Speichern/Laden
  • Testapplikation starten zum "Probetesten" der Map mit der Q2DEngine
  • Mapvorschau auf Ebene beschränken (momentan sieht man immer alle Ebenen)

Feedback ist wie immer gerne erwünscht :)



Werbeanzeige