Как сделать стратегию. Создание стратегии с нуля – подробное руководство Как самому сделать стратегию для pc

Привет всем! Сейчас я расскажу вам как сделать простую ртс-ку (РТС - RTS - Real Time Strategy то есть стратегия в реальном времени) открываем гамак 8.1 (на 8.0 работоспособность не гарантируется) создаём объект objControl, то есть это будет наш главный объект создаём событие создания (Create) Добавить событие => Создание (Add event => Create) событие создание делается всего один раз - при создании, нажимаем на вкладку control в правом вертикальном меню и нажимаем ПКМ по Execute code (Выполнить код) и пишем код (лучше всего не копировать код, а писать его самому, так гораздо легче запомнить):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //Объявляем переменную начала точки по х
starty=0; //Объявляем переменную начала точки по у
draw_rect=false; //Не рисуем прямоугольник выбора


Переменная: часть памяти, которая содержат информацию. Они имеют своё имя, с помощью которого Вы можете обратиться к ним. Переменные в GML могут содержать реальное число или строку. К примеру, стол - это переменная, деревянный или стеклянный - значение
Теперь создаём событие шага (Step, Add Event = > Step) и выполняем операцию заново (нажимаем ПКМ по Execute code (Выполнить код)):

200?"200px":""+(this.scrollHeight+5)+"px");">
if mouse_check_button_pressed(mb_left) //Если ЛКМ нажата
{
draw_rect=true; //Мы рисуем прямоугольник
startx=mouse_x; //Стартовая х позиция = положение х мыши
starty=mouse_y; //Стартовая у позиция = положение у мыши
with all selected=false; //Это пока не объявленная переменная, что она будет делать мы узнаем позже
}

If mouse_check_button_released(mb_left) //Если ЛКМ отпущенна
{
draw_rect=false; //Мы не рисуем прямоугольник
for(i=0;i<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii=instance_find(par,i); //Мы ищем пока не сделанный объект
if(collision_rectangle(startx,starty,mouse_x,mouse_y,ii,true,false)) //Вот наш прямоугольник коллизии (соприкосновения)
{
ii.selected=true;
}
}
}

Код большой и сложный, пока мы узнаем про оператор условия if:
Код с if выполняется так:

200?"200px":""+(this.scrollHeight+5)+"px");">
if (условие)
{
действие
}

Также в нём может быть оператор else (иначе), пример:

200?"200px":""+(this.scrollHeight+5)+"px");">if (условие)
{
действие
}
else
{
действие 2
}

А for - это оператор цикла, он выполняется так:

200?"200px":""+(this.scrollHeight+5)+"px");">
for (<переменная> ; <выражение> ;<действие переменной>)
{
<действия>
}


оператор for очень мощная вещь, он очень помогает в трудных ситуациях

Оператор - встроенные в ЯП действия, например, самая распространённая это int, if, else, string, switch, for, case, break, exit, и т.д и т.п.

Теперь также создаём событие рисования (draw) и таким же путём пишем:

200?"200px":""+(this.scrollHeight+5)+"px");">if draw_rect=true
{
alpha=.8;
draw_rectangle_color(startx,starty,mouse_x,mouse_y,c_green,c_green,c_green,c_green,true);
}

Здесь всё легко, вот то же самое только по Русски:
если нам нужно рисовать прямоугольник, то мы выбираем прозрачность и рисуем прямоугольник
вот аргументы

200?"200px":""+(this.scrollHeight+5)+"px");">draw_rectangle_color(x1,y1,x2,y2,color 1, color 2, color 3, color 4, outline)


outline - будет ли рисоваться только грань (true) или залитый прямоугольник (false)
Мы нашли новое слово - константа, это заменённое словом числовое выражение или код, в гамаке есть встроенные константы:

200?"200px":""+(this.scrollHeight+5)+"px");">true (правда) - 1
false (ложь) - 0
pi - 3.1415...


Ну вот, разобрались, теперь нам нужно создать новый объект - родительский объект, который будет подключаться к дочерним. Назовём его par (чтобы сменить имя нужно менять код в событие шага контрольного объекта), в событие создания пишем:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //Вот и наша переменная, выбран ли объект

Это всё. Теперь нам конечно же нужен объект, который может передвигаться, называем его objTest, в событие создания пишем код:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Куда идти по х...
goy=y; //по у
selected=false; //Мы не выбраны =)
object_set_parent(self,par) //Вот и выбор родителя

Новое действие:

200?"200px":""+(this.scrollHeight+5)+"px");">object_set_parent(ind,obj)

Устанавливает родительский объект для объекта с именем ind.
И новый оператор: self, он означает что действие будет переходить к себе
Не бойтесь, ещё немного осталось, в событие шага:

200?"200px":""+(this.scrollHeight+5)+"px");">if distance_to_point(gox,goy) > 20
{
mp_potential_step(gox,goy,6,solid);
}
if(selected=true) && mouse_check_button_pressed(mb_right)
{
gox=mouse_x;
goy=mouse_y;

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

Итак, что такое пошаговая игра ? В википедии можно найти следующее определение пошаговой стратегии - это жанр компьютерных игр, основной особенностью которого является то, что игроки совершают ходы по очереди, в противоположность стратегии в реальном времени . Я бы немного упростил это определение:

  • Пошаговая стратегия - это стратегическая пошаговая игра .
  • Стратегическая игра - это жанр игр, в котором залогом достижения победы является планирование и стратегическое мышление .
  • Пошаговая игра - это жанр игр, основной особенностью которого является то, что игроки совершают ходы по очереди .
К пошаговым играм относятся:
  • Пошаговые стратегии
  • Карточные игры
  • Настольные игры (шахматы, го, монополия и пр.)
Замечу, что пошаговые игры накладывают меньше ограничений на сложность протокола взаимодействия по сравнению с реал-тайм играми. А именно, время реакции на то или иное событие ключевой роли не играет . Игроку обычно отводится от 10 секунд времени на принятие решения. Даже если пинг гигантский, скажем, 3 секунды, то игроку остается еще целых 7 секунд на раздумье. Кроме того, пинг может скакать и прыгать, а нас это совсем не волнует (в реал-тайм играх такая ситуация практически убивает любой протокол).

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

Поэтому при создании протокола мы будем ориентироваться прежде всего на простоту его реализации и поддержки. Это позволит нам извлечь большую прибыль за меньшее время.

Приводимые рассуждения имеют под собой опору 2-месячной разработки некоторой карточной игры.

Умный или глупый клиент?

Для начала, давайте определимся, насколько "умным" может быть наш клиент. Я рассуждаю о том, стоит ли дублировать логику приложения (правила игры) на клиенте. Безусловно, сервер должен быть умным, чтобы предотвратить потенциальный взлом приложения. Но стоит ли обучать бизнес-логике клиент?

Это напрямую зависит от того, сколько весит полный объем данных о состоянии вашей игры. Если этот объем данных велик, долго собирается на сервере и передается клиенту, то имеет смысл часть логики реализовать на клиенте, чтобы разгрузить сервер. Например, в Civilization датчик используемой памяти всегда зашкаливает. Сможете ли вы создать нечто подобное, оставив на клиенте исключительно UI?

С другой стороны, чем умнее клиент, тем дороже обойдется разработка игры. Замечу, что от эрудиции клиента время разработки сервера никак не зависит. Пусть даже клиент супер-пупер-мега умный, если пользователь захочет перезагрузить окно браузера, то серверу прийдется собирать и компоновать все данные об игре для передачи их клиенту. А ля "Загрузка сохраненной игры". Вывод: умный клиент может ускорить работу приложения, но он всегда потребует дополнительных ресурсов для разработки приложения.

Предлагаю следующий тест :

1. Позволяет ли объем канала?

Оцените средний вес полного объема данных о состоянии игры. Далее, умножьте на среднее количество запросов к серверу в секунду. Если полученное число превысит объем исходящего канала передачи данных, то глупый клиент недопустим. Если это число превысит 20% исходящего канала, то стоит призадуматься, потянет ли?

2. Велика ли трудоемкость?

Оцените трудоемкость алгоритма сбора данных об игре (в долях секунды). Здесь же учтите все запросы к базе данных. Далее, умножьте на среднее количество запросов серверу в секунду. Если время превысит одну секунду, то глупый клиент недопустим. Если это число превысит 200 мс, то стоит призадуматься, потянет ли?

Продолжение:

theme_park:
IНам понадобиться:
спрайт здания
спрайт меню
спрайтЫ разнЫХ кнопОк таких как:
срайт с надписью(стройка, строительство, построить и т.д.)
окошко, которое будит появляться
рисунок со зданием,
1)остальное сами будим добавлять
2) слово подделочные-создал сам, т.к. нам понадобиться подделывать под свой исходник)
IIПриступим:
1)создаём всё что написано в пункте I кроме 1)
Создадим глобальную переменную под названием money, установите любое изначальное кол-во денег
Так же сделаем объект mouse & keyboard
Создаём текст назовём его info, сделаем событие always, в нём создаём action:
выбираем info в выборе действий выбираем set text в тексте пропишем вот это:
"money: " &(global("money".
2)добавим меню ,главной задачей меню: не мешать, а помогать игроку ориентироваться(как оно может мешать?-легко, если вы поставите его по середине игры);прежде чем сделать меню создадим новый layer, который назовём menu,в его пропорциях(настройках, опциях) в пункте display пропишем:


в нём добавим спрайт и возьмём изображение меню, которое было в предделочных материалах(пункт I) и поместим наше меню в укромное местечко где оно не будет мешать, но будет видимым на экране
поместим также кнопку из предделочных материалов(пункт I) с надписью СТРОИТЬ(или что-то в этом роде)
положим её на меню
теперь заходим в Event Sheet Editor
создаём событие(#бла-бла-бла#-это моё сообщение(пояснение) вам только вместо бла-бла-бла будет стоять мой комментарий для вас;>>-действие;ll-деление окошками например:

mouse&keyboard ll on object clicked ll left clicked to object #кнопка вашего меню с надписью СТРОИТЬ(или что-то в этом роде)##остальное потом (см. 3пункт)#
3)теперь Самое сложное (я разбил это на два пункта чтобы это не было столь за мудрено),
создаём спрайт из предделочных материалов "окошко, которое будит появляться"
потом создаём пустой спрайт под названием p1, окошко отодвинем за пределы экрана, а p1 поставим на место где должно появиться ваше окошко при нажатии кнопки строить(или что-то в этом роде ЧВЭР)
отлично!Теперь переходим в event sheet editor
пропишем не доделанное событие до конца:
Text ll set text ll bla-bla-bla)
mouse&keyboard ll on object clicked ll left clicked to object #кнопка вашего меню с надписью СТРОИТЬ(ли что-то в этом роде)#>>
4)Вторая часть самого сложного :
создадим спрайт спрайт где будет нарисовано изображение здания(предделочные материалы)назовём h1
создадим пустой спрайт, назовём p2, теперь поместим его на место где должно открыться окошко,
создадим спрайт-тоже окошко(предделочные материалы),в окошке красиво напишем название здания, его стоимость и описание(по желанию)назовём i1
создадим ещё один пустой спрайт, под названием р3, поместим его рядом с р2, только чтобы он касался р2 только верхним левым углом
теперь создадим несколько событий,но сначала до делаем прошлое событие одним новым действием:
mouse&keyboard ll on object clicked ll left clicked to object #кнопка вашего меню с надписью СТРОИТЬ(ли что-то в этом роде)#>> sistem ll create object relative to object ll #ваше окошко# #номер layer под именем menu# #X;Y-не меняем# to object p1
>>sistem ll create object relative to object ll #ваше второе окошко# #номер layer под именем menu# #X;Y-не меняем# to object p2
Нам надо ещё сделать обратно ему событие:
копируем событие и инвертируем
new event
mouse&keyboard ll is over object ll h1>>sistem ll creat object to relative to object ll i1 #номер layer под именем menu# #X;Y-не меняем# to object p3
Cделаем спрайт со зданием(пользуйся предделочными материалами)назовём house
Создадим окно где будут появляться наши здания при их выборе в меню назовём rlo
события:
mouse&keyboard ll on object clicked ll left clicked to h1>>sistem ll create to object relative to object ll house #номер layer под именем menu# #X;Y-не меняем# to object rlo
>> sistem ll subtract from value ll #кол-во денег которое должно отняться при строительстве#
теперь событие чтобы строить было нельзя
я вам расскажу мой бывший способ запрещения (когда закончу писать исследую ещё один способ, которому меня о синило когда я вспомнил игру theme park world)
события:
house ll on collision with another object ll to house
>>house ll destroy
>> sistem ll subtract from value ll - #удвоенное кол-во денег которое отнялось при строительстве##заметьте вы должны поставить - кол-во#
в принципе всё.
IIIчто хочу сказать:

Меня очень огорчил крах моей игры.Она была стратежка, и по её схеме составленна эта статья.Попрошу сильно не критиковать, писал долго,найдёте речевые ошибки пишите исправлю
а также вот исходник на растерзание,смлтрите, впринципе там всё так же как и тут написано только это была демонстративная версия игры.Главное ни чего не менять, а то за глючит!
пользуйтесь,экспериментируйте, проверяйте, делайте что хотите мне всё ровно

KaMiKaZa:
Все "системные" выражения нужно внести в тег "Код".
Тогда, думаю, лучше будет.
Ещё, мне кажется, скрины тут бы не помешали. А также исходник, для новичков.

theme_park:
я не умею делать скрины событий.

ну это не обязательно.

iamnp:
theme_park , есть спец кнопка на клаве - PrintScreen

theme_park:
я знаю просто некоторые по другому делают.Тем более у каждого свой спрайт
и если я понаставлю все эти спрайты мало кому будет понятно.
ну может кто плюсанёт? Не зря же я корячился?

burlachenko:
Что бы такой урок кого-то заинтересовал, его нужно соответственно оформить, а здесь "абы было".
И все таки если будет желание, по чуть чуть, когда будет время "прихорошите" его пожалуйста.

theme_park:
окей, приду со школы прохорошу.
ПС. добавил исходник

Serega Lebedev:

iamnp , а куда эти скрины потом деваются?

KaMiKaZa:

В буфер обмена.
Зайди в любой текстовый редактор, и выполни операцию "Вставить", либо нажми Ctrl+V.

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

Борисюк Юрий Александрович, консультант по управлению, доктор технических наук

Мне очень нравится цикл мастер-классов, которые Вы ведете. Лично я, ранее являясь руководителем фабрики, начал менять свои подходы к управлению, в т.ч. благодаря информации получаемой от Вас. Она как-то отзывалась с тем, что я делал и наблюдал на фабрике. С тех пор у меня зародилась мысль как же малоэффективна промышленная способность России и как огромен потенциал и как это можно реализовать. Лично знакомясь с проблемами разных предприятий (иногда друзья приглашают как эксперта) я вижу, как многое можно сделать, как увеличить и результативность и эффективность.

Дрягин Олег Борисович

Да, мне нравятся Ваши мастер-классы, очень системный подход, владение материалом на высоком уровне и, безусловно, чувствуется большой практический опыт в тех вопросах, которые рассматриваются. Меня привлекает то, что профессионализм и высокий уровень профессионального владения предметом у Александра, позволяет мне по другому посмотреть на уже знакомые вещи. С моей точки зрения, это очень важно, и нужно, на известные тебе вещи взглянуть по новому, т.к. в процессе операционной работы очень часто глаз "замыливается" и ты перестаешь видеть, на самом деле, очевидные вещи.

Елена Федаш, Директор по персоналу, Корпорация "АТБ", г. Днепропетровск.