Вторник, 26 Ноября 2024, 08:16

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
помогите написать код
NormanofДата: Среда, 17 Июня 2020, 14:44 | Сообщение # 1
был не раз
Сейчас нет на сайте
Такая ситуация:
Есть игра лабиринт. Исходник приложу
Есть объект grid, который обозначает яму
Не могу написать для него условие
Нужно:
1. Объект не исчезал при попадании игрока
2. Если есть ЧЕРНЫЙ КЛЮЧ, то -1, если нет, то рандомом выбирается из остальных пяти и отнимается 1. Если же вообще ключей нет, то ничего не теряется
Пожалуйста, подробнее, что и куда писать, в программировании почти 0

https://hitf.to/WKUzVmJ
Исходник


Сообщение отредактировал Normanof - Среда, 17 Июня 2020, 14:45
drcrackДата: Среда, 17 Июня 2020, 17:00 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата
Пожалуйста, подробнее, что и куда писать, в программировании почти 0

В инете нет уроков по GMS для начинающих или в чем проблема вообще
Ты хочешь чтобы за тебя другие игру делали? Тогда тебе на fl.ru
А если ты хочешь научиться сам, наверно надо как-то по другому это делать, а не постить исходник со словами "сделайте мне вот это"?


Сообщение отредактировал drcrack - Среда, 17 Июня 2020, 17:01
NormanofДата: Четверг, 18 Июня 2020, 13:24 | Сообщение # 3
был не раз
Сейчас нет на сайте
Просто попросил помочь объяснить как это сделать
DivESДата: Четверг, 18 Июня 2020, 14:52 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Цитата Normanof ()
Есть объект grid, который обозначает яму

Почему grid, а не pit?
Сначала ямы решётками называете, а потом скрипты клянчите! :D

Цитата Normanof ()
Если же вообще ключей нет, то ничего не теряется

Это избыточное условие.

Ну а если пытаться тебе помочь, то:
Цитата Normanof ()
1. Объект не исчезал при попадании игрока

Я, конечно, могу ошибаться, но чтобы объект исчезал при попадании игрока, ему это нужно прописать. В твоём же случае ничего прописывать не нужно — он и не исчезнет.
Цитата Normanof ()
2. Если есть ЧЕРНЫЙ КЛЮЧ, то -1, если нет, то рандомом выбирается из остальных пяти и отнимается 1.

Что -1? Минус один ключ? Какой? Случайный? Зачем тогда второе условие? Зачем вообще численное представление ключей? Их может быть несколько? Зачем несколько одинаковых ключей? Если не может быть, то просто ключ или есть, или его нет.

Цитата Normanof ()
Просто попросил помочь объяснить как это сделать

Нет, одно дело, если бы ты показал свои попытки это реализовать и попросил бы указать на ошибки, спросил бы, что не так.
Ты же ничего не показываешь, так что по сути ты просишь за тебя это реализовать.
NormanofДата: Четверг, 18 Июня 2020, 16:27 | Сообщение # 5
был не раз
Сейчас нет на сайте
Объект игрока
Событие столкновение с grid
if (global.blackkey>0)
global.blackkey=global.blackkey-1
else
if (global.greenkey>0)
global.greenkey=global.greenkey-1
else
if (global.purplekey>0)
global.purplekey=global.purplekey-1
else
if (global.redkey>0)
global.redkey=global.redkey-1
else
if (global.yellowkey>0)
global.yellowkey=global.yellowkey-1
else
if (global.bluekey>0)
global.bluekey=global.bluekey-1

Объект grid
Событие create
код
alarm[0]= 3 * room_speed

сама скорость комнаты 30

Просто возникла такая проблема, что ключи отнимаются очень быстро т.е. пока стоишь на яме ключи минусуются
А нужно чтобы было одно попадание на яму = 1 раз работает код выше. Яма при этом не исчезала. Повторное попадание - тоже минус ключ и так далее

Цитата
Что -1? Минус один ключ? Какой? Случайный? Зачем тогда второе условие? Зачем вообще численное представление ключей? Их может быть несколько? Зачем несколько одинаковых ключей? Если не может быть, то просто ключ или есть, или его нет.

Нет, видов ключей 6, разных цветов, черный, красный... и т.д. Поэтому изначально и хотел чтобы приоритетно отнимался черный, а если его нет то выбором из остальных 5 если есть
CoreДата: Четверг, 18 Июня 2020, 17:08 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Normanof,
Цитата Normanof ()
1. Объект не исчезал при попадании игрока

А он разве куда-то исчезает?

Цитата Normanof ()
2. Если есть ЧЕРНЫЙ КЛЮЧ, то -1, если нет, то рандомом выбирается из остальных пяти


Изучите функцию if в программировании. Эта функция отвечает за нужное вам "если".

Ваш черный ключ можно обозначить переменной со значением true/false, или же 1/0:
Код
global.black_key = boolean

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

Что касается рандома, существует функция irandom(), выбирающая случайное число от нуля, до указанного в скобках. Тут вам и -1, и другая связанная с этим хренотень.

Цитата Normanof ()
Если же вообще ключей нет, то ничего не теряется


Это, как выше сказал DivES, является избыточным условием. Что можно реализовать с помощью else.

Цитата Normanof ()
Просто попросил помочь объяснить как это сделать

Нет. Ты попросил решить все задачи за тебя. Это разные вещи.

Добавлено (18 Июня 2020, 17:12)
---------------------------------------------

Цитата Normanof ()
global.blackkey=global.blackkey-1

Не оптимизировано, как и все решение в целом.
Не проще написать так?:
Код
global.blackkey-=1;


DivESДата: Четверг, 18 Июня 2020, 17:22 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Normanof, я сам с GM: S не знаком и элегантного решения могу не знать, поэтому предлагаю такой костыль:
Объекту игрока прописываешь свойство (переменную) onGrid, например.
При событии столкновения с Grid: onGrid = true (или onGrid = 1),
иначе: onGrid = false (или onGrid = 0).

И теперь просто этот твой код помещаешь под if (0 == onGrid) в событии столкновения с ямой.
Это защищает от множественных вызовов: при столкновении делаем проверку, стоит ли персонаж уже на яме (1 == onGrid); стоит? Ничего не предпринимаем. Не стоит? Значит только встал — выполняем твой код с "отниманием" ключей.

Надеюсь, понятно объяснил этот момент. laugh

То есть:
событие столкновения с grid
Код

if (0 == onGrid)
{
    // Код, который должен быть выполнен при вставании на яму.
    onGrid = 1;
}

иначе, если столкновений не происходит, нужно присваивать onGrid = 0;


Сообщение отредактировал DivES - Четверг, 18 Июня 2020, 17:29
NormanofДата: Пятница, 19 Июня 2020, 14:43 | Сообщение # 8
был не раз
Сейчас нет на сайте
Вот что происходит. Такое происходило и на моем коде. поэтому я пытался решить это через аларм
При попадании на яму ключи списываются до тех пор пока не будет 0
https://dropmefiles.com/e6K1w вот видео
DivESДата: Пятница, 19 Июня 2020, 16:40 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
Normanof, ну, во-первых, пользуйся видео-хостингами, скачивать сомнительные видео нет особого желания.
Ну а во-вторых, мы же тебе скинули идеи, почему же ты пишешь про свой прошлый опыт?
NormanofДата: Пятница, 19 Июня 2020, 16:41 | Сообщение # 10
был не раз
Сейчас нет на сайте
Я попробовал так как посоветовали тут. Вышло так, как на видео т.е. ничего не изменилось
DivESДата: Пятница, 19 Июня 2020, 16:47 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
Normanof, ладно, скачал, посмотрел. У тебя есть уверенность, что ты понял, что нужно было сделать и сделал всё правильно? laugh
Ты не обижайся, главное, если вдруг порой слишком строги с тобой, не забрасывай, — разберёмся потихоньку!
MagicHeroДата: Суббота, 20 Июня 2020, 01:28 | Сообщение # 12
участник
Сейчас нет на сайте
Решается же проблема элементарно, с добавлением одной переменной. Когда персонаж попадает в яму прогоняется код чтобы отнять ключи, с этим как я понял проблем нет. И в этот же момент переменной даёшь значение true. При следующей проверке столкновения с ямой, перед тем как начинать отнимать ключи у тебя будет проверка той самой добавленной переменной и если она true то ничего не отнимает. Как только персонаж выходит из ямы, т.е. пропадает коллизия с ямой, этой переменной присваеваешь значение false. И теперь опять если персонаж попадет в яму у него один раз отнимут ключи а переменной опять присвоится значение true и так по кругу.
Animan2010Дата: Суббота, 20 Июня 2020, 11:23 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Цитата Normanof ()
Объект игрока
Событие столкновение с grid
if (global.blackkey>0)
global.blackkey=global.blackkey-1
else
if (global.greenkey>0)
global.greenkey=global.greenkey-1
else
if (global.purplekey>0)
global.purplekey=global.purplekey-1
else
if (global.redkey>0)
global.redkey=global.redkey-1
else
if (global.yellowkey>0)
global.yellowkey=global.yellowkey-1
else
if (global.bluekey>0)
global.bluekey=global.bluekey-1


Я так понимаю, в гейм мейкере событие столкновения вызывается каждый фрейм, то есть примерно 60 раз в секунду, и все эти 60 раз в секунду у тебя уменьшаются эти ключи.
Сделай параметр проверки, что в последний раз с этой клетки уже уменьшался ключ, например:
if(global.lastGrid == grid)
return;
else
global.lastGrid = grid;

А вообще, подучи само программирование, тут проблема не в незнании движка, а непонимании что и как вообще работает в коде


Anima Games
Animan Publishing
DivESДата: Суббота, 20 Июня 2020, 11:30 | Сообщение # 14
заслуженный участник
Сейчас нет на сайте
MagicHero, чувак, спасибо, конечно, что перефразировал моё сообщение, но зачем?
OpenGOOДата: Суббота, 20 Июня 2020, 17:44 | Сообщение # 15
почти ветеран
Сейчас нет на сайте
Чтобы проверить что игрок вышел из ямы в событии Step объекта grid должен быть что-то похожее

if (is_collided && !place_meeting(x, y, player) {
is_collided = false;
}


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
NormanofДата: Понедельник, 29 Июня 2020, 13:59 | Сообщение # 16
был не раз
Сейчас нет на сайте
Ничего не помогло. Да, в программировании я 0, но как мне казалось такую простейшую схему сделать могу.
Нужно всего то лишь при одном попадании один ключ отнимать... а не 100500 пока стоишь там.
Объясните подробнее в какое событие что вставить и к кому объекту. В некоторых местах появлялась ошибка неизвестной переменной, хотя переменную назначал
MagicHeroДата: Понедельник, 29 Июня 2020, 19:34 | Сообщение # 17
участник
Сейчас нет на сайте
Тебе же выше уже писали как сделать.
Напишу тогда код, но скажу сразу что изучай gms2 а то так ты ничего сделать не сможешь.
в create игрока напиши

Код
check_grid=true;


В step твоего игрока напиши
Код
if place_meeting(x,y,имя_обьекта_ямы) // если обьект ямы имеет не один вид то пиши имя родительского объекта к которому прикрепи все типы ям, ловушек и т.д. все что отнимает ключи.
{
   if check_grid=true // если игрок попал в яму и до этого не находился в яме
   {
      // код для отнимания ключей
   }
   check_grid=false; // меняем переменную чтобы больше не прогонять код отнимания ключей т.к. игрок уже в яме
}
else
{
   check_grid=true; // как только игрок выйдет из ямы, меняем переменную чтобы при следующем попадании в яму опять один раз сработал код для отнимания ключей. Кстати тут же можно без проблем реализовать бессмертие если check_grid всегда будет false.
}


Сообщение отредактировал MagicHero - Понедельник, 29 Июня 2020, 22:53
NormanofДата: Вторник, 30 Июня 2020, 13:00 | Сообщение # 18
был не раз
Сейчас нет на сайте
Спасибо! Работает. Но в событии Step не работало. Поставил в событии столкновения - заработало. Но!
1. Прошел - отнялся ключ всё в порядке, сошел с ямы, походил, ещ раз перехожу через ту же яму, но ключ уже не отнимается. Почему?
2. На карте имеется несколько ям, как и куда их прописать? В первую строку кода типа
if place_meeting(520,534,grid)
if place_meeting(620,564,grid)
if place_meeting(720,554,grid)
так, к примеру?
DivESДата: Вторник, 30 Июня 2020, 13:12 | Сообщение # 19
заслуженный участник
Сейчас нет на сайте
Цитата Normanof ()
1. Прошел - отнялся ключ всё в порядке, сошел с ямы, походил, ещ раз перехожу через ту же яму, но ключ уже не отнимается. Почему?

Потому что ты поставил его в событие столкновения (срабатывает при столкновении), а он должен стоять в событии Step (срабатывать при каждом шаге), чтобы менять значение переменной check_grid на true при выходе из ямы.
Так как код вызывается только при столкновении, то часть
Код

else
{
    check_grid=true; // как только игрок выйдет из ямы, меняем переменную чтобы при следующем попадании в яму опять один раз сработал код для отнимания ключей. Кстати тут же можно без проблем реализовать бессмертие если check_grid всегда будет false.
}

не вызывается и никогда не будет вызвана, а значит переменной check_grid не будет присвоено значение true, а значит
Код

if check_grid=true // если игрок попал в яму и до этого не находился в яме
{
    // код для отнимания ключей
}

код для отнимания ключей выполнен не будет, ведь check_grid == false.

Цитата Normanof ()
2. На карте имеется несколько ям, как и куда их прописать?

Описывать каждую яму по отдельности — утомительно.
К тому же place_meeting(...) звучит как функция проверки столкновения с местом, а не с объектом. Поищи в сторону функции столкновения с объектом, тогда обойдёшься строчкой кода.


Сообщение отредактировал DivES - Вторник, 30 Июня 2020, 13:16
NormanofДата: Вторник, 30 Июня 2020, 13:18 | Сообщение # 20
был не раз
Сейчас нет на сайте
Отлично. Разобрался. Всем огромное спасибо. Вроде работает)

Сообщение отредактировал Normanof - Вторник, 30 Июня 2020, 13:54
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг