2010-07-21 5 views
5

Как мой первый проект WPF, я пытаюсь создать приложение для игры в карточную игру, подобную Magic the Gathering. Мне непонятно, как выложить основную игровую площадку. Вы можете увидеть некоторые примеры, которые похожи на то, что я пытаюсь, посмотрев на example 1 или example 2. Областями чата/информации справа являются отдельные пользовательские элементы управления.WPF-макет для сложной карточной игры

Карты должны поддерживать свои пропорции, и каждая игровая зона будет начинаться с 10 колонок и двух рядов карт. При воспроизведении большего количества карт количество столбцов и/или строк может измениться. Каждая область игрока может иметь различное количество столбцов и/или строк. Карты могут перекрываться и могут быть помещены вбок (постукивались). Карты во всех областях должны быть одного размера (хотя они могут быть обрезаны в некоторых областях). Карты не обязательно должны лежать точно на сетке (они не обязательно привязываются к сетке).

Когда пользователь наводит мышь на карту, она должна расширяться до значительно большего размера с использованием анимации. Карточка в одной зоне игрока может переполняться в область другого игрока при ее расширении (но только до тех пор, пока мышь зависает).

Учитывая эти требования, у меня возникает соблазн использовать один большой пользовательский элемент управления, полученный из холста с объектами изображения для каждой карты (наряду с другими формами для определения областей). Это означает, что во время события OnRenderSizeChanged я буду выполнять большую работу, чтобы поместить дочерние элементы в холст (макет вручную).

Использование сетки не представляется возможным для меня из-за размещения свободной формы и перекрытия.

Разделение игровой зоны на более мелкие пользовательские элементы управления будет использовать возможности компоновки WPF, но похоже, что декомпозиция не позволит картам расширяться в соседние пользовательские элементы управления во время мыши, поэтому это тоже не представляется возможным.

Есть ли лучшая альтернатива одному большому контролю на холсте? Кажется неправильным делать макет вручную в WPF, но я не вижу альтернативы.

ответ

0

Я рекомендую вам взглянуть на this guys project. В java я знаю, но если бы я пошел по пути построения карточной игры. Это было бы то, что я бы ушел.

+0

Спасибо за ссылку, но кузница написана в java и больше ориентирована на получение AI для игры (гораздо сложнее). Моя цель - позволить двум людям играть через интернет-соединение. Существует аналогичный проект на основе WPF (http://moxdev.wordpress.com/), в котором появилась идея расширения карты. Он также использует холст (я считаю), но по-прежнему кажется неправильным злоупотреблять холстом таким образом. – Doug

0

Многие полотна внутри сетки могут помочь вам здесь, холст позволит отображать контент за пределами его границ, пока вы поворачиваете ClipToBounds на false, и вам будет предоставлен гораздо больший контроль над точным размещением карт, чем с другими схемами. Вы также получите мощные функции управления сеткой, позволяя вам добавлять и удалять столбцы и строки по мере необходимости (хотя вам также придется динамически добавлять и удалять холсты, хотя это не слишком сложно.

Если вы «беспокоится о том, что содержимое вашей« Карточки »перемещается, когда окно перемасштабировано, окружайте его в окне просмотра. Он будет управлять всем вашим масштабированием для вас и гарантирует, что ваша карта использует столько недвижимости, сколько может получить. может использовать RenderTransform, но многие из них могут замедлить работу вашей программы (эксперты: работает ли viewbox с использованием RenderTransforms? Если это так, то спорный вопрос)

Для обеспечения того, чтобы карты сохраняли свои пропорции, убедитесь, что атрибут Stretch каждого изображения установлен на «Униформа», что делает их все такой же размер можно было бы сделать, указав мастер-карту, а также связывая высоты и ширину всех последующих карт с этой оригинальной картой, хотя это немного грязно и не позволяет расширять карты. Другим решением является установка отдельного размера для каждой карты вручную, оживление, когда вы хотите расширить или уменьшить.

+0

Если он использует RenderTransform, контент может отображаться вне его границ, так или иначе, без необходимости устанавливать другие свойства. Кроме того, он должен, вероятно, использовать ItemsControls, а не динамические холсты, так как тогда он мог бы использовать механизм привязки и привязываться к коллекциям, а не постоянно обновлять и создавать новые холсты в коде. – Charlie

+0

Хорошая идея, но ему все равно нужно использовать холсты для точного размещения предметов, перевод их из фиксированных точек может быть слишком сложным. Хотя холсты могут быть созданы как часть ItemsTemplate для родительского элемента управления. –

2

Это звучит как отличный сценарий для Composite Application ala Prism.Он обеспечивает надежную структуру для реализации регионов, модулей, отправки сообщений между модулями и т. Д. ... От взгляда на ваши снимки экрана разработка оболочки с различными регионами и удаление модулей в них, вероятно, в значительной степени выиграют от вашего макета. Что касается самих карт, возможно, они также могут быть модулями?

Отъезд: http://msdn.microsoft.com/en-us/library/ff649780.aspx

Particualy хорошие примеры поставляются с пакетом загрузки, включая фондовый рынок, как приложения и агрегатор события. Например,

+0

Я не уверен, что карты будут очень эффективными, но кроме этого, Призма поможет много. –

+0

Я немного посмотрел на призму и признался, что немного потерял. Мне непонятно, как это поможет, поскольку координация размеров карт между регионами кажется сложной при изменении размера окна. Наличие карты переполняет ее область и накладывает другую область во время мышиного расширения, также кажется сложным. – Doug

+0

Это может быть полезно, но, вероятно, просто добавит излишнюю сложность в проблему. WPF способен обрабатывать все самостоятельно. – Charlie

2

Вы сказали:

Разбивая игровую зону в небольших пользовательских элементов управления будет использовать возможности компоновки WPF, но кажется, что разложение предотвратило бы карты от расширения в смежных пользовательских элементов управления во время наведении указателя мыши, так это тоже не представляется возможным.

Но это неверно. Декомпозиция - это абсолютно правильный подход, и это не помешает распространению карт в соседние пользовательские элементы управления. Причина в том, что вы можете использовать RenderTransform, а не LayoutTransform. См. this example, Чарльзом Петцольдом, или this article, чтобы визуализировать разницу. Поскольку RenderTransform применяется после того, как макет уже произошел, ваши карты смогут расширяться за пределами своих границ.

Учитывая, что разложение является правильным подходом, я собирал ваши различные коллекции карт в Grid, причем каждая коллекция была ItemsControl. ItemsControl должен связать свое свойство ItemsSource с какой-либо коллекцией, а затем вы можете предоставить пользовательский ItemTemplate, который отобразит изображение и любую другую информацию. Я бы не решался использовать Canvas, так как это ограничило бы жесткое кодирование позиций для карт (что очень похоже на решение WinForms для решения проблемы, которая может быть гораздо более элегантно решена). Воспользуйтесь фантастическим механизмом компоновки WPF и используйте элементы управления вложенными сетками и элементами для создания динамического макета. Это гарантирует, что ваша игровая панель отлично подходит для любого разрешения и растягивается до различных размеров.

+0

Благодарим вас за полезную информацию. RenderTransform должен решить проблему переполнения карты. Однако еще одна проблема с разложением заключается в том, что карты одинаковы для всех детей. В качестве примера рассмотрим родительский контроль контейнера и два дочерних элемента управления (по одному для карт каждого игрока). Когда изменяется внешнее окно, мне нужно рассчитать размеры новых карт, исходя из того, какая из дочерних областей имеет наибольшее количество карт. Есть ли какое-нибудь событие, которое я могу зацепить в контейнере после того, как дети были расположены (и размером), чтобы я мог рассчитать размер карты и отправить ее детям? – Doug

+4

Вместо того, чтобы подключаться к событию, вы должны привязать размер карты (для всех карт) к единому согласованному свойству в вашей модели представлений. Затем, когда дочерняя область получает или теряет карту, вы пересчитываете это свойство размера, и все привязки обновляются автоматически. – Charlie

Смежные вопросы