2010-07-21 14 views
5

Como mi primer proyecto de WPF, estoy intentando crear una aplicación para jugar un juego de cartas similar al Magic the Gathering. No me queda claro cómo diseñar el área principal de juego. Puede ver algunos ejemplos que son similares a lo que estoy intentando al mirar example 1 o example 2. Las áreas de chat/información a la derecha serían controles de usuario separados.Disposición de WPF para el complejo juego de cartas

Las tarjetas deben mantener sus relaciones de aspecto, y cada área de juego comenzaría con 10 columnas y dos filas de tarjetas. A medida que se juegan más cartas, la cantidad de columnas y/o filas puede cambiar. Cada área de jugador puede tener un número diferente de columnas y/o filas. Las cartas pueden superponerse, y pueden colocarse de lado (golpeadas). Las tarjetas en todas las áreas deben tener el mismo tamaño (aunque pueden ser recortadas en algunas áreas). Las tarjetas no necesitan estar exactamente en la cuadrícula (no necesariamente se ajustan a la cuadrícula).

Cuando el usuario coloca el mouse sobre una tarjeta, debe expandirse a un tamaño significativamente mayor mediante una animación. Una carta en el área de un jugador puede desbordarse en el área del otro jugador cuando se expande (pero solo mientras el mouse se desplace).

Teniendo en cuenta estos requisitos, estoy tentado de utilizar un control de usuario grande derivado de Canvas con objetos de imagen para cada tarjeta (junto con otras formas para delinear las áreas). Esto implica que haré un montón de trabajo durante el evento OnRenderSizeChanged para colocar los elementos secundarios dentro del lienzo (diseño manual).

El uso de una cuadrícula no me parece posible, debido a la colocación y superposición de forma libre.

Descomponer el área de juego en controles de usuario más pequeños aprovecharía las capacidades de diseño de WPF, pero parece que la descomposición evitaría que las tarjetas se expandan en controles de usuario adyacentes durante el sobrevuelo, por lo que tampoco parece factible.

¿Existe una mejor alternativa a un gran control basado en lienzo? Parece incorrecto hacer un diseño manual en WPF, pero no veo una alternativa.

Respuesta

0

Te recomiendo que eches un vistazo a this guys project. En Java lo sé, pero si tuviera que seguir la ruta de construir un juego de cartas. Eso sería lo que me gustaría irme.

+0

Gracias por el enlace, pero forge está escrito en Java y está más centrado en conseguir una IA para jugar el juego (un problema mucho más difícil). Mi objetivo es permitir que dos personas jueguen a través de una conexión a Internet. Existe un proyecto similar basado en WPF (http://moxdev.wordpress.com/) de donde proviene la idea de expansión de la tarjeta. Él también está usando un lienzo (creo), pero todavía parece un poco incorrecto abusar de un lienzo de esa manera. – Doug

0

Una gran cantidad de lienzos dentro de una cuadrícula podrían ayudarlo aquí, el lienzo permitirá que el contenido se visualice fuera de sus límites, siempre que defina ClipToBounds como falso, y tendrá mucho más control sobre la ubicación exacta de las cartas que con otros esquemas. También obtendrá la poderosa funcionalidad de un control de cuadrícula, lo que le permite agregar y eliminar columnas y filas según sea necesario (aunque también deberá agregar y eliminar dinámicamente lienzos, aunque esto no es demasiado difícil.

Si Le preocupa que el contenido de su "Tarjeta" se mueva cuando se vuelve a escanear la caja, la rodea en una caja de vista. Manejará todas las escalas para usted y se asegurará de que su tarjeta use todos los bienes inmuebles que pueda obtener. podría usar RenderTransform, pero muchos de estos pueden ralentizar su programa (Expertos: ¿la viewbox opera usando RenderTransforms? Si es así, este punto es discutible)

Para asegurar que las tarjetas mantengan sus relaciones de aspecto, asegúrese de que cada atributo Image Stretch se establece en "Uniforme", haciendo que todos guarden Se puede hacer el mismo tamaño designando una carta maestra y anclas y anchos de enlace de todas las cartas posteriores a esta carta original, aunque eso es un poco desordenado y no permite que las cartas se expandan. Otra solución es establecer manualmente un tamaño individual para cada tarjeta, animándolo cuando desee expandirlo o reducirlo.

+0

Si usa un RenderTransform, el contenido se puede representar fuera de sus límites, de todos modos, sin necesidad de establecer otras propiedades. Además, probablemente debería utilizar ItemsControls en lugar de lienzos dinámicos, ya que podría utilizar el motor de enlace y enlazar a las colecciones en lugar de actualizar constantemente y crear nuevos lienzos en el código. – Charlie

+0

Buena idea, pero aún necesitaría utilizar lienzos para la colocación exacta de los artículos, traducirlos de puntos fijos podría ser demasiado complejo. Aunque los lienzos se podrían crear como parte de ItemsTemplate para un control principal. –

2

Esto suena como un gran escenario para la aplicación compuesta ala Prisma.Proporciona un marco sólido para la implementación de regiones, módulos, envío de mensajes entre módulos, etc. ... Al observar las capturas de pantalla, desarrollar un caparazón con diferentes regiones y colocar módulos en ellas probablemente beneficie en gran medida su diseño. En cuanto a las tarjetas en sí, ¿quizás también podrían ser módulos?

Salida: http://msdn.microsoft.com/en-us/library/ff649780.aspx

particualy buenos ejemplos vienen con el paquete de descarga que incluye un mercado de valores, como la aplicación y el agregador evento ejemplo.

+0

No estoy seguro de tener las tarjetas, ya que los módulos serían muy eficientes, pero aparte de eso, Prism sería de gran ayuda. –

+0

He mirado un poco al prisma y confieso que me he perdido un poco. No me queda claro cómo sería de ayuda, ya que coordinar los tamaños de las tarjetas entre las regiones parece complicado cuando se cambia el tamaño de la ventana. Tener una tarjeta desbordando su región y superponerse a otra región durante la expansión del mouse también parece complicado. – Doug

+0

Esto puede ser útil, pero probablemente solo agregue complejidad innecesaria a un problema que WPF puede manejar por sí solo. – Charlie

2

Dijiste:

Descomposición de la zona de juegos en los controles de usuario más pequeños sería aprovechar las capacidades de diseño de WPF, pero parece que la descomposición evitaría las tarjetas de expansión en los controles de usuario adyacentes durante el ratón por encima, por lo eso tampoco parece factible.

Pero esto no es correcto. La descomposición es absolutamente el enfoque correcto para tomar, y esto no evitaría que las tarjetas se expandan en controles de usuario adyacentes. La razón es que puede usar un RenderTransform en lugar de un LayoutTransform. Consulte this example, por Charles Petzold, o this article, para visualizar la diferencia. Debido a que se aplica un RenderTransform después de que el diseño ya haya ocurrido, sus tarjetas podrían expandirse fuera de sus límites.

Dado que la descomposición es el enfoque correcto, organizaría sus diversas colecciones de tarjetas en un Grid, con cada colección siendo ItemsControl. El ItemsControl debe vincular su propiedad ItemsSource a alguna colección, y luego puede proporcionar un ItemTemplate personalizado que muestre la imagen y cualquier otra información. No me atrevería a utilizar un Canvas, ya que esto restringiría la codificación de las posiciones de las tarjetas (que es una solución muy parecida a WinForms para un problema que puede resolverse de forma mucho más elegante). Aproveche el fantástico motor de diseño de WPF y use grillas anidadas y controles de elementos para crear un diseño dinámico. Esto asegurará que su tablero de juego se ve bien en cualquier resolución y cuando se estira en varios tamaños.

+0

Gracias por la útil información. RenderTransform debería resolver el problema de desbordamiento de la tarjeta. Otro problema con la descomposición, sin embargo, es mantener las cartas del mismo tamaño en todos los niños. Como ejemplo, considere un control de contenedor primario y dos controles secundarios (uno para las tarjetas de cada jugador). Cuando se redimensiona la ventana exterior, necesito calcular nuevos tamaños de tarjeta en función de la zona que tenga más tarjetas. ¿Hay algún evento que pueda enganchar en el contenedor después de que los niños hayan sido posicionados (y dimensionados) para poder calcular el tamaño de la tarjeta y enviarla a los niños? – Doug

+4

En lugar de engancharse en un evento, debe vincular el tamaño de la tarjeta (para todas las tarjetas) a una única propiedad consistente en su modelo de visualización. Luego, cuando un área para niños gana o pierde una tarjeta, vuelve a calcular esta propiedad de tamaño y todas las vinculaciones se actualizan automáticamente. – Charlie

Cuestiones relacionadas