Пятница, 22 Ноября 2024, 09:41

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Строковые числа с предварительным нулём
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:4


А ведь так хочется, чтобы было написано 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, доходчиво, ещё раз благодарю.

Создаю интерактивную повесть.
  • Страница 1 из 1
  • 1
Поиск:

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