HealthBar проблема.
#1


Добрый день, на одном из серверов sa-mp я увидел прекрасный индикатор HP, при попытке реализовать подобный у меня возникли ошибки из-за которых скрипт не правильно работает, старое количество HP остается под новым, то есть не удаляется, помогите пожалуйста.
#include <a_samp>

new Text:hpbar[MAX_PLAYERS];

public OnFilterScriptInit()
{
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
OnPlayerConnect(i);
}
}
return 1;
}

public OnFilterScriptExit()
{
for(new i; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
TextDrawDestroy(hpbar[i]);
}
}
return 1;
}
public OnPlayerConnect(playerid)
{
hpbar[playerid] = TextDrawCreate(558.000000,67.000000,"100 hp");
TextDrawAlignment(hpbar[playerid],0);
TextDrawBackgroundColor(hpbar[playerid],0x000000ff);
TextDrawFont(hpbar[playerid],1);
TextDrawLetterSize(hpbar[playerid],0.299999,0.799999);
TextDrawColor(hpbar[playerid],0xffffffff);
TextDrawSetOutline(hpbar[playerid],1);
TextDrawSetProportional(hpbar[playerid],1);
TextDrawSetShadow(hpbar[playerid],1);
return 1;
}

public OnPlayerDisconnect(playerid)
{
TextDrawDestroy(hpbar[playerid]);
return 1;
}

public OnPlayerDeath(playerid)
{
TextDrawHideForPlayer(playerid,hpbar[playerid]);
return 1;
}

public OnPlayerSpawn(playerid)
{
TextDrawSetString(hpbar[playerid],"100 hp");
TextDrawShowForPlayer(playerid,hpbar[playerid]);
return 1;
}
forward OnPlayerUpdate(playerid);
public OnPlayerUpdate(playerid)
{
new Float:hp;
new string[255];
GetPlayerHealth(playerid, hp);
format(string,255,"%.0f hp",hp);
TextDrawSetString(hpbar[playerid],string);
return 1;
}
Reply
#2

последние три строки должны выглядеть как вот эти 4:

Code:
 TextDrawSetString(hpbar[playerid],string);
 TextDrawShowForPlayer(playerid,hpbar[playerid]); // без этой строки TextDraw не перерисовывается, а наслаивается
 return 1;
}
Reply
#3

я с TextDraw'ами ещё только учусь работать, поетому у меня возник вопрос:

почему
Code:
hpbar[playerid] = TextDrawCreate(558.000000,67.000000,"100 hp");
находится в
Code:
public OnPlayerConnect(playerid)
а не в
Code:
public OnGameModeInit
это при коннекте игрока создаётся текст драв, потом ещё +1 игрок следовательно ещё +1 тестдрав,
а лимит то он не безграничный или как ?

объясните пожалуйста
Reply
#4

Quote:
Originally Posted by [Saint
]
....
объясните пожалуйста
Потому что на каждого игрока нужен свой текстдрав, ибо у всех разное количество хп и соответственно текст тоже должен быть у каждого свой.

А если у всех должно выглядеть одинаково, то обычно делают всего один и создают его лишь однажды (например, в OnGameModeInit).

.....
Quote:
Originally Posted by odyvan
public OnPlayerUpdate(playerid)
{
new Float:hp;
new string[255];
GetPlayerHealth(playerid, hp);
format(string,255,"%.0f hp",hp);
TextDrawSetString(hpbar[playerid],string);
return 1;
}
Можно поинтересоваться почему string такого большого размера? "nnn hp" - максимум 6 знаков + '\0', итого семь....
Reply
#5

а так чтобы TextDraw был в OnGameModeInit и у каждого отображалось своё никак нельзя?
Reply
#6

можно все, просто при входе выделяется память под надписи, а при выходе - освобождается, и серв не кушает много ОЗУ.

можно создать все надписи в начале режима, нет проблем, но их содержимое все равно обновлять нужно
Reply
#7

А большая ли нагрузка с таким кодом, если на сервере онлайн 100?
Reply
#8

при 100 игроках должны использоваться апсалютно все средства для оптимизации скрипта, думаю, это и без меня понятно. поэтому сервер будет перегружен с этим кодом. лучше ваще как можно меньше кода пихать в OnPlayerUpdate.
Reply
#9

Если будешь использовать в OnPlayerUpdate то будет сильная рассинхронизация. Лучше делать через таймер.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)