RS Game Maker Community

Проекты и Релизы => Проекты в разработке => Тема начата: konst_cs от 01 Июня 2015 в 19:32



Название: G.E.M.S
Отправлено: konst_cs от 01 Июня 2015 в 19:32

G.E.M.S (рабочее название)

Жанр: пазл
Движок: GM-Studio
Начало разработки: декабрь 2014
Дата релиза: -

Описание:
небольшая логическая игра
моя тема на gamedev.ru (скриншоты): http://www.gamedev.ru/projects/forum/?id=201140#m3

Разработчик:
я один

Проекту нужны: посильная помощь в освоение GM, советы и комментарии от знающих людей.



на данный момент готово 90% графики, загружено в спрайты, созданы объекты под эти спрайты и тестовые комнаты.
написаны алгоритмы как все должно работать, начал ковырять понемногу код и тут у меня проблемы..
вопросы могут показаться крайне примитивными, но я полный нуб в GM(


сейчас у меня есть тестовая комната разбитая на квадратные клетки и главный объект (заранее расположен в комнате) который должен двигаться по этим

клеткам:
1. при нажатии вверх или вниз, должен смещаться на клетку вверх или вниз соответственно, но не более х раз за цикл комнаты.
2. в конце цикла комнаты главный объект смещается в сторону, влево или вправо, в зависимости от типа клетки.


теперь сложное:.
  1. я создаю событие `create` и в окне `actions` добавляю исполняемый код с переменными для главного объекта при старте в нулевой клетке:
{
a=1  \\ блок сверху, 1 - нет, 0 - есть.
b=1  \\ блок снизу, 1 - нет, 0 - есть.
c=0  \\ сдвинуть влево (в конце цикла комнаты) если 1, 0 - оставить на месте
d=0  \\ сдвинуть вправо (в конце цикла комнаты) если 1, 0 - оставить на месте
e=0  \\ количество допустимых сдвигов объекта (вверх\вниз) за цикл (допустим 3), сбрасывается на ноль после окончания цикла.
}

  2. здесь событие нажатия кнопки "вверх"  (выдает ошибку)
{
if (a=1); (e<=3)    \\ как тут писать соблюдение двух условий через ";" или "and" ?
{у+=20}              \\ как добавить скорость смещения объекта, просто рядом дописать {vspeed=10}?
{e+=1}               \\ тут нужно прибавить к переменной `e` единицу, так это делается?
}

  3. событие `end step`, смещаю объект влево или вправо, сбрасываю переменную `e` на 0
{
if (c=1)
{x += 20}
if (d=1)
{x -= 20}
e=0
}

  4. событиие столкновения с клеткой, задает ограничение на движение объекта (меняет переменные)
{
a=1 
b=1
c=0
d=1


вопрос что я делаю не так? начал копать справку и примеры, но как-то слишком много всего..


Название: Re: G.E.M.S
Отправлено: Макасин от 01 Июня 2015 в 21:19
if (a=1); (e<=3)    \\ как тут писать соблюдение двух условий через ";" или "and" ?
Через and или &&. В одних скобках. Сейчас скорее-всего кто-то прибежит и скажет, что я неправ и это разные вещи.

{у+=20}              \\ как добавить скорость смещения объекта, просто рядом дописать {vspeed=10}?
Да, а потом, когда нужно остановить, приравнять скорость снова к нулю. Можно запомнить начальные координаты и остановить при достижении нужных, а можно при помощи alarm'а обнулить скорость через нужный промежуток времени.

{e+=1}               \\ тут нужно прибавить к переменной `e` единицу, так это делается?
Да.

  3. событие `end step`, смещаю объект влево или вправо, сбрасываю переменную `e` на 0
{
if (c=1)
{x += 20}
if (d=1)
{x -= 20}
}

Можешь оставить только одну переменную, например с, а в создании определять: "-1" - влево, "0" - на месте, "1" - вправо. Тогда весь этот код можно будет заменить на строчку x+=c*20.



А зачем тебе проверка e<=3, если е не поднимается выше 1?


Название: Re: G.E.M.S
Отправлено: konst_cs от 01 Июня 2015 в 23:03
Макасин, спасибо, понемногу проясняется..
Да, а потом, когда нужно остановить, приравнять скорость снова к нулю. Можно запомнить начальные координаты и остановить при достижении нужных, а можно при помощи alarm'а обнулить скорость через нужный промежуток времени.
с движением не совсем понятно, нельзя просто указать расстояние и скорость, сам не остановится?..
допустим, у меня объект стоит на клетке где-то в середине комнаты (не обязательно в центре)
мне нужно чтобы при нажатии, допустим, кнопки вниз - он начал смещаться вниз на определенное расстояние (относительно себя) с определенной скоростью, и там (на соседней клетке) остановился.
сейчас у меня получилось так:
{
if (a=1&&e=0&&e=1&&e=2)
{y-=20}  
{vspeed=10}
{e+=1}
}
в итоге при нажатии кнопки вниз, объект плавно едет вниз и исчезает за экраном. при {y+=20} также вниз. похоже что к какому-то началу координат, которое видимо внизу. это не совсем удобно, возможно в процессе придется менять и размер комнаты и клеток, думаю если делать движение относительно объекта потом будет проще все править, чем с привязкой к каким-то координатам

А зачем тебе проверка e<=3, если е не поднимается выше 1?
да, тут ошибся, надо чтобы всего три раза за цикл можно было сместить объект

Можешь оставить только одну переменную, например с, а в создании определять: "-1" - влево, "0" - на месте, "1" - вправо. Тогда весь этот код можно будет заменить на строчку x+=c*20.
часть клеток будет отличатся  пока так оставлю, а то запутаюсь вконец..

 


Название: Re: G.E.M.S
Отправлено: Макасин от 02 Июня 2015 в 01:25
нельзя просто указать расстояние и скорость, сам не остановится?

Расстояние вписывай как у+20, например.
move_towards_point(x,y,sp) Заставляет текущий экземпляр объекта двигаться по направлению к точке с координатами (x,y) со скоростью sp.

{
if (a=1&&e=0&&e=1&&e=2)
{y-=20} 
{vspeed=10}
{e+=1}
}

Этот кусок кода нелогичен. Во-первых, невозможно соблюсти условие "е=0 и е=1 и е=2". Может тебе нужно "или"? Во-вторых, зачем ты и изменяшь координату и даешь объекту скорость? В-третьих, на одно условие - одни фигурные скобки, действия разделяй переносом строки или точкой с запятой. Собственно только вторые и третьи фигурные скобки работают, ибо они не привязаны к невозможному условию.


Название: Re: G.E.M.S
Отправлено: tolich от 02 Июня 2015 в 11:07
Могу только дать совет почитать эту книгу (http://www.lib.ru/CTOTOR/starterkit.txt).


Название: Re: G.E.M.S
Отправлено: konst_cs от 02 Июня 2015 в 14:46
tolich
спасибо, начал читать.  но там про `Си`.. могу я брать от туда примеры кода в GM? будут у меня работать все эти операторы и т.д если я их начну писать в код GM? 
Макасин
совсем запутался..
Расстояние вписывай как у+20, например.
получилось так:
{
if (b=1&&e<3)
{y=y-20;vspeed=10;e+=1}
}
но объект также не останавливается через расстояние 20, а уезжает совсем вниз за экран, как и при {y-=20}

move_towards_point(x,y,sp) Заставляет текущий экземпляр объекта двигаться по направлению к точке с координатами (x,y) со скоростью sp.
главный вопрос: координаты (0,0) - это центр самого объекта или некая постоянная точка (начало координат), которая сама по себе?
мне нужно все действия перемещения завязать на объект..

еще вопрос: move_towards_point(x,y,sp) в коде выглядит как, допустим, move_towards_point(0,-20,10)?
{
if (a=1&&e<3)
{move_towards_point(0,-20,10);e=e+1}
}
- объект уезжает за экран в направлении 10 часов, пойду искать примеры..

p.s. получил сообщение при сохранении комнаты "we are comparatively big loop in NewWndProk"(




Название: Re: G.E.M.S
Отправлено: tolich от 02 Июня 2015 в 15:49
могу я брать от туда примеры кода в GM? будут у меня работать все эти операторы и т.д если я их начну писать в код GM?
Не все, хотя, наверное, довольно многое. Но суть в прочтении книги - научиться думать, как программист.


Название: Re: G.E.M.S
Отправлено: Макасин от 03 Июня 2015 в 23:07
главный вопрос: координаты (0,0) - это центр самого объекта или некая постоянная точка (начало координат), которая сама по себе?
0,0 - верхняя-левая точка комнаты. Центр объекта - х,у. Исходя из этого я писал тебе у+20, то есть на двадцать пикселей ниже объекта. Писать это нужно было в функцию.

объект уезжает за экран в направлении 10 часов, пойду искать примеры
Из вышесказанного ты уже понял, что он просто направляется в точку 0,-20.


Название: Re: G.E.M.S
Отправлено: konst_cs от 04 Июня 2015 в 00:59
Из вышесказанного ты уже понял, что он просто направляется в точку 0,-20.
да, спасибо, с этим разобрался, так работает:
{
if (a=1&&e<=2)
{y+=20;e=e+1}
}
просто не сразу понял куда всунуть эти самые y+=20, примеров много но там много всего, глаза разбегаются с непривычки..


Название: Re: G.E.M.S
Отправлено: Макасин от 04 Июня 2015 в 13:14
Вообще-то я предлагал тебе сунуть его в функцию move_towards_point(x,y,sp), тебе же со скоростью нужно смещать.


Название: Re: G.E.M.S
Отправлено: konst_cs от 04 Июня 2015 в 20:11
Вообще-то я предлагал тебе сунуть его в функцию move_towards_point(x,y,sp), тебе же со скоростью нужно смещать.
объект движется в направлении указанной точки, но не останавливается в ней..



Название: Re: G.E.M.S
Отправлено: Макасин от 05 Июня 2015 в 15:32
Как останавливать мы тоже уже обсуждали.


Название: Re: G.E.M.S
Отправлено: konst_cs от 06 Июня 2015 в 17:06
перепробовал кучу вариантов, все  не работает..так по идее должно тормозить объект, но получается то же самое с короткими остановками и продолжением движения
{
move_towards_point(x,-200,10)
if (y=yprevious-200)
{speed=0}
}


Название: Re: G.E.M.S
Отправлено: Кто-тo от 06 Июня 2015 в 18:46
Эхм. Как у тебя отношения с математикой?
Вот у меня неочень с Русский языка.

y - это текущая координата, т.е. после перемещения.
yprevious - это координата, которая была до перемещения.
move_towards_point(x,-200,10) - грубо говоря мы говорим «переместись в направлении точки y=-200 на шаг в 10 пикселей».
Если непонятно, то шаг происходит 30 раз в секунду, а следовательно и переменные эти меняются 30 раз в секунду.

Условие (y=yprevious-200) - оно будет выполняться только если y будет равным yprevious от которого отняли 200.
Или другими словами, если был сделан шаг в 200 пикселей.

На тот случай, если суть не понятна:
Ты делаешь шаг в 10 пикселей, а условие выполнится если был сделан шаг в 200 пикселей.


Название: Re: G.E.M.S
Отправлено: konst_cs от 06 Июня 2015 в 22:21
я то понял, что yprevious - координата до непосредственного начала события перемещения, а она каждый шаг меняется (это уже не совсем до, а где-то даже немного и после перемещения.. )

между тем, так тоже не работает:
{
move_towards_point(x,-100,10)
if (y=ystart-200)
{speed=0}
}
или ystart (стартовая позиция по оси y), также каждый шаг меняется?
осталось привязать к началу координат, пойду искать как оно обозначается..





Название: Re: G.E.M.S
Отправлено: tolich от 07 Июня 2015 в 12:27
Перемещение (согласно скоростям) происходит после обработки события Step, но до события End Step.

xstart, ystart - позиция, в которой объект был создан. Конечно, поскольку это записываемые переменные, которые ни на что не влияют, в них можно хранить что угодно, но изначально там позиция создания объекта. Если ты в неё ничего не пишешь, так и будет.


Название: Re: G.E.M.S
Отправлено: Макасин от 07 Июня 2015 в 21:34
Я уже не улавливаю ход твоих мыслей, если честно. Тебе, вроде, нужно было останавливать в нужной точке? Так и проверяй по координатам этой точки. Или используй проверку расстояния до точки, в справке найдешь. Или вообще, тебе известна скорость и дистанция которую нужно пройти, останавливай по аларму, через нужное время.


Название: Re: G.E.M.S
Отправлено: konst_cs от 07 Июня 2015 в 23:40
Макасин
Я уже не улавливаю ход твоих мыслей, если честно. Тебе, вроде, нужно было останавливать в нужной точке?
мне нужно по нажатию кнопки, сдвинуть объект, на определенное расстояние, с определенной скоростью, все.
Так и проверяй по координатам этой точки
пробовал, многими способами, пока неудачно..
Или вообще, тебе известна скорость и дистанция которую нужно пройти, останавливай по аларму, через нужное время.
скорость и дистанция известна (кубик ползает по квадратой сетке, вроде бы крайне примитивный случай..).  да, тоже подумал через аларм попробовать. завтра буду смотреть , весь день делал графику, вконец упоролся, ничего не соображаю сейчас

tolich
Перемещение (согласно скоростям) происходит после обработки события Step, но до события End Step.
понял что в событие End Step, можно поставить speed=0. не совсем понимаю как это сделать и будет ли работать, надо смотреть..




Название: Re: G.E.M.S
Отправлено: konst_cs от 19 Декабря 2016 в 21:46
 Отдельную тему по звуку создавать не стал, спрошу здесь. В данный момент проект готов на 50-60%, пока программист занят другими делами хочу заказать 2 саундтрека (1 для меню и 1 непосредственно для уровней). Хотелось бы услышать мнения более опытных людей на следующие вопросы:
1. В каком формате лучше заказывать аудиофайлы для использования в GM и есть ли какие-то ограничения по их качеству/размеру/продолжительности?
2. Сколько в среднем это удовольствие может стоить, хотя-бы ориентировочно (не берем в расчет расценки топовых звуковиков)?