HealthBar проблема. -
odyvan - 20.12.2009

Добрый день, на одном из серверов 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;
}
Re: HealthBar проблема. -
MX_Master - 20.12.2009
последние три строки должны выглядеть как вот эти 4:
Code:
TextDrawSetString(hpbar[playerid],string);
TextDrawShowForPlayer(playerid,hpbar[playerid]); // без этой строки TextDraw не перерисовывается, а наслаивается
return 1;
}
Re: HealthBar проблема. -
[Saint] - 20.12.2009
я с TextDraw'ами ещё только учусь работать, поетому у меня возник вопрос:
почему
Code:
hpbar[playerid] = TextDrawCreate(558.000000,67.000000,"100 hp");
находится в
Code:
public OnPlayerConnect(playerid)
а не в
Code:
public OnGameModeInit
это при коннекте игрока создаётся текст драв, потом ещё +1 игрок следовательно ещё +1 тестдрав,
а лимит то он не безграничный или как ?
объясните пожалуйста
Re: HealthBar проблема. - Zeex - 20.12.2009
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', итого семь....
Re: HealthBar проблема. -
[Saint] - 20.12.2009
а так чтобы TextDraw был в OnGameModeInit и у каждого отображалось своё никак нельзя?
Re: HealthBar проблема. -
MX_Master - 21.12.2009
можно все, просто при входе выделяется память под надписи, а при выходе - освобождается, и серв не кушает много ОЗУ.
можно создать все надписи в начале режима, нет проблем, но их содержимое все равно обновлять нужно
Re: HealthBar проблема. -
Baks - 09.01.2010
А большая ли нагрузка с таким кодом, если на сервере онлайн 100?
Re: HealthBar проблема. -
MX_Master - 10.01.2010
при 100 игроках должны использоваться апсалютно все средства для оптимизации скрипта, думаю, это и без меня понятно. поэтому сервер будет перегружен с этим кодом. лучше ваще как можно меньше кода пихать в OnPlayerUpdate.
Re: HealthBar проблема. -
crone - 19.02.2010
Если будешь использовать в OnPlayerUpdate то будет сильная рассинхронизация. Лучше делать через таймер.