Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
29.09.2007, 11:25
RikkuZooo



Wir erstellen ein Doom 1-2 ehnliches hud face:

so als erstes suchen wir in der datei: health.cpp nach
Quellcode:DECLARE_MESSAGE(m_Health, Damage ) wir schreiben nun darunter:
Quellcode:DECLARE_MESSAGE(m_Health, Anime) so jetzt suchen wir weiter nach:
Quellcode:#define DAMAGE_NAME "sprites/%d_dmg.spr" wir schreiben nun darunter:
Quellcode:#define ANIME1_NAME "sprites/colette01.spr"
#define ANIME2_NAME "sprites/colette02.spr"
#define ANIME3_NAME "sprites/colette03.spr"
damit später bein schaden sich auch die bilder andern
so jetzt gehen wir zu:
Quellcode:int CHudHealth::VidInit(void) ersetzt denn code einfach hiermit:
Quellcode:int CHudHealth::VidInit(void)
{
    m_hSprite = 0;
    m_hSpriteAnime = 0;

    m_HUD_dmg_bio = gHUD.GetSpriteIndex( "dmg_bio" ) + 1;
    m_HUD_cross = gHUD.GetSpriteIndex( "cross" );

    giDmgHeight = gHUD.GetSpriteRect(m_HUD_dmg_bio).right - gHUD.GetSpriteRect(m_HUD_dmg_bio).left;
    giDmgWidth = gHUD.GetSpriteRect(m_HUD_dmg_bio).bottom - gHUD.GetSpriteRect(m_HUD_dmg_bio).top;
    return 1;
}
unter:
Quellcode:int CHudHealth:: MsgFunc_Damage(const char *pszName,  int iSize, void *pbuf ) schreiben wir das:
Quellcode:int CHudHealth::MsgFunc_Anime(const char *pszName,  int iSize, void *pbuf )
{
    BEGIN_READ( pbuf, iSize );

    m_iFlags |= HUD_ACTIVE;

    return 1;
}
nun ersetzten wir die:
Quellcode:int CHudHealth::Draw(float flTime) durch denn code hier:
Quellcode:int CHudHealth::Draw(float flTime)
{
    int r, g, b;
    int a = 0, x, y;
    int HealthWidth;

    if ( (gHUD.m_iHideHUDDisplay & HIDEHUD_HEALTH) || gEngfuncs.IsSpectateOnly() )
        return 1;

    if ( (gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL )) )
        return 1;

    if ( !m_hSprite )
        m_hSprite = LoadSprite(PAIN_NAME);

    // Has health changed? Flash the health #
    if (m_fFade)
    {
        m_fFade -= (gHUD.m_flTimeDelta * 20);
        if (m_fFade <= 0)
        {
            a = MIN_ALPHA;
            m_fFade = 0;
        }

        // Fade the health number back to dim

        a = MIN_ALPHA +  (m_fFade/FADE_TIME) * 128;

    }
    else
        a = MIN_ALPHA;

    // If health is getting low, make it bright red
    if (m_iHealth <= 15)
        a = 200;
        
    GetPainColor( r, g, b );
    ScaleColors(r, g, b, a );

//    UnpackRGB(r, g, b, RGB_YELLOWISH);

    if ( !m_hSpriteAnime )
    {
        m_hSpriteAnime = LoadSprite(ANIME1_NAME);

        Anime_width = SPR_Width(m_hSpriteAnime, 0)*2.25;
        Anime_height = SPR_Height(m_hSpriteAnime, 0)*10;
    }

    // Only draw health if we have the suit.
    if (gHUD.m_iWeaponBits & (1<<(WEAPON_SUIT)))
    {
        HealthWidth = gHUD.GetSpriteRect(gHUD.m_HUD_number_0).right - gHUD.GetSpriteRect(gHUD.m_HUD_number_0).left;
        int CrossWidth = gHUD.GetSpriteRect(m_HUD_cross).right - gHUD.GetSpriteRect(m_HUD_cross).left;

        y = ScreenHeight - gHUD.m_iFontHeight - gHUD.m_iFontHeight / 2;
        x = CrossWidth /2;

        SPR_Set(gHUD.GetSprite(m_HUD_cross), r, g, b);
        SPR_DrawAdditive(0, x, y, &gHUD.GetSpriteRect(m_HUD_cross));

        x = CrossWidth + HealthWidth / 2;

        x = gHUD.DrawHudNumber(x, y, DHN_3DIGITS | DHN_DRAWZERO, m_iHealth, r, g, b);

        x += HealthWidth/2;

        int iHeight = gHUD.m_iFontHeight;
        int iWidth = HealthWidth/10;
        FillRGBA(x, y, iWidth, iHeight, 0, 200, 50, a);

        if (m_iHealth <= 100)
            m_hSpriteAnime = LoadSprite(ANIME1_NAME);
        if (m_iHealth <= 55)
            m_hSpriteAnime = LoadSprite(ANIME2_NAME);
        if (m_iHealth <= 15)
            m_hSpriteAnime = LoadSprite(ANIME3_NAME);

        SPR_Set(m_hSpriteAnime, r, g, b);

        x = ScreenWidth - Anime_width - Anime_width;
        y = Anime_height / 2;

        SPR_DrawAdditive(a, x, y, NULL);
    }

    DrawDamage(flTime);
    return DrawPain(flTime);
}
so jetzt öffnen wir die: health.h dort überschreiben wir die klasse:
Quellcode:class CHudHealth: public CHudBase und überschreiben es hiermit:
Quellcode:class CHudHealth: public CHudBase
{
public:
    virtual int Init( void );
    virtual int VidInit( void );
    virtual int Draw(float fTime);
    virtual void Reset( void );
    int MsgFunc_Health(const char *pszName,  int iSize, void *pbuf);
    int MsgFunc_Damage(const char *pszName,  int iSize, void *pbuf);
    int MsgFunc_Anime(const char *pszName,  int iSize, void *pbuf);
    int m_iHealth;
    int m_HUD_dmg_bio;
    int m_HUD_cross;
    float m_fAttackFront, m_fAttackRear, m_fAttackLeft, m_fAttackRight;
    void GetPainColor( int &r, int &g, int &b );
    float m_fFade;

private:
    HSPRITE m_hSprite;
    HSPRITE m_hDamage;
    HSPRITE m_hSpriteAnime;
    DAMAGE_IMAGE m_dmg[NUM_DMG_TYPES];
    int    m_bitsDamage;
    int Anime_height, Anime_width;
    int DrawPain(float fTime);
    int DrawDamage(float fTime);
    void CalcDamageDirection(vec3_t vecFrom);
    void UpdateTiles(float fTime, long bits);
};
denke mal solte alles gehen wenn nicht schauts euch hier an:
Download Source

--

AirChina Mobile


Dieser Beitrag wurde am 29.09.2007 um 14:28 von RikkuZooo bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
29.09.2007, 16:10
CPoly



Vieleicht könntest du für Leute wie mich, die weder doom 1 noch 2 gespielt haben, kurz erläutern was das besondere an diesem hud ist, also was es kann.

--

zum Seitenanfang zum Seitenende Profil || Suche
002
29.09.2007, 16:19
RikkuZooo



hier siehst du in der mitte das gesicht so hab ich das auch für hl gemacht
je nach schaden andert sich das gesicht so kann man es bei 100% in guten
zustand lassen und bei unter 20% zb. in schlechten zustand villeicht noch
etwas blut und wunden in gesicht.

--

AirChina Mobile

zum Seitenanfang zum Seitenende Profil || Suche
003
06.10.2007, 12:51
Exec



du hättest die 3 verschiedenen stufen auch in ein sprite packen können und dann hättest du jeweils das entsprechende frame anzeigen lassen. das is vorallem dann praktisch, wenn man ne menge sprites verwendet. der übersichtlichkeit halber. geht natürlich nicht mehr so gut, wenn man wie in doom das (oder den?) sprite noch animiert hat (augen).

--

"selbermachen rockt am meisten :D" - -LeJean-

zum Seitenanfang zum Seitenende Profil || Suche
004
06.10.2007, 12:59
ScyTheMan
Moderator


Ist doch auch kein Problem. Dann nimmst du die Zeile für die Animation, und die Spalte für den Zustand.

--

http://choerbaert.org
Ein Gespenst geht um im Netz - das Gespenst des Open Source
csndr

zum Seitenanfang zum Seitenende Profil || Suche
005
06.10.2007, 13:21
Exec



sowas gibts?
bin da nichmehr so dabei, bei hl1.

--

"selbermachen rockt am meisten :D" - -LeJean-

zum Seitenanfang zum Seitenende Profil || Suche
006
06.10.2007, 13:51
Bluthund



Jo sollte funktionieren.
Was fehlt (zumindest seh ich davon nix im Code), dass das HUD-Element auch die DOOM-typische Damage-Animation hat. Dh wenn man getroffen wird blickt das Gesicht nach rechts/links (je nach Trefferbereich). War ja in HL schon mithilfe der roten Sprites in der Mitte des Bildschirms implementiert.
Animation wäre natürlich noch ne feine Sache. Es geht nichts über ständiges Umherblicken des Alter Ego und ein Grinsen über beide Ohren wenn man die "Dicke Berta" einsammelt :))

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche
007
15.10.2007, 22:09
RikkuZooo



natürlich andert sich das gesicht je nach schaden steht ja auch da in code:

if (m_iHealth <= 100)
m_hSpriteAnime = LoadSprite(ANIME1_NAME);
if (m_iHealth <= 55)
m_hSpriteAnime = LoadSprite(ANIME2_NAME);
if (m_iHealth <= 15)
m_hSpriteAnime = LoadSprite(ANIME3_NAME);

--

AirChina Mobile

zum Seitenanfang zum Seitenende Profil || Suche
008
16.10.2007, 01:48
Bluthund



Die Zeilen hab ich schon gesehen und sie tun genau das, was in meinem Post nicht beschrieben war. Siehe oben

--

The C language combines all the power of assembly language with all the ease-of-use of assembly language.
"humorig is n blödwort :>" by -CarniGGeLjumpR-

zum Seitenanfang zum Seitenende Profil || Suche