Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2012, 15:10   #11
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Самое главное: не смешивайте данные с их отображением.
Начать рекомендую с реализации самой игры в шахматы без мыслей об отображении на экран. Думайте только об игре, её правилах и только это реализуйте. Отображение на экране - это отдельный разговор и оно не должно мешать проектированию самой игры.
Отлично, одной глобальной проблемой "меньше"))
нет, проблема вывода на экран, конечно, никуда не уходит, но да - так проще - думать только о процессе.


Цитата:
Сообщение от pu4koff Посмотреть сообщение
Для начала проще должно быть использование GDI без всяких анимаций и переносов фигур. По сути всё сведётся к выводу картинок с определенными координатами. Каждый ход тупо перерисовываем всю доску со всеми фигурами и не паримся.
а можно это сделать примерно так?
(описываю как это "примерно")

Допустим, нарисована доска. Вот именно, что она полностью нарисована, jpeg, пускай будет. Хотя нет, неверное не он, ну не суть. картинка.
На этой картинке есть типа наш "массив" 8х8 белых и чёрных, с боков буквы и цифры, это понятно. И есть нарисованные фигурки. 32 штуки. Они уже идут как бы... ну как отдельные картинки.

Так вот, допустим, я беру "пешку" и передвигаю её вперёд на 1 картинку - при этом, если я беру пешку, то она независима от доски - это как бы 2 разные картинки, которые наложились.
А клетки доски... они должны быть тем самым массивом, который я и буду задавать внутри. Вот типа сейчас. И я думала, (сейчас можно начинать смеяться), что эти клетки на jpeg-овой доске будут под каким-то точками, чтобы под точками был "массив". И вот когда фигурку перетаскиваешь на эту "точку", то там уже и идут все проверки и так далее. да пускай будет даже так, что ты нажимаешь на фигурку, а она уже "подсвечивает" возможные ходы, вообще. просто фигурка и доска - разные вещи - картинки, я вот о чём.

Я чувствую, что говорю какие-то фантастические вещи - если исходить из ситуации, что там несколько картинок, - такое возможно? Если да, то это как делать? ну хоть в общих чертах))))
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 15:47   #12
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Картинки просто накладываются друг на друга. Сначала есть пустой холст. Потом на него рисуется доска. Поверх доски уже рисуется фигура (точнее картинка с нужной фигурой). Картинки для простоты лучше взять BMP. Все картинки всех фигур для простоты должны соответствовать размеру ячейки доски. Фигуры нужно будет выводить с прозрачностью. Два основных метода:
1) "Прозрачные" места заполнить каким-нибудь заведомо ненужным цветом (пурпурный, салатовый, ...)
2) Создать еще одну монохромную картинку-маску.
Про это уже читать нужно литературу и смотреть как приятнее реализовывать будет.
Теперь про перемещение фигур.
Для начала я бы с этим не заморачивался и реализовывал ход так:
1) Левым щелчком выбираем фигуру и как-то это обозначаем для пользователя (рамочку там какую рисуем или подсвечиваем возможные ходы)
2) Еще одним щелчком указываем ячейку, куда нужно переместить фигуру или же выбираем другую фигуру.
Если же хочется именно мышкой таскать фигуру, тогда:
1) Рисуем доску со всеми фигурами, кроме перетаскиваемой и больше не трогаем.
2) Перетаскиваемую фигуру выносим как отдельное окно (не забываем, что в Windows кнопки и поля ввода - тоже окна) и перемещаем вслед за курсором мышки.
3) При отпускании мышки смотрим над какой ячейкой находится центр фигуры и туда её перемещаем (не окно перемещаем, не картинку, а фигуру в контексте игры).
4) Убиваем это перетаскиваемое окно
5) Перерисовываем доску и автоматом получаем новое расположение фигур (которое мы изменили на шаге 3).
pu4koff вне форума Ответить с цитированием
Старый 06.11.2012, 16:09   #13
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Картинки просто накладываются друг на друга. Сначала есть пустой холст. Потом на него рисуется доска. Поверх доски уже рисуется фигура (точнее картинка с нужной фигурой). Картинки для простоты лучше взять BMP. Все картинки всех фигур для простоты должны соответствовать размеру ячейки доски. Фигуры нужно будет выводить с прозрачностью. Два основных метода:
1) "Прозрачные" места заполнить каким-нибудь заведомо ненужным цветом (пурпурный, салатовый, ...)
2) Создать еще одну монохромную картинку-маску.
Про это уже читать нужно литературу и смотреть как приятнее реализовывать будет.
Ладно, допустим, всё нарисовали и так далее (слои и фигурки, фигурки и слови)... а как картинки связать с программой?)))
Вот тут пожалуйста расскажите мне)))

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Теперь про перемещение фигур.
Для начала я бы с этим не заморачивался и реализовывал ход так:
1) Левым щелчком выбираем фигуру и как-то это обозначаем для пользователя (рамочку там какую рисуем или подсвечиваем возможные ходы)
2) Еще одним щелчком указываем ячейку, куда нужно переместить фигуру или же выбираем другую фигуру.
определённо для начала пойдёт и этот вариант))))) даже не для начала, а возможно, он проще. Если вспомнить комп.программы по шахматам... там так и получатеся. Ладно, вот этот вариант буду реализовывать "где-то в начале".


ой pu4koff, спасибо вам огромное!))))
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 16:34   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Теперь про перемещение фигур.
я бы начал с "консольного" управления.
Есть поле ввода (банальный Edit), в шахматной нотации записываем ход (Фа4-е8) и ...

1. внутренний мир
2. отражение внутреннего мира на экран ("доска на экране")
3 Управление ходами
3.1. ручное управление ходами (командная строка).
3.2. управление мышкой (перетаскивание и прочее)
4. ИИ (выбор хода компьютером)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 06.11.2012 в 16:42.
evg_m вне форума Ответить с цитированием
Старый 06.11.2012, 17:03   #15
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

т.к. С++, значит будет ООП.
Связывание картинок с программой - интересная формулировка конечно, ну да ладно.

Т.к. будет использоваться С++, значит будут классы.
Классы проектируем исходя из игрового процесса, т.е. они не должны никак зависеть от реализации.
Допустим, мы нажали кнопку "Новая игра", это впоследствии может выглядеть так:
Код:
Игрок игрок1 = new Человек("Игрок1");
Игрок игрок2 = new Компьютер("SkyNet");
ТекущаяИгра = new Игра(игрок1, игрок2);
Совершение хода может быть таким:
Код:
// x, y - координаты курсора в окне игры
void НажатиеЛевойКнопкиМыши(int x, int y)
{
  int col = 0, row = 0; // координаты ячейки на доске (колонка и строка)
  ОпределитьЯчейку(x, y, &col, &row); // определяем в какую ячейку попали и в col и row получаем её координаты
  if (ВыделенаФигура()) // Если уже была выделена фигура, т.е. по идее должны сделать ход
  {
    // пытаемся переместить выделенную фигура в выбранную пользователем ячейку
    if (ТекущаяИгра->СделатьХод(ВыделеннаяФигура.col, ВыделеннаяФигура.row, col, row)) 
    { // Ход успешно совершен, т.е. всё было согласно правил
      ВыделеннаяФигура = NULL; // Убираем выделение фигуры
      ПерерисоватьДоску(); // Перерисовываем доску, чтобы пользователь увидел результат
    }
    else // Ход не был совершен
    {
      if (ТекущаяИгра->Доска[col][row] != Фигура.Пусто &&
          ФигураДанногоИгрока(col, row)) // Если в ячейке находится фигура игрока, чей ход, то выделяем её вместо уже выделенной
      {
         ВыделеннаяФигура = ТекущаяИгра->Доска[col][row]; // Выделяем другую фигуру
      }
      else ВыделеннаяФигура = NULL; // Просто убираем выделение
    }
Рисование доски
Код:
НарисоватьДоску(); // Рисуем только черно-белое поле, в общем, фон
НарисоватьВыделение(); // Рисуем рамочку выделенной фигуры/ячейки
// Рисуем фигуры
for (int col = 1; col < 9; ++col)
{
  for (int row = 1; row < 9; ++row)
  {
    if (ТекущаяИгра->Доска[col][row] == Фигура.Ферзь)
      НарисоватьФигуру("Ферзь.bmp", col, row); // Рисуем ферзя в нужной ячейке
    else if (ТекущаяИгра->Доска[col][row] == Фигура.Король)
      ...
  }
}
Вот как-то так в итоге всё это может выглядеть при первом приближении.

Последний раз редактировалось Beermonza; 07.11.2012 в 15:18. Причина: сообщение лучше ограничивать по ширине
pu4koff вне форума Ответить с цитированием
Старый 06.11.2012, 17:14   #16
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Супер)))

Ещё у меня есть вопрос про классы.
Вот смотрите. в С++ мы в самом начале подключаем библиотеки. можно создать свою библиотеку, где будут все эти классы и уже, скажем так, определённые переменные, которые чётко отвечают за что-то, ну, например, переменная ФЕРЗЬ - вот она отвечает за всё в целом, что "знает" ферзь (класс).

Или, мы классы должны описывать там же, где будет и всё тело?
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 17:22   #17
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Для начала не нужно заморачиваться и суйте всё в один проект, потом разберётесь и выделите по библиотекам или еще как разбросаете. В учебных проектах не нужно бежать впереди паровоза и строить наполеоновские планы. С большой долей вероятности будет ошибка по неопытности и паровоз уедет в другом направлении, а величие наполеона ограничится его ростом. Если этот проект не "заглохнет" и энтузазизм не угаснет, то он будет переписан "с нуля" раз несколько из-за постигнутого просветления
pu4koff вне форума Ответить с цитированием
Старый 06.11.2012, 17:45   #18
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Для начала не нужно заморачиваться и суйте всё в один проект, потом разберётесь и выделите по библиотекам или еще как разбросаете. В учебных проектах не нужно бежать впереди паровоза и строить наполеоновские планы. С большой долей вероятности будет ошибка по неопытности и паровоз уедет в другом направлении, а величие наполеона ограничится его ростом. Если этот проект не "заглохнет" и энтузазизм не угаснет, то он будет переписан "с нуля" раз несколько из-за постигнутого просветления
Золотые слова!)))
Нет-нет, всё верно)) Только это не совсем учебный проект, это всё очень и очень как серьёзно. Пока есть идея икс и горка энтузиазма - надо быстрее-быстрее учиться)))
*ну и вопросов много, хочется получать ответы))

Ещё раз, большое спасибо!

Через неделю-другую, когда я со всем этим разберусь и переварю, что-то попробую сделать, я выложу сюда код(ы). Обязательно заходите посмотреть на это "бредовое дело")))))
Буду рада))))
Fanyuus вне форума Ответить с цитированием
Старый 06.11.2012, 17:59   #19
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

классы потом без проблем вынесутся в библиотеку по мере необходимости, поэтому сейчас я бы не стал заморачиваться на эту тему.
По личному опыту могу сказать следующее:
1) Чем быстрее будет результат, тем лучше для энтузазизма. Не нужно пытаться довести всё до идеала и пусть будет некоторое количество корявых мест, важно, чтобы хоть что-то работало, а иначе энтузазизм угаснет
2) Временные "костыли" и "заплатки" имеют привычку становится постоянными, поэтому важно не переусердствовать с подпиткой энтузазизма быстрым результатом в ущерб качеству кода.
pu4koff вне форума Ответить с цитированием
Старый 09.11.2012, 14:13   #20
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Я бы начал с написания ИИ, ибо если это дело завалить, то не стоит продолжать весь проект в целом
Axrik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание игры "Крестики нолики" на php Loki1993 PHP 4 20.09.2012 20:33
Создание игры "Змейка" asmars C++ Builder 6 23.10.2011 15:20
PHP как язык для обучения программированию "с нуля"? DooM1k Свободное общение 10 31.03.2008 17:58
Создание игры "Крестики-нолики" Cubar Помощь студентам 9 22.01.2008 23:07