hi masterside, kann dir leider nur zu frage eins helfen, bei zwei müsste ich mich selbst erstmal tiefer in die materie reinhängen.
also folgendes: in dem tut das du da vor dir liegen hast wird einfach nur das standart HUD_AmmoHealthEnergySuit.gfx durch ein benutzerdefiniertes ersetzt. kombiniere die informationen aus dem tut und dem das ich dir bei crymod gezeigt habe, dann hast du fast schon die halbe miete zusammen.
edit: link für das tut bei crymod: http://www.crymod.com/thread.php?pos...758#post172758
nach dem du dein custom hud element (k-a wie ichs sonst nennen soll) mit deinen zwei neuen leisten gebastelt hast, benennst du in den actionscripts erstmal die funktionen in setAmmo & setRestAmmo um.
code könnte dann in etwa so aussehen (warnung: bin kein erfahrener flash user):
Code:
var m_ammo = 100;
setAmmo = function(_ammo)
{
var ammo = Math.floor((Math.max(_ammo,0)));
if(m_ammo!=ammo)
{
m_ammo = ammo;
// hab das symbol ammobar genannt:
ammobar.gotoAndStop(m_ammo);
}
}
var m_rammo = 100;
setRestAmmo = function(_rammo)
{
var rammo = Math.floor((Math.max(_rammo,0)));
if(m_rammo!=rammo)
{
m_rammo = rammo;
// das symbol für rest ammo heißt bei mir r_ammobar
r_ammobar.gotoAndStop(m_rammo);
}
}
zugegeben, du wirst noch einiges drann rum zu schrauben haben, da die leisten ja mit 100% arbeiten - du aber mit unterschiedlichen ammo zahlen arbeitest.
aber egal, weiter im text. wie in dem von mir geschickten tut mit dem hallo welt kannst du jetzt erstmal dein neues hud.h deklarieren und dann in der hud.cpp init() registrieren.
im anschluß gehst du einfach mal in die funktion (~line 5120):
Code:
void CHUD::UpdatePlayerAmmo()
und schreibst an den schluß sowas in der art:
Code:
m_animMyFirstHud.Invoke("setAmmo", m_playerAmmo);
m_animMyFirstHud.Invoke("setRestAmmo", m_playerRestAmmo);
---------------------------------------------------
... nach einem blick ins sdk...
---------------------------------------------------
hm, man könnte den aktuellen ammo bestand auf 100% ungefähr so umrechnet. (bei der restammo ist das nicht so das problem, da man die magazien größe über m_playerClipSize abfragen kann). das wäre dann wohl sowas in der art (3satz, mein mathe lehrer sagte mir seinerzeit das ich es für irgendetwas gebrauchen könnte *g*):
Code:
int test01 =(int) (m_playerClipSize / 100)*m_playerRestAmmo;
m_animMyFirstHud.Invoke("setRestAmmo", test01);
---------------------------------------------------
... nach einem weiteren blick ins sdk...
---------------------------------------------------
sooo, na gucken wir mal, ich denke für den ammo bar könnte man es so machen:
Code:
IItem * pItem = gEnv->pGame->GetIGameFramework()->GetClientActor()->GetCurrentItem();
if(CWeapon *pWeapon = static_cast<CWeapon*>(pItem->GetIWeapon()))
{
IFireMode *pFM = pWeapon->GetFireMode(pWeapon->GetCurrentFireMode());
int test02 = gEnv->pGame->GetIGameFramework()->GetClientActor()->GetInventory()->GetAmmoCapacity(pFM->GetAmmoType()));
test02 = (int) (test02 / 100)*m_playerAmmo;
m_animMyFirstHud.Invoke("setAmmo", test02);
}
letzteres geht im übrigen nur im spiel, im editor gibt es keine ammo restriction... und selbst wenn es eine gäbe müsstest du erst unter ammopickup.cpp / CheckAmmoRestrictions(...) die if(bEditor) abfrage rausnehmen... 
also vom c++ code her sollte alles stimmen, für den actionscript teil kann ich mich aber nit verbürgen. 
gruß Blue
--------------------------------------------------------------------------------------------------
Edit:
Hm, feedback obs geklappt hat wäre schon nicht schlecht gewesen, aber seis drumm, habs auspobiert und bei mir klappts. Der follständigkeit halber will/kann ich nun auch Frage 2 beantworten:
Wie im Tutorial mit dem custom Healthbar machen wir einfach wieder ein Symbol(nennen wirs mal mPicture) - hier legen wir 5 keyfreams an (aber keine weiteren Ebenen!).
Keyfream 1 bleibt leer!
In die Keyfreams 4-5 fügst du nun einfach die Grafik ein die du gerne angezeigt haben möchtest.
In ActionScript schreibst du nun folgendes rein:
Code:
setPic = function(_PicNr)
{
mPicture.gotoAndStop(_PicNr);
}
Ich bleib mal an der Stelle einfach bei der variable
m_animMyFirstHud aus dem HalloWelt Tutorial von Crymod.
Geh nun zur Funktion (~line: 1181)
Code:
void CHUD::ModeChanged(ENanoMode mode)
(auch in der HUD.cpp zu finden)
Dort erweiterst du nun die switch / case anweisung wie folgt:
Code:
switch(mode)
{
case NANOMODE_SPEED:
m_animMyFirstHud.Invoke("setPic", 2); //<<-- 1st Pic
m_animPlayerStats.Invoke("setMode", "Speed");
m_fSpeedTimer = gEnv->pTimer->GetFrameStartTime().GetMilliSeconds();
m_fSuitChangeSoundTimer = m_fSpeedTimer;
break;
case NANOMODE_STRENGTH:
m_animMyFirstHud.Invoke("setPic", 3); //<<-- 2th Pic
m_animPlayerStats.Invoke("setMode", "Strength");
m_fStrengthTimer = gEnv->pTimer->GetFrameStartTime().GetMilliSeconds();
m_fSuitChangeSoundTimer = m_fStrengthTimer;
break;
case NANOMODE_DEFENSE:
m_animMyFirstHud.Invoke("setPic", 4); //<<-- 3th Pic
m_animPlayerStats.Invoke("setMode", "Armor");
m_fDefenseTimer = gEnv->pTimer->GetFrameStartTime().GetMilliSeconds();
m_fSuitChangeSoundTimer = m_fDefenseTimer;
break;
case NANOMODE_CLOAK:
m_animMyFirstHud.Invoke("setPic", 5); //<<-- 4th Pic
m_animPlayerStats.Invoke("setMode", "Cloak");
PlaySound(ESound_PresetNavigationBeep);
if(m_pNanoSuit->GetSlotValue(NANOSLOT_ARMOR, true) != 50 || m_pNanoSuit->GetSlotValue(NANOSLOT_SPEED, true) != 50 ||
m_pNanoSuit->GetSlotValue(NANOSLOT_STRENGTH, true) != 50 || m_pNanoSuit->GetSlotValue(NANOSLOT_MEDICAL, true) != 50)
{
TextMessage("suit_modification_engaged");
}
m_fSuitChangeSoundTimer = gEnv->pTimer->GetFrameStartTime().GetMilliSeconds();
if (gEnv->pAISystem)
{
pData = gEnv->pAISystem->CreateSignalExtraData();//AI System will be the owner of this data
pData->iValue = NANOMODE_CLOAK;
pPlayer = static_cast<CPlayer *>(gEnv->pGame->GetIGameFramework()->GetClientActor());
if(pPlayer && pPlayer->GetEntity() && pPlayer->GetEntity()->GetAI())
gEnv->pAISystem->SendSignal(SIGNALFILTER_SENDER,1,"OnNanoSuitMode",pPlayer->GetEntity()->GetAI(),pData);
}
break;
default:
break;
}
Blue