En primer lugar, permítanme pedir disculpas por hacer una pregunta que puede parecer un poco vaga (o mal formalizada), pero me falta experiencia para preguntar algo más específico.C# Estructura para objetos en un juego 2D
Estoy construyendo un motor para jugar juegos de aventuras en 2D (el tipo "haz clic en un objeto y pasa algo") en C# y estoy considerando la mejor estructura para ello. Como se puede imaginar, diferentes cosas pueden suceder cuando interactúa con un objeto: si es una puerta, espera ingresar a otra sala, si es una persona, espera comenzar a hablar con ella, etc. Mi idea es lograr este comportamiento con los delegados, como este:
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
}
}
me parece una solución muy elegante, porque si quiero crear un objeto especial con un comportamiento no cubierto por su clase, simplemente puede hacer esto:
specialObject.Click += new onAction(SpecialMethod);
Pero aquí también es donde las cosas se complican. Quiero que mi motor sea capaz de jugar diferentes juegos simplemente cargando diferentes datos, sin cambios en el motor, así que codificar el SpecialMethod en algún lugar dentro del motor no es una opción, debe ser parte de los datos. Para el objeto normal, todo se puede hacer con (de) serialización, pero por lo que he leído, esto es problemático para los delegados. ¿Puedes sugerir una forma de hacerlo?
P.S .: Como todavía estoy en el nivel de concepto y el código anterior aún no está implementado, puede sugerir cualquier solución que encuentre mejor, incluso una que evite por completo a los delegados.
Parece que está describiendo un motor de reglas http://martinfowler.com/bliki/RulesEngine.html – Jodrell
Creo que puede publicar esta pregunta en http://gamedev.stackexchange.com/ – Luca
Gracias @luca por el enlace. Seguramente lo verificará, aunque a primera vista, parece que este foro es un poco más profesional que yo. –