Всем привет!
В этот раз я не буду писать пространных сообщений на тему и без, ибо в заголовке все сказано. Скажу только, что игры проще делать на ООП, т.к. игровой объект - это свойства и подпрограммы, которые им управляют. Так давайте же поуправляем.
ОСНОВНАЯ ГИПОТЕЗА
Изойду из того (да, да, русский язык - это мой второй, после 1С), что в 1С можно неплохо так попробовать ООП на базе обработок. У них есть поля, методы, и даже публичные методы. В итоге ты, такой, пишешь что-то типа "МойКрутойМассив.Добавить(Обработки.МояОбработка.Создать())". Но в общем и целом подобное позволяет делать все эти плывущие или текущие штуки. И я вот ни разу не против.
Но игры - они на клиенте. И на клиенте для того, чтобы хранить массивы и методы мы вполне можем использовать форму. И пусть 1С дает советы не делать в формах экспортных методов. Хочу - и делаю )))
ПРОСТОЙ ПРИМЕР
Я сегодня рано встал, ибо в мыслях созрела игра "Пятнашки", которая должна быть написана таким вот ужасным способом - ООПшным!
Для этого я создал две формы. Даже две общих формы. Но это могли бы быть две любые формы. Но я художник, я так вижу )))
ПЕРВЫЙ...
Итак, первая форма - это форма игрового поля. Ничего там такого - поля сверху и слева, размеры по ширине и высоте, кнопки перемещения (я их на нумпад завязал, но с контрл, ибо без контрла у меня не заработало).
ВТОРОЙ...
Вторая форма - это фишка. Внутри ничего нет, кроме информации о местоположении и двух методов: показать и скрыть. Ну и конструктор - им отлично выступает ПриСозданииНаСервере().
ФЛОУ (я не в курсе, что это, но у нас на работе так любят говорить)
При запуске приложения открывается основная форма игрового поля.
Далее происходит следующее:
1. Оформляем поле, устанавливая ширину и высоту колонок в пределах заданных полей и размера игрового поля. Это можно сделать на сервере при том самом создании.
2. Создаем объекты фишек:
СЧ = Новый ГенераторСлучайныхЧисел;
СЗ = Новый СписокЗначений;
Для А = 1 ПО ВысотаПоля Цикл
Для Б = 1 По ШиринаПоля Цикл
СЗ.Добавить(Новый Структура("Верх, Лево", А, Б), СЧ.СлучайноеЧисло(100,999));
КонецЦикла;
КонецЦикла;
СЗ.Удалить(0);
СЗ.СортироватьПоПредставлению();
Для Каждого Ст ИЗ СЗ Цикл
Параметр = Ст.Значение;
Параметр.Вставить("Номер", Фишки.Количество() + 1);
Фишки.Добавить(
ПолучитьФорму("ОбщаяФорма.Фишка", Параметр, ЭтотОбъект, Истина)
);
КонецЦикла;
Рендер();
Здесь сначала мы создаем фишки в списке значения, заполняя случайным числом представление, чтобы потом смешать фишки на поле. Да, я за утро ничего лучше не придумал, так что не ругайте сильно )))
Дальше удаляем первую фишку, чтобы было пустое место.
Дальше мы создаем объекты фишек, после чего рендерим.
Рендер - это просто вызов "Показать" для каждой фишки.
Для Каждого Ст ИЗ Фишки Цикл
Ст.Значение.Показать();
КонецЦикла;
Фишки хранятся на форме в списке значений, поэтому "Ст.Значение.Показать()".
Ну и объект сам там все знает, где он и с кем.
Ну и дальше блок управления. Т.к. я не храню пустую фишку, то приходится повозиться с определением ее позиции. Ну там сами в коде гляните, если захотите.
Инициализация фишки происходит так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Параметры.Свойство("Лево", ПоложениеЛево);
Параметры.Свойство("Верх", ПоложениеВерх);
Параметры.Свойство("Номер", Номер);
Изменение = Истина;
КонецПроцедуры
Просто засовываю внутрь положение и номер. А вот так вот мне захотелось.
Показать и скрыть тоже элементарно сделаны:
&НаКлиенте
Процедура Показать() Экспорт
Если Изменение Тогда
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.БольшойПунктир,2,1);
Изменение = Ложь;
Область = ПолучитьОбласть();
Область.Текст = Номер;
Область.ЦветФона = WebЦвета.Бирюзовый;
Область.Шрифт = Новый Шрифт(,,,Истина);
Область.ГраницаСверху = Линия;
Область.ГраницаСлева = Линия;
Область.ГраницаСнизу = Линия;
Область.ГраницаСправа = Линия;
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Скрыть()
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии,0,0);
Изменение = Ложь;
Область = ПолучитьОбласть();
Область.Текст = "";
Область.ЦветФона = Новый Цвет;
Область.Шрифт = Новый Шрифт();
Область.ГраницаСверху = Линия;
Область.ГраницаСлева = Линия;
Область.ГраницаСнизу = Линия;
Область.ГраницаСправа = Линия;
Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецПроцедуры
В общем, все для человека!
Ладно, завязываю.
Всем всех благ. Читайте ленты, ставьте лайки, подписывайтесь на каналы, качайте за стартмани и прочие шалости производите. Не болейте!
ЗЫ: cf-ник был сделан на последней платформе 1С для обучения. 8.3.26+.