Лучший подход для «игры» проблематичен - PullRequest
0 голосов
/ 21 февраля 2012

Я должен сказать вам, что я совершенно НОВИНКА для XNA и ничего не знаю о вершине, мультисэмплинге и т. Д. И т. Д.

Тем не менее, я так люблю программирование и Windows Phone, что хотел начать грандиозную задачу ... создать игру XNA! : D

хорошо, давайте прекратим историю и начнем объяснять ..

Я делаю большую игру ... которую я проработал почти 1 месяц, теперь она почти закончена ..

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

так что у нас есть 2 трудных момента, 1) ПОНИМАЙТЕ, ЧЕМУ Я НАЖИМАЛ 2) ЦВЕТ ЭТОЙ ЧАСТИ

Я думал о 2 подходах

ПЕРВЫЙ ПОДХОД

  • 1 PNG, большой фон головоломки 1024x800

  • N PNG для каждой части головоломки, с прозрачным слоем вокруг части (каждая часть 1024x800, в правильном положении)

, объединив N + 1 PNGS, мы получили полную загадку, теперь ДЕЙСТВИТЕЛЬНО легко понять, какую часть я нажал, потому что мне просто нужно циклически обработать N текстур, и когда я получил ту, у которой нет прозрачной пиксель в точке нажал, у меня есть кусок! затем, для раскраски, я просто раскрасил текстуру в части прорисовки.

это просто, проблема в том, что если мне нужно перетащить, увеличить, 50 * 4 pngs, это действительно медленно: (

ВТОРОЙ ПОДХОД

  • 1 PNG большая головоломка 1024x800 со всеми объединенными частями, КАЖДАЯ часть будет иметь разную цветовую заливку, например, 1) 250 250 250 2) 245 245 245 и т. Д.

  • После загрузки PNG я вычисляю индексы пикселей, используя GetData для каждого куска и сохраняю его в массиве для каждого куска

для того, чтобы получить выбранный кусок, это просто ... Я просто вычисляю y * width + x и получаю кусок с этим значением в массиве.

проблема в том, что когда мне нужно раскрасить ... я должен перебрать массив и изменить RGB, а затем, наконец, сделать SetData ... требуется 1 секунда для окрашивания этого фрагмента ... это МОЖЕТ быть приемлемым ... но Я хочу лучше ...

второй подход намного ОЧЕНЬ НАМНОГО быстрее при перетаскивании и масштабировании, потому что это всего 1 PNG, и я могу использовать большее разрешение благодаря этому, намного лучшему подходу

есть предложения ??

Спасибо

Luca

1 Ответ

2 голосов
/ 21 февраля 2012

Итак, у вас есть головоломка 1024x800, где каждый пиксель является частью?Вам не нужно создавать 819200 файлов изображений или определять 819200 индивидуальных поведений для каждого пикселя.

Вам необходимо (ну, должно ) использовать для этого объектно-ориентированные концепции.Вот основная идея пути, который, я думаю, вы должны выбрать:

  1. Определите класс "Piece".Эта фигура представляет игровую фигуру.

  2. В классе фигуры определите прямоугольник, представляющий эту фигуру на доске.Если ваша фигура имеет неправильную форму (например, S tetronimo и т. Д.), Определите несколько прямоугольников.Если у вас есть несколько разных типов фигур (и разных форм), вы захотите использовать наследование и сделать так, чтобы каждый другой тип элементов наследовал от класса Piece, но определял свои собственные прямоугольники.Однако, если ваши «кусочки» - это просто пиксели на экране, просто нарисуйте прямоугольник 1x1.

  3. Заполните прямоугольники цветом, используя SpriteBatch.Вы можете использовать один белый пиксель png и растянуть его, чтобы заполнить прямоугольник (-ы), а также указать цвет.

  4. Используйте прямоугольники, чтобы проверять ваши куски прикосновением.Если касание попадает в ваш прямоугольник, вы выбрали этот кусок.Если ваши фигуры имеют размер всего 1 пиксель, это еще проще: просто найдите фигуру по значениям X и Y позиции касания.

  5. Теперь для игрового поля: в зависимости от формы иВозможные положения фигур, вам нужно будет выбрать способ их хранения.Если все ваши фигуры были квадратными, вы могли бы хранить их в 2D-массиве.В противном случае вы можете использовать карту, где ключ - это позиция фигуры, а значение - сама фигура.

Основная сводка этого подхода: не пытайтесь хранить свою доску вединственная текстура.Запись / чтение данных текстуры происходит медленно, а текстуры не выступают в качестве структур данных.Вместо этого храните свои части как отдельные объекты.Перебирайте каждую часть и рисуйте ее на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...