Autor Beitrag
Kasko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 126
Erhaltene Danke: 1

Win 10
C# C++ (VS 2017/19), (Java, PHP)
BeitragVerfasst: Do 19.07.18 22:30 
Hallo zusammen,

Bevor ich zur Frage komme erstmal ein paar Infos über die Struktur meines Programms:

Herzstück des Programms ist die Klasse Game.
ausblenden 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:
public class Game : GameLoop
{
    public static uint width = 1520;
    public static uint height = 855;

    public Game() : base(width, height, "Game", Color.Black) { }

    public override void LoadContent()
    {
        //
    }

    public override void Initialise()
    {
        //
    }

    public override void Update(GameTime gameTime)
    {
        //
    }

    public override void Render(GameTime gameTime)
    {
        //
    }
}

Die Klasse erbt von der abstrakten Klasse GameLoop in der sich die Hauptschleife, die 4 abstrakten Hauptmethoden (LoadContent, Initialise, Update, Render) und die EventHandler befinden.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public abstract class GameLoop
{
    ///

    public GameLoop(uint width, uint height, string title, Color clearColor)
    {
        //
    }

    public void Run()
    {
        //
    }

    public abstract void LoadContent();
    public abstract void Initialise();
    public abstract void Update(GameTime gameTime);
    public abstract void Render(GameTime gameTime);
}

Die Methode Run wird in der Main ausgeführt.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
class Program
{
    static void Main(string[] args)
    {
        Game game = new Game();
        game.Run();
    }
}

Momentan ist es so, dass wenn ich ein Element updaten und rendern möchte, ich dafür jede einzelne Methode die ich dafür erstelle manuell in die Game.Update bzw. Game.Render Methoden hineinschreiben muss. Vorgestellt habe ich mir aber ein System, bei der es eine abstrakte Basisklasse GameBehavior gibt, die ebenso wie GameLoop über die 4 Grundmethoden, sowie Informationen über Position, Rotation, Größe und andere Eigenschaften verfügt. Zu diesem Zeitpunkt, selbst mit dem System, müsste ich auch diese Methoden alle einzeln in die Game Methoden integrieren.

Es stellt sich mir also die Frage ob es eine Möglichkeit gibt, eine Methode in allen Klassen aufzurufen, die von GameBehavior erben. Zum Beispiel in der Game.Update werden alle GameBevavior.Update Methoden ausgeführt.

LG Kasko

P.S. Als Zusatz vielleicht noch die Möglichkeit die execution order zu ändern.
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Do 19.07.18 23:20 
Lies dich mal in Reflection ein, das tut genau das. Damit kannst Du in der Assembly alle Typen suchen, auf den Basis-Typ oder ein Interface filtern und von jedem eine Methode ausführen.
Allerdings ist Reflection häufig genau der falsche Weg und gleicht eher der berühmten Kanone gegenüber der Fliege als einer sinnvollen Lösung.

Mir ist nicht ganz klar, was Du damit bezwecken willst.
Für mich klingt das so, dass jedes Objekt, was z.B. Refreshed werden muss, auch irgendwann erzeugt wird. Diese erzeugende Instanz kann das Objekt doch sammeln und sich dann um die Methoden-Aufrufe kümmern.
Oder Du drehst den Spieß um, Du hast irgendwo ein RefreshRequired-Event, an dem sich alles registriert.
Oder, wenn deine Struktur z.B. einer View ähnelt (ein Objekt beinhaltet viele andere, die wiederum welche beinhalten, etc.), dann kümmert sich jedes Objekt im Refresh darum, dass die intern verwalteten Objekte ebenfalls refreshed werden und so weiter.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 21.07.18 08:52 
Ich stimme dem auch zu.
Benutze z.B. eine List<GameBehavior>, bei sich die einzelnen Elemente eintragen (lassen) und iteriere dann innerhalb der Game-Methoden darüber.

Zu deinem PS: Die "execution order" könntest du über eine Eigenschaft Priorität regeln, nach der dann die Liste sortiert wird.