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

marfi

Treue Seele

  • »marfi« ist der Autor dieses Themas

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

1

19.12.2012, 21:12

[WIP] Unit Maker

Heute möchte ich gerne ein Projekt von mir vorstellen. Bei
der Spieleentwicklung kommt es regelmäßig dazu, das man bewegte Grafiken
braucht. Diese Sprites (ja, 3D ist nicht so mein Ding) tauchen immer wieder
an verschiedenen Stellen auf ;)

Aus diesem Grund entwickle ich gerade ( .. schon ein bischen
Länger) einen Unit Maker. Mit diesem Tool kann man im Handumdrehen seine
Bildchen zu Einheiten, Objekten, Hindernissen oder sonstiges zusammenklicken.
Das schöne daran ist, das man das fertige Game Objekt danach exportieren kann
um es in seiner Anwendung frei zu nutzen.

Man braucht dazu nur eine DLL der man einen Zeiger auf
eine DirectX9 (später soll es aufwärts kompatibel werden) Objekt übergibt.

Zu beginn erstellt man einen Prototypen, dieser kann mehrere
Ebenen haben, sogenannte Layer und jeder Layer hat wieder beliebig viele
Animationspfade. Und jeder dieser Animationspfade besteht aus beliebig vielen
Bilder (Frames).

Aus diesen Animationspfaden können dann Events erstellt
werden. Zum auslösen eines Events (Ereignis) sendet man dem Game Objekt einfach
eine Nachricht.

Als besonderes Highlight kann man noch angeben wie viele
Bewegungsrichtungen das Game Objekt haben soll. Denn Unit Maker erstellt dazu
automatisch fertige Events für jede Richtung. Diese werden dann automatisch
aufgerufen, wenn man dem Game Objekt ein neues Ziel gibt. Dadurch drehen sich
die Objekte in Bewegungsrichtung und laufen oder fahren dorthin. (Bewegt oder
auf der Stelle).

Die Animationsgeschwindigkeit sowie die Bewegungsgeschwindigkeit
können variiert werden.

Zusätzlich kann noch der Dreh und Angelpunkt des Objekts
festgelegt werden (Pivot) dadurch kann das Objekt punktgenau platziert werden.

Eine automatische BoundingBox Optimierung ist ebenso
enthalten.

Beim exportieren wird auch eine GameObjektProc (*.h + *.cpp)
erstellt dies ist die Zentrale der Nachrichten die dem Objekt gesendet werden
können.
»marfi« hat folgendes Bild angehängt:
  • Screenshot_UM.png

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

19.12.2012, 22:22

Als WAS wird denn überhaupt exportiert? Zeig doch mal Ergebnis-Code, damit man sich das überhaupt vorstellen kann, was das Ding genau macht.
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]

marfi

Treue Seele

  • »marfi« ist der Autor dieses Themas

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

3

20.12.2012, 21:55

Also, exportiert wird ein eigenes Dateiformat. (*.UMO). Diese Datei kann von dem UnitMaker core verarbeitet werden. Diese Dll braucht nur einen Zeiger auf ein D3DDevice. Das rendern wird intern gemacht. Die Renderfunktion muss dann nur zwischen beginn und end render in die main render Funktion gepackt werden. So ist es jedenfalls im Moment. Die functionProc wird als reine Textdatei gespeichert. Wie ich schon geschrieben habe als *.h +*.cpp.

So sieht die FunctionProc z.B. aus die die Nachrichten verarbeitet.

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
79
80
81
82
83
84
85
86
87
int UnitProc(int nUnit,int nLayer, UINT uMsg, UINT wParam, UINT lParam)
{
    
    GetState()->m_nUnitID  = nUnit;
    GetState()->m_nLayerID = nLayer;
    SEasyRect rc = GetApp()->CallUMDevice()->GetBoundingBox(nUnit);

    GetState()->m_rcBoundary.set(rc.x0, rc.x1,rc.y0,rc.y1);
    
    int x,y;
    switch(uMsg) {
    case UM_TARGET_POSITION:
        x = (int)wParam;
        y = (int)lParam;
        GetApp()->CallUMDevice()->SetTargetPosition(nUnit,CVector3D(x,y,200));
        GetApp()->CallUMDevice()->SetVisible(nUnit,true);
        break;
    case UM_REACHED_TARGET:
        switch(wParam) {
    case NORTH:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_NORTH");
        break;
    case NORTH_NORTHEAST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_NORTHEAST");
        break;
    case NORTH_NORTHWEST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_NORTHWEST");
        break;
    case SOUTH:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_SOUTH");
        break;
    case SOUTH_SOUTHEAST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_SOUTHEAST");
        break;
    case SOUTH_SOUTHWEST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_SOUTHWEST");
        break;
    case WEST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_WEST");
        break;
    case EAST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"STOP_EAST");
        break;
    default:
        break;

        }
        break;
    case UM_PATH_FOUND:
        break;
    case UM_ALIGNED:
        switch(wParam) {
    case NORTH:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_NORTH");
        break;
    case NORTH_NORTHEAST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_NORTHEAST");
        break;
    case NORTH_NORTHWEST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_NORTHWEST");
        break;
    case SOUTH:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_SOUTH");
        break;
    case SOUTH_SOUTHEAST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_SOUTHEAST");
        break;
    case SOUTH_SOUTHWEST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_SOUTHWEST");
        break;
    case WEST:
        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_WEST");
        break;
    case EAST:

        GetApp()->CallUMDevice()->SetCurrentEvent(nUnit,GetState()->m_nLayerID,"DIRECTION_EAST");
        break;
    default:

        break;
        }
        break;
    default:
        break;
    }
    return TRUE;
}


Hier läd man ein Object und erstellt eine Instanz vom Prototype:

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
    // 1. first load prototype
    bResult = CallUMDevice()->LoadPrototype(m_nPrototype[0],"/media/resources/Baum.umo",BaumProc);

    if(!bResult)
    {
        bResult = CallUMDevice()->LoadPrototype(m_nPrototype[0],"../media/resources/Baum.umo",BaumProc);
    }

    if(bResult)
    {
        // 2. create an instance
        if(CallUMDevice()->GetInstanceOf(m_nUnit[0],m_nPrototype[0]))
        {
            // 3. set current position
            CallUMDevice()->SetCurrentPosition(m_nUnit[0],CVector3D(500,500,0));
            // get bound box
            SEasyRect rc = CallUMDevice()->GetBoundingBox(m_nUnit[0]);
            // 3.5 set current pivot (this case bottom/right)
            CallUMDevice()->SetCurrentPivot(m_nUnit[0],CVector3D(rc.x1,rc.y1,0));
            // 4. set current event, send message
            CallUMDevice()->SendMessage(m_nUnit[0],nLayerID,UM_REACHED_TARGET,SHOW,0);
                
        }
    }
    else
        LOG(LOG_COLOR_DK_RED, " LoadPrototype() Baum.umo - failed");


In der Main Renderfunktion dann nur noch alle Objekte rendern

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//////////////////////////////////////////////////////////////////////////
    //  Render units
    //////////////////////////////////////////////////////////////////////////
    // 5. one test unit must set to visible, because UmDev set visible to false after render
    CallUMDevice()->SetVisible(m_nUnit[0],true);

    GetGameApp()->CallUMDevice()->OnRenderDevice(-1,fTime,fElapsedTime,NULL,pMatrixView);
    


Und so bewegt sich das Objekt voll animiert zum Ziel 500,500

C-/C++-Quelltext

1
GetApp()->CallUMDevice()->SendMessage(nUnitID,nLayerID,UM_TARGET_POSITION,500,500);


Die einzelnen Codeausschnitte passen nicht ganz zusammen, der Baum kann nämlich nicht laufen :)

Aber wenn es soweit ist werde ich mal eine kleine Beispiel App zeigen.

Außerdem suche ich Anfang nächsten Jahres ein paar Beta-Tester für das Tool.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

21.12.2012, 09:48

Ah ja, oh kay.
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]

marfi

Treue Seele

  • »marfi« ist der Autor dieses Themas

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

5

27.12.2012, 15:38

Habe den Kernel jetzt etwas überarbeitet. Außerdem habe ich die Fehlerabfrage stark erweitert. Die Optimierung der Boundingbox funktioniert jetzt einwandfrei und kann auf verschiedene Ebenen angewendet werden. Die Schatten eines Objektes werden nun auch berücksichtigt, so das eine Schatten nicht zwangsläufig in der BB liegt.
Auf dem Screenshot seht ihr was ich meine. Der rote Kringel ist die Position des Objektes.(Kann mit dem Pivot genau auf den Stamm gesetzt werden).


Jetzt überarbeite ich noch die Export Funktion und versuche in ein paar Tagen die erste beta zu releasen.
»marfi« hat folgendes Bild angehängt:
  • screenshot271212.png

marfi

Treue Seele

  • »marfi« ist der Autor dieses Themas

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

6

17.02.2013, 21:57

So, jetzt habe ich endliche die erste Betaversion online. Unitmaker 0.9.5.0 beta könnt ihr euch auf meiner Homepage runterladen und testen.
Es wäre schön, wenn sich ein paar Beta-Tester finden, die auch ein feedback auf meiner Homepage abgeben.

Zur Zeit geht es nur um den Unitmaker, das Modul zur Einindung in C++ Projekten ist noch nicht ganz fertig.

Das Programm: http://www.sudmix.de/pages/download.php

Und hier bitte ein feedback abgeben: http://www.sudmix.de/pages/projekte-wip/…er/feedback.php

Einfach installieren und testen. Ein Quickstart ist auch als pdf vorhanden. So wie ein Beispielprojekt.

marfi

Treue Seele

  • »marfi« ist der Autor dieses Themas

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

7

25.02.2013, 21:08

Neue betaversion

In der ersten beta Version hatten sich noch einige Fehler versteckt. Gerade habe ich ein update hochgeladen.

http://www.sudmix.de/pages/download.php

Für alle interessierten Beta-Tester steht der download ab sofort bereit.

Gebt bitte auch weiterhin feedbacks. Danke!

EDIT: Gebt eure feedbacks bitte weiterhin hier ab: http://www.sudmix.de/pages/projekte-wip/…er/feedback.php

Ihr habt auch die Möglichkeit euch bei meinem newsletter anzumelden, falls ihr auf dem laufenden bleiben wollt.

Hat jemand noch Verbesserungs- oder Erweiterungsvorschläge?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »marfi« (26.02.2013, 19:13)


marfi

Treue Seele

  • »marfi« ist der Autor dieses Themas

Beiträge: 100

Wohnort: Schwerte

  • Private Nachricht senden

8

16.07.2013, 15:10

Beispiel Projekt!

Endlich habe ich es geschafft, ein Beispiel Projekt online zu stellen.

Jetzt könnt ihr das UmDev Modul testen und die mit UniMaker erstellten Objekte in eigene Projekte einbinden.

Es befindet sich alles noch im beta Status.

Projektvorstellung:
http://www.sudmix.de/pages/projekte-wip/unit-maker.php

Downloadbereich:
http://www.sudmix.de/pages/download.php

Über ein kleines feedback würde ich mich freuen:
http://www.sudmix.de/pages/projekte-wip/…er/feedback.php

Schöne Grüße
Marfi

Werbeanzeige