Joshs Antwort ist großartig, aber ich möchte hinzufügen:
Eine der coolsten Funktionen von Entity / Component ist die datengesteuerte Art und Weise, wie jedes "Ding" in Ihrem Spiel erstellt und verwaltet wird. Nach dem, was ich gesehen habe, können Sie, sobald Sie eine schöne Bibliothek mit Komponententypen und -systemen erstellt haben, mit minimalen Codemodifikationen so gut wie alles erstellen. (Hinweis: minimal! = 0 )
Indem Sie Ihr Spiel in Bezug auf das Verhalten definieren und sich die Möglichkeit geben, diese Verhaltensweisen im laufenden Betrieb zu ändern - zur Laufzeit, während der Initialisierung, indem Sie sie aus einem Skript oder einer Datenbank usw. laden -, eröffnen Sie eine ganze Welt neuer Möglichkeiten. Möchten Sie sehen, warum Ihre Schatten nicht dort landen, wo Sie es erwarten würden? Fügen Sie Ihrem Licht eine Kamera / POV-Komponente hinzu.
Mit Entity / Component können Sie alles erstellen, was Sie möchten, solange Sie die Blöcke erstellt haben.
Auch die Mehrfachvererbung verursacht das gleiche Problem wie die Einzelvererbung. Wenn Sie der Hierarchie ein Attribut oder Verhalten hinzufügen, wird es weitergegeben. Solange Sie tiefe Hierarchien erstellen, werden Sie auf Situationen stoßen, in denen Sie unnötiges Gewicht haben, Code duplizieren oder Konflikte lösen. Das meiste davon kann vermieden werden, wenn Sie sich Ihr Spiel als Daten vorstellen.
Ich habe gerade in den letzten Wochen angefangen, damit zu spielen, aber ich bin beeindruckt, wie einfach die Dinge geworden sind. Es ist keine Silberkugel - ich bin auf einige Fälle gestoßen, in denen das Anbringen eines Lambda an einer Komponente der sauberste und zweckmäßigste Weg war, um ein Problem zu lösen - aber es ist ein ziemlich gutes Muster, wenn man es so nennen kann.
Ein wenig verwandter Hinweis: Einer der großen, langweiligen Wartungsgeneratoren in datenzentrierten Anwendungen (Websites usw.) ordnet hierarchische Objekte relationalen Datenbanken zu. Wir haben viele raffinierte Lösungen, aber letztendlich sind es alle Hacks, die Hierarchien reduzieren sollen. Anstatt Ihr Modell so zu erstellen, dass es dem Zweck der Anwendung dient, müssen Sie einen Kompromiss zwischen einer effektiven Hierarchie und einer logischen relationalen Darstellung eingehen. Ich habe mit der Idee gespielt, eine ziemlich große Hierarchie in einer meiner Apps als Entitäts- / Komponentensystem neu aufzubauen - die Hierarchie aufzugeben und die Datenbank zum Goldstandard für den Rest der Implementierung zu machen - und sie ist vielversprechend.
Wenn Sie Funktionen wie dynamische Codegenerierung / Code-Caching integrieren, mit denen Leistungsprobleme behoben werden können, erhalten Sie eine schnelle, flexible und logische Architektur, die das wiederverwendbare Codeziel von OOP möglicherweise viel besser verwirklicht.