alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« : Январь 13, 2020, 16:51:05 » |
|
Доброго времени суток! Скажите пожалуйста, как решить данную проблему? Я в коде хотел сделать так что бы когда счет был больше 100 то тогда должен был создаться объект и воспроизвестись короткий звук. Все это должно произойти только один раз. К примеру игрок набирает 100 или больше очков, сразу звучит мелодия и появляется объект один раз. Появляется один бъект и один раз проигрывается звук не в зависимости сколько очков будет дальше собираться. Но программа не понимает что я хочу всего один раз исполнить те действия при тех условиях и повторяет их пока число больше 100. Как решить данную проблему? Ниже приведен мой скрипт. if place_meeting(x,y, obj_0) { score+=30 } if score>100 { instance_create (2885,2813, obj_2) sound_play(sound0) }
|
|
|
Записан
|
|
|
|
AndrewVideoGames
Главный Модератор
Репутация: 821
Online
Пол: Награды:
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316
|
|
« Ответ #1 : Январь 13, 2020, 18:28:36 » |
|
Всё правильно, как вы прописали, так и работает, у вас и объектов будет бесконечное множество создаваться с таким кодом. Чтобы этого избежать, можете создать отдельную переменную, которая будет хранить в себе значение того проигрывался звук или нет, можно просто добавить ещё одну проверку в условие, например: if (place_meeting(x,y, obj_0)) { score += 30; } if ((score => 100) && (score - 30 < 100)) { instance_create (2885, 2813, obj_2); sound_play(sound0); }
Советую не использовать в коде непонятные значения вроде 30, 100 и особенно 2885 и 2813 – поместите их в переменные, меньше мороки будет потом. Так же, называйте ресурсы осмысленно, что за obj_2, sound0 – никому не понятно, в том числе и вы через какое-то время забудете. P.S. Для вставки кода на форуме используйте тег [code][/code]
|
|
|
Записан
|
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #2 : Январь 13, 2020, 20:02:21 » |
|
Спасибо за ответ, я все это учту. Сейчас на пятой строке ошибка : "Unexpected symbol in expression" if ((score => 100) && (score - 30 < 100))
|
|
|
Записан
|
|
|
|
ГоК
Активный участник
Репутация: 70
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 278
Аррр
|
|
« Ответ #3 : Январь 13, 2020, 20:24:11 » |
|
Маленькая опечатка: Нужно ">=" вместо "=>"
|
|
|
Записан
|
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #4 : Январь 13, 2020, 21:08:33 » |
|
Маленькая опечатка: Нужно ">=" вместо "=>"
Спасибо, скрипт теперь без ошибок но по прежнему не работает как нужно. Пытаюсь щас с перемнными придумать что-нибудь.
|
|
|
Записан
|
|
|
|
AndrewVideoGames
Главный Модератор
Репутация: 821
Online
Пол: Награды:
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316
|
|
« Ответ #5 : Январь 13, 2020, 21:39:57 » |
|
Скидывайте свой полный код, всё должно работать. P.S. Да, нужно писать ">=", равно добавлял уже после написания остального.
|
|
|
Записан
|
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #6 : Январь 13, 2020, 21:48:40 » |
|
Все что смог придумать с переменой... только так музыка и объект воспроизводятся единично. Только вот теперь это идет в ущерб игровым очкам. Можно ли это как-нибудь исправить? scch=1
if (place_meeting(x,y, tea)) { score += 30; } if (score >= 100) { scch-=1 instance_create (2885, 2813, back_home); sound_play(lockout); } if cnn<=0 { score=99 }
P.S. Это весь код в степе который отвечает за очки. Другие коды там отвечают за перемещение гг, его глубину и еще здоровье. В создании вот что есть. health=100 globalvar
global.score=0 scii=0 // отвечает за количество патронов
|
|
|
Записан
|
|
|
|
AndrewVideoGames
Главный Модератор
Репутация: 821
Online
Пол: Награды:
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316
|
|
« Ответ #7 : Январь 13, 2020, 22:19:36 » |
|
На сколько помню, переменная score встроенная в GM, её нельзя объявлять таким образом, используя приставку "global.".
Код, который вы написали максимально странный, откуда переменная cnn? Почему score = 99? Что такое tea? Если объект, то ставьте префикс вроде o_tea / oTea. Что делает пустой globalvar? Почему переменная, отвечающая за количество патронов (странное название и что за патроны?) не используется в коде? Что за переменная scch? Почему каждый шаг она равняется единице? В жизни более странного кода не видел, произведение абстракционизма прям.
Какой результат получается при моём варианте? Сколько раз проигрывается звук и сколько раз создаётся объект (проверяется через instance_number(object)?
|
|
|
Записан
|
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #8 : Январь 13, 2020, 22:27:15 » |
|
Спасибо за помощь и за указания на ошибки. А то я сам не понимаю что там происходит. Это мой третий день просто с того момента как я учу и пытаюсь писать в gml. Я все это попробую исправлю и завтра отпишусь о. о том что вышло. Доброй ночи. Добавлено: Январь 14, 2020, 06:13:31 убрал значение global перед score(я прописывал global потому что количество очков сохранялось при переходе в другую комнату только в этом случае. Сейчас все заработало иначе. При старте пока очков 0 начинает выполняется та условная при которой должны создаваться те объекты. И создаются они без остановки до тех пор как очков не будет больше чем 100. После того как я набиру очков больше ста то звук замолкает. if (place_meeting(x,y, o_tea)) { score += 30; } if ((score <= 100) && (score - 30 < 100)) { instance_create (2885, 2813, o_backhome); sound_play(lockout); }
|
|
« Последнее редактирование: Январь 14, 2020, 06:14:35 от alexrainforce »
|
Записан
|
|
|
|
AndrewVideoGames
Главный Модератор
Репутация: 821
Online
Пол: Награды:
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316
|
|
« Ответ #9 : Январь 14, 2020, 15:40:57 » |
|
Это происходит, потому что вы написали "score <= 100" вместо "score >= 100".
|
|
|
Записан
|
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #10 : Январь 14, 2020, 17:06:58 » |
|
Спасибо, я попробую. Можете объяснить пожалуйста как именно работает данный скрипт? Какое его значение? Что он задает? ((score >= 100) && (score - 30 < 100))
|
|
|
Записан
|
|
|
|
SilentPhil
Norland
GM Pro user
Репутация: 479
Offline
Пол: Награды: ...
API: GameMaker Studio 2
Деятельность: GML, Pixel Art
Сообщений: 1363
|
|
« Ответ #11 : Январь 15, 2020, 09:12:37 » |
|
Вы же можете прочитать эти два выражения? Вслух. При чтении замените "&&" на "И", "if" на "ЕСЛИ", а "{" на "ТО" если (score >= 100) и (score - 30 < 100), то Для еще бОльшего понимания нужно упростить второе выражение до score < 130 Я просто перенес -30 на другую сторону сменив знак - простейшая математика. Итого получилось: если (score >= 100) и (score < 130), то Стало понятнее?
|
|
|
Записан
|
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #12 : Январь 15, 2020, 10:20:00 » |
|
Спасибо за разъяснения. Теперь все понял Добавлено: Январь 17, 2020, 08:06:26 Вот таким способом только получилось что бы все выполнялось как нужно if (place_meeting(x,y, o_tea))
{ t+=30; score += 1; }
if t>=100
{ instance_create (2885, 2813, o_backhome); sound_play (lockout); t=-100 }
Изначально была плохой идей выполнять какое-то действие при определенном количестве очков. Сейчас очки у меня отдельно засчитываются. А для того, что бы выполнилось действие, помогают переменные. На англоязычных форумах копался так и не нашел ответ о том, как выполнить действие один раз при определённом условии. Вариант с ()and() не помогает, возможно я что то не так сделал, хотя все перепроверял.
|
|
« Последнее редактирование: Январь 17, 2020, 08:06:26 от alexrainforce »
|
Записан
|
|
|
|
Dmi7ry
Гл. Администратор
Репутация: 1379
Offline
Пол: Награды:
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626
|
|
« Ответ #13 : Январь 17, 2020, 10:43:38 » |
|
Чтобы однократно выполнить действие, нужно завести переменную, которая будет содержать информацию о том, выполнялось ли это действие. create: action = false; // действие не выполнялось действие: if !action and ... { action = true; // действие выполнено ... } где вместо многоточия идут ваши проверки и код самого действия
|
|
|
Записан
|
- А какой, собственно, командой процессора колобок ест черта? - Командой EAT... | | Справка и FAQ в правом верхнем углу... | |
|
|
|
alexrainforce
Новичок
Репутация: 0
Offline
Пол:
API: GameMaker Studio 2
Сообщений: 11
|
|
« Ответ #14 : Январь 17, 2020, 11:07:25 » |
|
Спасибо за ответ. Я кстати тоже думал насчет true и false. Эксперементировал с этим. Видимо что-то не так тогда делал. Сейчас попробую как вы сказали.
|
|
|
Записан
|
|
|
|
|