|
[ На главную ] -- [ Список участников ] -- [ Правила форума ] -- [ Зарегистрироваться ] |
On-line: |
Форум движка Xtreme3D / Xtreme3D: вопросы и ответы / HUD |
Страницы: 1 |
Автор | Сообщение | |
Cyb частый гость Группа: Участники Сообщений: 23 |
Добавлено: 12-04-2009 15:46 | |
когда на экране должен исчезнуть объект Худа движок немного начинает тормозить... или вообще замирает на мгновенье а потом отмирает и объект Худа исчезает... но нельзя ли сделать так чтобы не было таких замираний? просто когда например на экране три значка жизни по количеству жизней в игре и один из них должен исчезнуть когда одна жизнь заканчивается начинается такое замирание... может я что-нибудь делал не так? я создавал в Create Events объекты худа и в Steps когда жизнь игрока заканчивалась просто прятал этот объект худа ObjectHide()... | ||
Cyb частый гость Группа: Участники Сообщений: 23 |
Добавлено: 13-04-2009 08:43 | |
прошу прощение за немного ошибочный вопрос в первом сообщении! =) замедление наступает не в момент исчезновения объекта, а наоборот в момент появления... то есть когда появляется на экране очередной значок жизни игрока... вы не подскажете как избавиться от таких моментных замедлений? | ||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 13-04-2009 13:39 | |
Очень странно... У меня такого не наблюдается. Во всяком случае, если делать через ObjectHide/ObjectShow, все должно работать нормально. Приведи код, может проблема в чем-то другом. |
||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 13-04-2009 13:41 | |
А у тебя эти объекты Худа создаются и работают в одном объекте GM? Или на каждый значок - отдельный объект? |
||
Cyb частый гость Группа: Участники Сообщений: 23 |
Добавлено: 14-04-2009 08:44 | |
Create Events ------------------------------------------- life_5=HUDSpriteCreate('life_5',400,300,global.hud) ObjectSetPosition(life_5,200,100,0) ObjectHide(life_5) life_4=HUDSpriteCreate('life_4',400,300,global.hud) ObjectSetPosition(life_4,200,100,0) ObjectHide(life_4) life_3=HUDSpriteCreate('life_3',400,300,global.hud) ObjectSetPosition(life_3,200,100,0) ObjectHide(life_3) life_2=HUDSpriteCreate('life_2',400,300,global.hud) ObjectSetPosition(life_2,200,100,0) ObjectHide(life_2) life_1=HUDSpriteCreate('life_1',400,300,global.hud) ObjectSetPosition(life_1,200,100,0) ObjectHide(life_1) Step Events ------------------------------------------------ f(global.life=5){ObjectShow(life_5)}else{ObjectHide(life_5)} if(global.life=4){ObjectShow(life_4)}else{ObjectHide(life_4)} if(global.life=3){ObjectShow(life_3)}else{ObjectHide(life_3)} if(global.life=2){ObjectShow(life_2)}else{ObjectHide(life_2)} if(global.life=1){ObjectShow(life_1)}else{ObjectHide(life_1)} Вот код такой... не знаю почему возникают такие секундные торможения =( за весь Худ отвечает один объект ГМ... кстати и еще хотел спросить... а вы не знаете как сделать эффект Хелз Бара? =) ну чтобы полоска здоровья сокращалась и расширялась под количеством здоровья? и еще один вопрос.. немножко не по теме... скажите а как сделать объекты в игре прозрачными и контролировать их прозрачность? =) |
||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 14-04-2009 17:31 | |
По-моему, тут дело в излишней загруженности. Спрайты 400х300, да еще каждому свой материал... Предлагаю лучше сделать так: В качестве спрайта жизни - материал 32х32 (загружается только один раз). В Create: MaterialCreate('mLife','sprite_life.png'); //материал значка жизней MaterialSetOptions('mLife',1,1); max_life=5; //максимальное кол-во жизней global.life=max_life; //начальное кол-во жизней posx=0; // posy=0; //позиция на экране spr_width=32; // spr_height=32; //размер спрайта //создаем пять спрайтов (по макс. кол-ву жизней) и помещаем их в массив: for (i=1; i<max_life+1; i+=1) { sprite[i]=HUDSpriteCreate('mLife',spr_width,spr_height,global.hud); ObjectSetPosition(sprite[i],posx+i*spr_width-spr_width/2,posy+(spr_height/2),0); } В Step: //Перебираем спрайты в массиве и сравниваем их индексы с количеством жизней. Если жизней //больше, спрайт прячется. for (i=1; i<max_life+1; i+=1) { if i>global.life ObjectHide(sprite[i]); else ObjectShow(sprite[i]); } У меня это работает без тормозов. Хелхбар сейчас покажу, у меня уже где-то была готовая реализация. А прозрачность материалам делается или через альфа-канал (в форматах типа png, tga) или через цвет. Сначала надо включить прозрачность функцией MaterialSetBlendingMode('material',bmTransparency); В случае с альфа-каналом надо дополнительно указать: MaterialSetTextureImageAlpha('material',tiaDefault); В случае с цветом: MaterialSetDiffuseColor('material',c_white,alpha); где alpha - прозрачность от 0 до 1. |
||
Cyb частый гость Группа: Участники Сообщений: 23 |
Добавлено: 14-04-2009 17:55 | |
а ясно, спасибо за совет! =) а замена прозрачности в настройках материала не приведет к тому что все объекты с такой текстурой будут прозрачны? а нельзя сделать чтобы одинаковые объекты становились прозрачными не все сразу а кто когда должен... и как сделать пульсирующую прозрачность? то есть когда объект как сияние то прозрачный то нет и его уровень прозрачности снижается постепенно? |
||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 14-04-2009 18:41 | |
Приведет. Так что придется каждому создавать свой материал.
Можно занести альфу в переменную и сделать так: arg+=0.01; if arg>360 arg-=360; alpha=0.5+cos(arg)/2; Косинус увеличивающегося значения arg будет давать зигзагообразный график (результат от -1 до 1), немного подкорректировав который, мы получим плавное изменение результата (от 0 до 1), что и нужно для пульсирующей прозрачности. |
||
Gecko Big Boss Группа: Администраторы Сообщений: 719 |
Добавлено: 14-04-2009 18:48 | |
А вот простейший, но полностью рабочий горизонтальный хелзбар: Нужно будет изображение 1х1 пиксель, нужного цвета. Хелзбар будет в виде простой прямоугольной полоски (200x32). В Create: MaterialCreate('mBar','pixel.png',0); //материал 1х1 MaterialSetOptions('mBar',1,1); health=100; //начальный уровень здоровья hbar_maxwidth=200; //максимальная длина шкалы hbar_height=32; //высота шкалы hbar_posx=200; // hbar_posy=0; //позиция на экране //создаем спрайт хелзбара: healthbar=HUDSpriteCreate('mBar',hbar_maxwidth,hbar_height,global.front); ObjectSetPosition(healthbar,hbar_posx+hbar_maxwidth/2,hbar_posy+hbar_height/2,0); В Step: //Изменяем длину и позицию спрайта в зависимости от здоровья: hbar_width=(hbar_maxwidth/100)*health; ObjectSetPosition(healthbar,hbar_posx+hbar_width/2,hbar_posy+hbar_height/2,0); Теперь, если надо уменьшить здоровье: change_value=2; //значение, на которое надо уменьшить if health>0 {health-=change_value; SpriteScale(healthbar,-(hbar_maxwidth/100)*change_value,0);} Или увеличить: change_value=2; //значение, на которое надо увеличить if health>0 {health+=change_value; SpriteScale(healthbar,(hbar_maxwidth/100)*change_value,0);} |
||
Cyb частый гость Группа: Участники Сообщений: 23 |
Добавлено: 06-05-2009 17:42 | |
Ясно! =) спасибо за пример кода! |
Страницы: 1 |
Форум движка Xtreme3D / Xtreme3D: вопросы и ответы / HUD |