| 
	
		
		
			| Строковые числа с предварительным нулём |  |  |  | 
| MrSlap | Дата: Среда, 06 Мая 2015, 01:36 | Сообщение # 1 |  |   почетный гость Сейчас нет на сайте | Здравствуйте. Сабж до безобразия прост. 
 
 Код  draw_text(x,y,string(date_get_hour(date_current_datetime()))
 +':'+string(date_get_minute(date_current_datetime())));
 
 Если сейчас час дня и четыре минуты, текст отобразится, как
 
 
 А ведь так хочется, чтобы было написано 13:04
 Подскажите, как это реализовать. Вроде в голове вертится, мол - если число однозначное, то и ноль к нему пририсовывать, а иначе - не надо.
 Но что-то я не помню кода, считающего количество символов в строковой...
 
 Добавлено (06 мая 2015, 01:36)
 ---------------------------------------------
 А, всё, проблема решена вот таким образом
 
 
 Код x=date_get_hour(date_current_datetime()) y=date_get_minute(date_current_datetime())
 z=date_get_second(date_current_datetime())
 
 if x/10 < 1
 a='0'+string(x)
 else
 a=string(x)
 
 if y/10 < 1
 b='0'+string(y)
 else
 b=string(y)
 
 if z/10 < 1
 c='0'+string(z)
 else
 c=string(z)
 
 draw_text(x+100,y+100,
 a+':'
 +b+':'
 +c)
 Всё по простому, но от души.
 
 P.S. Если кто знает способ лучше или просто другой хороший способ, прошу привести его в пример. Для общего развития)
 
 Создаю интерактивную повесть.
 
 
 Сообщение отредактировал MrSlap - Среда, 06 Мая 2015, 01:37 |  |  |  |  |  | 
| FadeBaker | Дата: Среда, 06 Мая 2015, 02:01 | Сообщение # 2 |  | JavaSE Game Developer Сейчас нет на сайте | Вот так еще вроде можно сократить (без сторонних переменных a, b, c): 
 Код x = date_get_hour(date_current_datetime());  y = date_get_minute(date_current_datetime());
 z = date_get_second(date_current_datetime());
 if (x < 10) x = "0" + string(x);
 if (y < 10) y = "0" + string(y);
 if (z < 10) z = "0" + string(z);
 Уроки по GM
 Minecraft 2D на GM
 — Мои проекты —
 Blood Harvest [2D] — Original
 Blood Harvest [2D]: Remastered Edition
 Adventure Craft [2D] — Sandbox
 Space Shock [2D] — Scroll Shooter
 Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
 |  |  |  |  |  | 
| MrSlap | Дата: Среда, 06 Мая 2015, 02:37 | Сообщение # 3 |  |   почетный гость Сейчас нет на сайте | FadeBaker, а ну да, тоже самое, только без деления =) 
 Создаю интерактивную повесть.
 |  |  |  |  |  | 
| Tymonr | Дата: Среда, 06 Мая 2015, 03:58 | Сообщение # 4 |  |   With OpenSource forever♥ Сейчас нет на сайте | Используйте конструкцию 
 draw_text(x,y,string(date_get_hour(date_current_datetime()))
 + z < 10 ? ':0' : ':' +string(date_get_minute(date_current_datetime())));
 Выполняется проверка на z<10 и если оно верно, выводится :0, иначе просто :
 
 Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
 Как правильно задавать вопросы в технических форумах
 
 
 Сообщение отредактировал Tymonr - Среда, 06 Мая 2015, 04:02 |  |  |  |  |  | 
| YellowAfterlife | Дата: Среда, 06 Мая 2015, 10:10 | Сообщение # 5 |  |   Сейчас нет на сайте | Цитата Tymonr (  ) Используйте конструкцию 
 draw_text(x,y,string(date_get_hour(date_current_datetime()))
 + z < 10 ? ':0' : ':' +string(date_get_minute(date_current_datetime())));
 Выполняется проверка на z<10 и если оно верно, выводится :0, иначе просто :
 
В GameMaker [всё ещё] нет поддержки тернарного оператора (condition ? then_value : else_value).
 Но, в то же время, логические значения представляются аналогично C (1 и 0), что позволяет воспользоваться стандартной функцией string_repeat,
 string(current_hour) + ":" + string_repeat("0", current_minute < 10) + string(current_minute)
 
 
   |  |  |  |  |  | 
| PoidetLi | Дата: Среда, 06 Мая 2015, 10:31 | Сообщение # 6 |  |   участник Сейчас нет на сайте | Цитата YellowAfterlife (  ) Но, в то же время, логические значения представляются аналогично C (1 и 0),это ещё с времён доса, где
 define true 1
 define false !true
 
 в еюдуго прсхлуренц
 http://gcup.ru/forum/9-44187-1 мой Project 96
 |  |  |  |  |  | 
| MrSlap | Дата: Среда, 06 Мая 2015, 22:44 | Сообщение # 7 |  |   почетный гость Сейчас нет на сайте | YellowAfterlife, с этого места чуточку поподробнее, пожалуйста. Чем конкретно занимается string_repeat? =)
 
 Создаю интерактивную повесть.
 |  |  |  |  |  | 
| FadeBaker | Дата: Среда, 06 Мая 2015, 23:17 | Сообщение # 8 |  | JavaSE Game Developer Сейчас нет на сайте | Цитата MrSlap (  ) Чем конкретно занимается string_repeat?Возвращает строку, содержащую набор одинаковых символов заданной длины. Например, string_repeat("S", 5) вернет "SSSSS".
 
 Уроки по GM
 Minecraft 2D на GM
 — Мои проекты —
 Blood Harvest [2D] — Original
 Blood Harvest [2D]: Remastered Edition
 Adventure Craft [2D] — Sandbox
 Space Shock [2D] — Scroll Shooter
 Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
 |  |  |  |  |  | 
| MrSlap | Дата: Четверг, 07 Мая 2015, 00:01 | Сообщение # 9 |  |   почетный гость Сейчас нет на сайте | FadeBaker, ага, и цифра появляется слева, правильно? То есть в примере YellowAfterlife, string_repeat("0", current_minute < 10) - ноль будет рисоваться перед числом, если то меньше 10?
 
 И у меня есть обратный вопрос. А если я хочу сократить 2015 до 15? Ну, чтобы это был год в двузначном сокращении - тогда вообще всё красивенько получается =)
 
 Создаю интерактивную повесть.
 |  |  |  |  |  | 
| FadeBaker | Дата: Четверг, 07 Мая 2015, 00:06 | Сообщение # 10 |  | JavaSE Game Developer Сейчас нет на сайте | Цитата MrSlap (  ) и цифра появляется слева, правильно?Да, потому что конкатенация строк происходит в соответствующем порядке.
 
 Цитата MrSlap (  ) А если я хочу сократить 2015 до 15?Посмотри в справке раздел, где описывается работа со строками. Тебе нужно что-то вроде string_copy. Я точно не знаю, очень давно GM не пользовался.
 
 Уроки по GM
 Minecraft 2D на GM
 — Мои проекты —
 Blood Harvest [2D] — Original
 Blood Harvest [2D]: Remastered Edition
 Adventure Craft [2D] — Sandbox
 Space Shock [2D] — Scroll Shooter
 Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
 |  |  |  |  |  | 
| YellowAfterlife | Дата: Четверг, 07 Мая 2015, 00:07 | Сообщение # 11 |  |   Сейчас нет на сайте | Цитата MrSlap (  ) Чем конкретно занимается string_repeat? =) 
 Цитата FadeBaker (  ) Возвращает строку, содержащую набор одинаковых символов заданной длины. Например, string_repeat("S", 5) вернет "SSSSS". Если быть более точным, как пытается подсказать название функции, она возвращает указанную строку, повторенную указанное количество раз.
 show_message(string_repeat("[]", 4)) // "[][][][]"
 Если второй аргумент менее или равен нулю, функция вернет пустую строку.
 Условно говоря, функция работает как
 /// string_repeat(string, count)
 var r; r = "";
 repeat (argument1) r += argument0;
 return r;
 но быстрее из-за реализации в нативном коде.
 
 В качестве бонуса по теме: GameMaker 8.1 и ниже включают в себя недокументированное поведение, связанное с обработкой оператора умножения между числом и строкой,
 show_message("[]" * 4) // (ошибка)
 show_message(4 * "[]") // "[][][][]"
 В GameMaker: Studio это было убрано.
 Но, несмотря на странность и отсутствие совместимости, это позволяло сокращать некоторые фрагменты кода,
 string(current_hour) + ":" + (current_minute < 10) * "0" + string(current_minute)
 Или так (рисование текущего количества очков с 8ю цифрами):
 var s; s = string(score)
 draw_text(0, 0, (8 - string_length(s)) * "0" + s)
 
 Добавлено: про сокращение, можно сделать string_copy(str, string_length(str) - 1, 2) (1 + длина строки - нужная длина)
 
 
   
 
 Сообщение отредактировал YellowAfterlife - Четверг, 07 Мая 2015, 00:15 |  |  |  |  |  | 
| MrSlap | Дата: Четверг, 07 Мая 2015, 23:47 | Сообщение # 12 |  |   почетный гость Сейчас нет на сайте | YellowAfterlife, доходчиво, ещё раз благодарю. 
 Создаю интерактивную повесть.
 |  |  |  |  |  
 |