HUD


Автор Сообщение

частый гость
Группа: Участники
Сообщений: 23
Добавлено: 12-04-2009 15:46
когда на экране должен исчезнуть объект Худа движок немного начинает тормозить... или вообще замирает на мгновенье а потом отмирает и объект Худа исчезает... но нельзя ли сделать так чтобы не было таких замираний? просто когда например на экране три значка жизни по количеству жизней в игре и один из них должен исчезнуть когда одна жизнь заканчивается начинается такое замирание... может я что-нибудь делал не так? я создавал в Create Events объекты худа и в Steps когда жизнь игрока заканчивалась просто прятал этот объект худа ObjectHide()...

частый гость
Группа: Участники
Сообщений: 23
Добавлено: 13-04-2009 08:43
прошу прощение за немного ошибочный вопрос в первом сообщении! =) замедление наступает не в момент исчезновения объекта, а наоборот в момент появления... то есть когда появляется на экране очередной значок жизни игрока... вы не подскажете как избавиться от таких моментных замедлений?

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 13-04-2009 13:39
Очень странно... У меня такого не наблюдается.
Во всяком случае, если делать через ObjectHide/ObjectShow, все должно работать нормально.
Приведи код, может проблема в чем-то другом.

Big Boss
Группа: Администраторы
Сообщений: 719
Добавлено: 13-04-2009 13:41
А у тебя эти объекты Худа создаются и работают в одном объекте GM?
Или на каждый значок - отдельный объект?

частый гость
Группа: Участники
Сообщений: 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)}


Вот код такой... не знаю почему возникают такие секундные торможения =( за весь Худ отвечает один объект ГМ...

кстати и еще хотел спросить... а вы не знаете как сделать эффект Хелз Бара? =) ну чтобы полоска здоровья сокращалась и расширялась под количеством здоровья? и еще один вопрос.. немножко не по теме... скажите а как сделать объекты в игре прозрачными и контролировать их прозрачность? =)

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.

частый гость
Группа: Участники
Сообщений: 23
Добавлено: 14-04-2009 17:55
а ясно, спасибо за совет! =)
а замена прозрачности в настройках материала не приведет к тому что все объекты с такой текстурой будут прозрачны? а нельзя сделать чтобы одинаковые объекты становились прозрачными не все сразу а кто когда должен... и как сделать пульсирующую прозрачность? то есть когда объект как сияние то прозрачный то нет и его уровень прозрачности снижается постепенно?

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), что и нужно для пульсирующей прозрачности.


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);}

частый гость
Группа: Участники
Сообщений: 23
Добавлено: 06-05-2009 17:42
Ясно! =) спасибо за пример кода!

 

Offtop.ru © 2003