Po pierwsze, pozwól mi przeprosić za zadanie pytania, które może wydawać się nieco niejasne (lub źle sformalizowane), ale brakuje mi doświadczenia, aby zadać coś bardziej konkretnego.C# Struktura obiektów w grze 2D
Buduję silnik do grania w gry 2D przygodowe (typ "ty-klik-na-obiekcie-i-coś-dzieje się") w C# i rozważam najlepszą jego strukturę. Jak możesz sobie wyobrazić, różne rzeczy mogą się zdarzyć, gdy wchodzisz w interakcję z obiektem: jeśli to drzwi, spodziewasz się wejść do innego pokoju, jeśli to jest osoba, spodziewasz się zacząć z nimi rozmawiać itd. Mój pomysł polega na osiągnięciu tego zachowania z delegatów, na przykład:
public abstract class GameObject {
public delegate void onAction();
public onAction Click;
}
public class Door : GameObject {
public Door() {
Click = new onAction(ChangeRoom);
}
private void ChangeRoom() {
//code to change room here
}
}
public class Person : GameObject {
public Person() {
Click = new onAction(StartTalking);
}
private void StartTalking() {
//code to display dialogue here
}
}
Uważam to rozwiązanie dość elegancki, bo jeśli chcę utworzyć specjalny obiekt z jakiegoś zachowania nie objętej swojej klasie, I może po prostu to zrobić:
specialObject.Click += new onAction(SpecialMethod);
Ale tu także sprawy się komplikują. Chcę, aby mój silnik mógł odtwarzać różne gry, ładując różne dane, bez zmian w samym silniku, więc zakodowanie SpecialMethod gdzieś w silniku nie jest opcją, musi być częścią danych. W przypadku normalnego obiektu można to zrobić z serializacją (de), ale z tego, co przeczytałem, jest to problematyczne dla delegatów. Czy możesz zaproponować sposób na zrobienie tego?
PS: Ponieważ wciąż jestem na poziomie koncepcji, a powyższy kod nie został jeszcze wdrożony, możesz zaproponować najlepsze rozwiązanie, nawet takie, które całkowicie eliminuje delegatów.
Wygląda na to, że opisujesz silnik reguł http://martinfowler.com/bliki/RulesEngine.html – Jodrell
Myślę, że możesz opublikować to pytanie pod adresem http://gamedev.stackexchange.com/ – Luca
Dziękuję @luca for połączenie. Na pewno to sprawdzę, choć na pierwszy rzut oka wydaje się, że to forum jest nieco bardziej profesjonalne niż ja. –