- Сообщений: 1274
- Спасибо получено: 1307
Картинки для интерфейса на карте (XP)
13 года 2 мес. назад #58902
от caveman
caveman создал тему: Картинки для интерфейса на карте (XP)
Для игры Imprizoned понадобилось показывать название текущей карты на экране.
Тигроглаз рассказывает про способ через события вот тут:
rmxp.tigerseye.uk.com/tutorial_amap4.shtml
Но это же надо прописывать событие на каждой карте, и, более того - нужно наделать столько же картинок, сколько карт, различающихся только текстом - названием области!
Поэтому, как обычно, ковыряем скрипты, а именно - class Spriteset_Map
в метод initialize добавим нашу карту сразу после тумана:
Необходимые пояснения.
Я добавил картинку карты на третий viewport3, который используется для вывода самого ближнего к зрителю контента, например, тумана или вспышки. Можно не париться и выводить в первый, но тогда надо вписать @map_pic.z = 3010 чтобы картинка была выше остальных элементов карты. То же самое верно для любого другого вашего интерфейса. Так как выше написано @viewport3.z = 5000, то, очевидно, контент в нем будет ближе всех.
В методе dispose убиваем картинку:
Осталось отрисовать. Для этого в методе update сразу после работы с туманом (fog) пишем следующее:
Вот, собственно и все. Запускаем, тестируем. bitmap = RPG::Cache.picture("map") означает, что в папке Pictures игры должна валяться картинка map.png.
Таким же образом можно выводить другие элементы интерфейса, которые изменяются динамически, например, морду героя и полоску жизни рядом с ней либо через
- картинку (красный прямоугольник) растягиваем на высчитанный через hp/maxHp * maxWidth прямоугольник
Либо просто закрашивая прямоугольник вот так:
Если кому-то будет нужно и непонятно, то могу сделать и выложить простенькую демку.
Вот как выглядит картинка в игре (кстати, гигантская тюрьма на скрине претерпела сильные изменения)
Тигроглаз рассказывает про способ через события вот тут:
rmxp.tigerseye.uk.com/tutorial_amap4.shtml
Но это же надо прописывать событие на каждой карте, и, более того - нужно наделать столько же картинок, сколько карт, различающихся только текстом - названием области!
Поэтому, как обычно, ковыряем скрипты, а именно - class Spriteset_Map
в метод initialize добавим нашу карту сразу после тумана:
Code:
# картинка карты
@map_pic = Plane.new(@viewport3)
#@map_pic.z = 3010 # выше тумана (3000)
Необходимые пояснения.
Я добавил картинку карты на третий viewport3, который используется для вывода самого ближнего к зрителю контента, например, тумана или вспышки. Можно не париться и выводить в первый, но тогда надо вписать @map_pic.z = 3010 чтобы картинка была выше остальных элементов карты. То же самое верно для любого другого вашего интерфейса. Так как выше написано @viewport3.z = 5000, то, очевидно, контент в нем будет ближе всех.
В методе dispose убиваем картинку:
Code:
@map_pic.dispose
Осталось отрисовать. Для этого в методе update сразу после работы с туманом (fog) пишем следующее:
Code:
#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.
Таким же образом можно выводить другие элементы интерфейса, которые изменяются динамически, например, морду героя и полоску жизни рядом с ней либо через
Code:
Bitmap::stretch_blt(dest_rect, src_bitmap, src_rect[, opacity])
Либо просто закрашивая прямоугольник вот так:
Code:
Bitmap::fill_rect(x, y, width, height, color)
Если кому-то будет нужно и непонятно, то могу сделать и выложить простенькую демку.
Вот как выглядит картинка в игре (кстати, гигантская тюрьма на скрине претерпела сильные изменения)
Спасибо сказали: Irich5
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
13 года 2 мес. назад #58903
от DeadElf79
DeadElf79 ответил в теме Картинки для интерфейса на карте (XP)
Мило, но мелко. К тому же, не знаю... Я привык, что все скриптеры мне дают такое окошко сверху слева, а не снизу)) Вот как возьму и заблужусь и ничего ты со мной не сделаешь 
А это та самая карта с охранником, но перестроенная?
А это та самая карта с охранником, но перестроенная?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
13 года 2 мес. назад #58905
от caveman
caveman ответил в теме Картинки для интерфейса на карте (XP)
Сверху слева еще проще - вычислять координаты не надо.
Если почитать этот "урок" - то ясно, что хоть куда засунуть можно, и шрифт со цветом тоже настраивается влегкую (коммент к коду про шрифт не написал, но там из кода вроде ясненько).
А положение было такое у Тигроглаза, не стал трогать, тем более, что на моих картах, если комнатка маленькая, то обычно снизу остается темное пустое место, где заметна подпись.
Да, это карта с охранником, он переехал поближе к камерам. И (sic!) - до меня недавно дошло, что полочкам (слева) полагается висеть на стене!
Сейчас мучаю, как говорит Анн, показывать, что происходит, а не описывать - то бишь некоторые миникатсценки; а из карт перепилил пока только семь, и то не до конца.
Если почитать этот "урок" - то ясно, что хоть куда засунуть можно, и шрифт со цветом тоже настраивается влегкую (коммент к коду про шрифт не написал, но там из кода вроде ясненько).
А положение было такое у Тигроглаза, не стал трогать, тем более, что на моих картах, если комнатка маленькая, то обычно снизу остается темное пустое место, где заметна подпись.
Да, это карта с охранником, он переехал поближе к камерам. И (sic!) - до меня недавно дошло, что полочкам (слева) полагается висеть на стене!
Сейчас мучаю, как говорит Анн, показывать, что происходит, а не описывать - то бишь некоторые миникатсценки; а из карт перепилил пока только семь, и то не до конца.
Спасибо сказали: DeadElf79
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
13 года 2 мес. назад #58911
от caveman
caveman ответил в теме Картинки для интерфейса на карте (XP)
Сделал таки проектик, лежит вот здесь:
rusfolder.com/35073334
Показал, как пример, что на одну картинку можно поместить кучу деталей интерфейса (кроме карты, подвесил еще морду Алекса и его бар с хп, рисуемый программно - чтоб потестить программность, встаньте на шипы).
Для удобства чтения сами методы отрисовки вынес в отдельный файл класса, естественно, инициализация и удаление
плоскостей int_pic и msg_pic остались в старом файле.
На отдельной плоскости msg_pic я рисую профиль героя в диалоге выше окна диалога (кто-то недавно спрашивал про подобное). Для этого я завел в Game_Temp переменную с названием текущего профиля @curr_msg_face и в событии разговора просто присваиваю ей название файла в Pictures и снимаю его:
$game_temp.curr_msg_face = 'alex'
... blah-blah-blah
$game_temp.curr_msg_face = ''
Может проект и этот псевдоурок и не пригодится, зато кому-то станет понятно, как пользовать разные картинки для постоянной отрисовки интерфейса.
ЗЫ: картинка из тестового проектика
rusfolder.com/35073334
Показал, как пример, что на одну картинку можно поместить кучу деталей интерфейса (кроме карты, подвесил еще морду Алекса и его бар с хп, рисуемый программно - чтоб потестить программность, встаньте на шипы).
Для удобства чтения сами методы отрисовки вынес в отдельный файл класса, естественно, инициализация и удаление
плоскостей int_pic и msg_pic остались в старом файле.
На отдельной плоскости msg_pic я рисую профиль героя в диалоге выше окна диалога (кто-то недавно спрашивал про подобное). Для этого я завел в Game_Temp переменную с названием текущего профиля @curr_msg_face и в событии разговора просто присваиваю ей название файла в Pictures и снимаю его:
$game_temp.curr_msg_face = 'alex'
... blah-blah-blah
$game_temp.curr_msg_face = ''
ВНИМАНИЕ: Спойлер!
Code:
class Spriteset_Map
def show_interface
@int_pic.bitmap = Bitmap.new(640, 480)
# рисуем карту и подпись слева внизу
map = RPG::Cache.picture("map")
@int_pic.bitmap.blt(4, 448, map, Rect.new(0, 0, 24, 24))
@int_pic.bitmap.font.color = Color.new(255, 255, 255, 255)
@int_pic.bitmap.font.size = $int_fontsize
@int_pic.bitmap.draw_text(32, 448, 200, 24, $game_map.name, 0)
# рисуем морду героя и его имя
face = RPG::Cache.picture("0001")
@int_pic.bitmap.blt(4, 4, face, Rect.new(0, 0, face.width, face.height))
@int_pic.bitmap.font.size = 24
@int_pic.bitmap.font.color = Color.new(0, 19, 127, 255)
@int_pic.bitmap.draw_text(108, 4, 200, 24, 'Алекс', 0)
# подпись "ХП"
@int_pic.bitmap.font.color = Color.new(255, 255, 255, 255)
@int_pic.bitmap.draw_text(108, 32, 200, 24, 'ХП:', 0)
# тут вычисляем по количеству оставшихся hp длину полоски бара
maxhp = $game_party.actors[0].maxhp
hp = $game_party.actors[0].hp
coef = 100 * hp / maxhp # 100 - длина хелсбара
# рисуем хелсбар
bar = RPG::Cache.picture("healthbar")
@int_pic.bitmap.fill_rect(142, 36, coef, 16, Color.new(255, 0, 0, 255)) # сначала полоску
@int_pic.bitmap.blt(142, 36, bar, Rect.new(0, 0, bar.width, bar.height)) # потом ограничивающую рамку
end
def show_hero_message
if $game_temp.curr_msg_face != nil
@msg_pic.bitmap = Bitmap.new(640, 480)
face = RPG::Cache.picture($game_temp.curr_msg_face)
@int_pic.bitmap.blt(80, 176, face, Rect.new(0, 0, face.width, face.height))
end
end
end
Может проект и этот псевдоурок и не пригодится, зато кому-то станет понятно, как пользовать разные картинки для постоянной отрисовки интерфейса.
ЗЫ: картинка из тестового проектика
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Время создания страницы: 0.104 секунд
