.| Autor | Beitrag |
|---|---|
|
000 26.07.2000, 14:51 Renegade |
Hallo Leute, ich hätte da gerne ein Problem: Kann mir einer sagen, wie man einen Fortschrittsbalken coden kann? Ziel ist es, eine Funktion (im Prinzip einen einfachen Button) erst dann zu aktivieren, wenn der Fortschrittsbalken bei 100% ist. Die Geschwindigkeit die der Balken voranschreitet, soll von dem Eigenschaftswert eines Spielers abhängen. Das ganze soll in etwa so aussehen wie in RogueSpear, wenn man z.B. eine Ladung an einer Tür montiert. Vielen Dank für die Mühe, die ich Euch gemacht hab. -- |
|
Profil || Suche |
|
001 27.07.2000, 02:35 Prefect |
Also.. als erstes kopierst du ein _einfaches_ bereits existierendes HUD-Element (z.B. CHudBattery oder CHudTrain). Die Dinge die zu kopieren sind: Dann löschst du aus deinem neuen HUD-Element _alles_ aus VidInit() raus (außer dem return 1;), und _alles_ aus Draw() (wieder außer dem return). Die neue Message soll einfach ein Byte entgegen nehmen (die Geschwindigkeit in Prozent pro Sekunde). Du löscht dazu den Hauptteil der Funktion (nach BEGIN_READ bis vor return) und programmierst ihn so um, dass Ok. Jetzt kommt die Draw()-Funktion. Der erste Teil der Draw()-Funktion setzt die m_flPercentage hoch: Der Drawingteil besteht dann prinzipiell aus Dann hast du die RGB-Werte. Der Rest ist dann (je nachdem wie der Balken aussehen soll) eine Ansammlung von mehreren FillRGBAs(). Nachdem ich den Rest sooo ausführlich erklärt habe, darfst du dir das selber überlegen (Um Fragen vorzubeugen: Wußtest du, das man die Aufrufkonventionen für FillRGBA() in den Headern nachschauen kann?). Jetzt kommt die Serverseite. Zunächst einmal mußt du am Anfang von player.cpp eine neue int gmsgMsgName = 0; einfügen (das sollte ziemlich selbsterklärlich sein, die gibt's massenhaft). Dann suchst du nach LinkUserMessages() und fügst da (ebenfalls sehr offensichtlich) eine eigene Anweisung ein: Dann mußt du nur noch an den Stellen, an denen der Balken ausgelöst werden soll, Code in der Art einfügen: [rantmode] Achja, um noch einer potentiellen dummen Frage vorzubeugen: Wenn dieser Code nicht in player.cpp steht, ist gmsgMsgName natürlich nicht definiert. Du mußt es deshalb irgendwo über diesem Code global (d.h. außerhalb einer Funktionsdefinition, am Bestem am Anfang der Datei) importieren mit: extern gmsgMsgName; PS TheVoice: Ist es dass, was du mit schlecht gelaunt meinst? *g* cu, Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
002 27.07.2000, 09:58 Renegade |
Hey hey hey, hab vielen Dank! Gut der Mann! :) -- |
|
Profil || Suche |
|
003 30.07.2000, 01:49 Blackpanther |
Ich hab mir das mal grad durchgelessen WOW soviel Fachwiesen is ja ab artig habs nach der 10 Zeile nich mehr geblickt . Machste sowas beruflich oder so das is ja abartig . Respeckt allen Codern das muß mal wieder esagt werden ! -- |
|
Profil || Suche |
|
004 31.07.2000, 18:09 Hyperion |
Hi! [code] |
|
Profil || Suche |
|
005 31.07.2000, 18:18 Hyperion |
Hi! class CHudTimeBar: public CHudBase Sprite 2 brauchen wir nicht zwingend, ist aber sicher schöner, so haben wir einen Rahmen für unseren Balken. Ich mach's jetzt trotzdem erstmal ohne. Da könnt ihr Euch dann nochmal dran auslassen. #include "hud.h" #include <string.h> Standard-include-ments. DECLARE_MESSAGE(m_TimeBar, TimeBar) Zur Message erklären. int CHudTimeBar::Init(void) m_flTimeDiff = 0; m_iFlags |= HUD_ACTIVE; gHUD.AddHudElem(this); return 1; Die Init-Funktion müssen wir noch in der Init der hud.cpp aufrufen lassen. Sie hakt erstmal unsere Message, Resettet alle Variablen und fügt unseren TimeBar dem HUD hinzu. void CHudTimeBar::Reset(void) Reset, sollte klar sein :) int CHudTimeBar::VidInit(void) m_hSprite1 = gHUD.GetSprite(HUD_flash_empty); m_iWidth = m_prc2->right - m_prc2->left; return 1; Muss auch noch in die hud.cpp eingetragen werden (siehe Prefect). Hier wird es interessant. Wie ich schon vorhin sagte, werden hier nun m_hSprite1 und 2 die Sprites zugewiesen (hier noch die Taschenlampen-Sprites, ändern!), und die m_prc's verweisen nun als Zeiger auf die Sprites. m_iWidth ist die Breite des Sprites (ist also auch hier flexibel, es kann jedes beliebiges Sprite genommen werden!). int CHudTimeBar:: MsgFunc_TimeBar(const char *pszName, int iSize, void *pbuf ) BEGIN_READ( pbuf, iSize ); return 1; Die Message kommt an: und zwar als Short. Short ist 2 Byte groß und beinhaltet den Zahlenraum von 0..65536, in Sekunden wären das ca. 18 Stunden, und das sollte für eine Runde (Teamplay) oder Entwicklungs- oder Respawnzeit genügen :). Ein Byte reicht nicht, da die Werte mit 256 Sekunden ein wenig knapp wären (4,2 Minuten...). Also: Short kommt an und wird in m_flTimeDiff gespeichert. Nun erstellen wir in m_flTimeScale die "Einheiten" für unseren Balken, indem wir 1 durch den empfangenen Wert teilen. Nun Stoppen wir noch die Zeit und addieren die zusätzlichen (gerade erhalenen) Sekunden drauf. gHUD.m_fl_Time enthält genau wie in der hl.dll bzw. mp.dll die gpGlobals->time die aktuelle Zeit (neuerdings im double-Format). int CHudTimeBar::Draw(float flTime) if (!(gHUD.m_iWeaponBits & (1<<(WEAPON_SUIT)) )) int r, g, b, x, y, a; m_flScale = (m_flTimeEnd - gHUD.m_flTime) * m_flTimeScale; // wir messen unsere Position ab a = MIN_ALPHA; if (m_flScale < 0.10) ScaleColors(r, g, b, a); y = (m_prc1->bottom - m_prc2->top)/2; // Knapp unter dem Bildschirmrand int iOffset = m_iWidth * (1.0 - m_flScale); // übertragen der Skalierung auf das Sprite SPR_Set(m_hSprite2, r, g, b ); return 1; Also, ihr seht, ihr habt nun einen voll funktionstüchtigen Fortschrittsbalken, den ihr für alle Möglichen Zwecke einsetzen könnt. Es ist aber immernoch Arbeit angesagt, z.B. ist vielleicht die Richtung nicht euren Wünschen entsprechend, oder er soll nicht fallen sondern steigen, die Sprites sind sowieso noch nicht gut, zweites Sprite einbauen (als Kasten bzw. Bett), mp.dll bzw. hl.dll verändern... Ich hoffe aber trotzdem, ich konnte euch helfen. Achja: noch ein paar Sachen. |
|
Profil || Suche |
|
006 31.07.2000, 18:27 Hyperion |
Hey, warum ist mein Post zweimal? Ich schwöre, ich hab nur einmal geklickt! Das Forum hat aber schon vorher rumgesponnen, meine schönen <pre>[code]</pre> Zeichen sind alle verloren gegangen und ich musste sie wieder entfernen! -- |
|
Profil || Suche |

