Для игры Imprizoned понадобилось показывать название текущей карты на экране.
Тигроглаз рассказывает про способ через события вот тут:
rmxp.tigerseye.uk.com/tutorial_amap4.shtml
Но это же надо прописывать событие на каждой карте, и, более того - нужно наделать столько же картинок, сколько карт, различающихся только текстом - названием области!
Поэтому, как обычно, ковыряем скрипты, а именно - class Spriteset_Map
в метод initialize добавим нашу карту сразу после тумана:
# картинка карты
@map_pic = Plane.new(@viewport3)
#@map_pic.z = 3010 # выше тумана (3000)
Необходимые пояснения.
Я добавил картинку карты на третий viewport3, который используется для вывода самого ближнего к зрителю контента, например, тумана или вспышки. Можно не париться и выводить в первый, но тогда надо вписать @map_pic.z = 3010 чтобы картинка была выше остальных элементов карты. То же самое верно для любого другого вашего интерфейса. Так как выше написано @viewport3.z = 5000, то, очевидно, контент в нем будет ближе всех.
В методе dispose убиваем картинку:
Осталось отрисовать. Для этого в методе update сразу после работы с туманом (fog) пишем следующее:
#map
@map_pic.bitmap = Bitmap.new(640, 480) # фишка в том, что картинку - источник пришлось на весь экран делать, иначе она размножается, и это я не смог побороть
bitmap = RPG::Cache.picture("map") # тут сама картинка карты, она может быть мелкая - просто расположим её в нижней части @map_pic.bitmap, оставив остальное прозрачным
@map_pic.bitmap.blt(4, 448, bitmap, Rect.new(0, 0, 24, 24)) # рисуем иконку
@map_pic.bitmap.font.color = Color.new(255, 255, 255, 255)
@map_pic.bitmap.font.size = $fontsize_small
@map_pic.bitmap.draw_text(32, 448, 200, 24, $game_map.name, 0) # пишем текст - название текущей (как в xp написали) карты.
Вот, собственно и все. Запускаем, тестируем. bitmap = RPG::Cache.picture("map") означает, что в папке Pictures игры должна валяться картинка map.png.
Таким же образом можно выводить другие элементы интерфейса, которые изменяются динамически, например, морду героя и полоску жизни рядом с ней либо через
Bitmap::stretch_blt(dest_rect, src_bitmap, src_rect[, opacity])
- картинку (красный прямоугольник) растягиваем на высчитанный через hp/maxHp * maxWidth прямоугольник
Либо просто закрашивая прямоугольник вот так:
Bitmap::fill_rect(x, y, width, height, color)
Если кому-то будет нужно и непонятно, то могу сделать и выложить простенькую демку.
Вот как выглядит картинка в игре (кстати, гигантская тюрьма на скрине претерпела сильные изменения)