Welkom Gast! [Registreer] :: [Login]
Navigatie

Tutorials

Shoutbox
U dient in te loggen om een bericht te plaatsen.

22/05/2012 09:42
Hartelijk dank voor de gif btw! Smile Thumbs

22/05/2012 09:41
@Hurra: Tjah, ik ben nu eenmaal voor Android. Kheb geen zin in discussie Pfft elk heeft z'n eigen smaak en voorkeur

20/05/2012 21:33
Squire, dat is nutteloze software.

20/05/2012 20:51
@ ground zero.. download GIF Movie Gear. http://www.gamani.
com/gmgdown.htm

20/05/2012 20:45
Android is het meest gesloten open source project ter wereld. Alsook, GIF


Volg ons voor statusupdates en aankondigingen!
Registreer of log in
Om gebruik te maken van de volledige functionaliteit van Modbase moet je ingelogd zijn.
Na registratie kan je reageren, onderwerpen starten, projecten toevoegen en nog veel meer.

Dit is volkomen gratis en duurt hoogstens een minuut.

Registreer gratis

Hud elementen maken - deel 2



Zo, dan is het nu tijd om verder te borduren op deel 1. Nu gaan we wat leuke scripts maken met huds.
Voor deel een, klik dan hier.

Voor voorbeeld 1 neem ik een script wat een hud maakt met het aantal spelers, en laten we dan ook maar meteen een hud maken voor het aantal spelers per team. Hier zijn 2 manieren voor. Manier 1 is om een script te maken dat je iedere keer als er een speler bijkomt/afgaat of van team wisselt aanroept:
script_teamnum()
{
level.aliveteam["axis"] = 0;
level.aliveteam["allies"] = 0;
level.onteam["axis"] = 0;
level.onteam["allies"] = 0;
level.playerss = 0;

players = getentarray("player", "classname");
for(a = 0; a < players.size; a++)
{
player = players[a];

if(isdefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing")
level.exist[player.pers["team"]]++;

if(isDefined(player.pers["team"]) && player.pers["team"] != "spectator")
level.onteam[player.pers["team"]]++;

if(isdefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing" && isAlive(player) && isPlayer(player))
level.aliveteam[player.pers["team"]]++;

level.playerss++;
}

thread hud_teams();
}

hud_teams()
{
if(isDefined(level.teamallieshud))
level.teamallieshud destroy();

if(isDefined(level.teamaxishud))
level.teamaxishud destroy();

if(isDefined(level.teamallieslivehud))
level.teamallieslivehud destroy();

if(isDefined(level.teamaxislivehud))
level.teamaxislivehud destroy();

if(isDefined(level.playersshud))
level.playersshud destroy();

if(!isDefined(level.playerhud))
{
level.playerhud = newHudElem();
level.playerhud.archived = false;
level.playerhud.x = 585;
level.playerhud.y = 80;
level.playerhud.sort = 9998;
level.playerhud.alpha = .7;
level.playerhud setShader("gfx/hud/stance_stand.tga", 20, 17);
level.playerhud.color = (1,0,0);
}

if(!isDefined(level.allieshud))
{
level.allieshud = newHudElem();
level.allieshud.archived = false;
level.allieshud.x = 575;
level.allieshud.y = 100;
level.allieshud.sort = 9998;
level.allieshud.alpha = .7;
level.allieshud setShader("gfx/hud/allied_icon.tga", 12, 12);
}

if(!isDefined(level.axishud))
{
level.axishud = newHudElem();
level.axishud.archived = false;
level.axishud.x = 575;
level.axishud.y = 115;
level.axishud.sort = 9998;
level.axishud.alpha = .7;
level.axishud setShader("gfx/hud/axis_icon.tga", 12, 12);
}

level.playersshud = newHudElem();
level.playersshud.archived = true;
level.playersshud.alignX = "right";
level.playersshud.alignY = "middle";
level.playersshud.x = 615;
level.playersshud.y = 87;
level.playersshud.sort = 9998;
level.playersshud.fontscale = 0.8;
level.playersshud setValue(level.playerss);
level.playersshud.color = (1,0,0);

level.teamallieshud = newHudElem();
level.teamallieshud.archived = true;
level.teamallieshud.alignX = "right";
level.teamallieshud.alignY = "middle";
level.teamallieshud.x = 600;
level.teamallieshud.y = 105;
level.teamallieshud.sort = 9998;
level.teamallieshud.fontscale = .8;
level.teamallieshud setValue(level.aliveteam["allies"]);
level.teamallieshud.color = (1,0,0);

level.teamallieslivehud = newHudElem();
level.teamallieslivehud.archived = true;
level.teamallieslivehud.alignX = "left";
level.teamallieslivehud.alignY = "middle";
level.teamallieslivehud.x = (level.teamallieshud.x + 2);
level.teamallieslivehud.y = 105;
level.teamallieslivehud.sort = 9998;
level.teamallieslivehud.fontscale = .8;
level.teamallieslivehud.label = &"/";
level.teamallieslivehud setValue(level.onteam["allies"]);
level.teamallieslivehud.color = (1,0,0);

level.teamaxishud = newHudElem();
level.teamaxishud.archived = true;
level.teamaxishud.alignX = "right";
level.teamaxishud.alignY = "middle";
level.teamaxishud.x = 600;
level.teamaxishud.y = 120;
level.teamaxishud.sort = 9998;
level.teamaxishud.fontscale = .8;
level.teamaxishud setValue(level.aliveteam["axis"]);
level.teamaxishud.color = (1,0,0);

level.teamaxislivehud = newHudElem();
level.teamaxislivehud.archived = true;
level.teamaxislivehud.alignX = "left";
level.teamaxislivehud.alignY = "middle";
level.teamaxislivehud.x = (level.teamaxishud.x + 2);
level.teamaxislivehud.y = 120;
level.teamaxislivehud.sort = 9998;
level.teamaxislivehud.fontscale = .8;
level.teamaxislivehud.label = &"/";
level.teamaxislivehud setValue(level.onteam["axis"]);
level.teamaxislivehud.color = (1,0,0);
}


Natuurlijk wel de strings en plaatjes precachen!

We zien hier ook weer iets nieuws, namelijk .alignX/Y. Wat dit doet, is een hud vastzetten aan de plek die gedefinieerd wordt. Als je bijvoorbeeld een hud heb die van 2 naar 45 gaat, dan is de hud wijder geworden, maar het midden van de hud blijft hetzelfde, want de default value van alignX/Y is "middle". Maar als de hud nu net op het linker randje van het scherm staat, dan is het dus mogelijk dat we de helft van de 5 uit de 45 niet meer kunnen zien. Daarom doen we op dat moment hud.alignX = "left"; , en zo zal de linkerkant van de hud altijd op die plek blijven, en dan zal de hud naar rechts uitbreiden.

Wat dit script nu precies doet, is als het de eerste keer wordt aangeroepen, dan tekent het zowel de plaatjes als de cijfers, en de keren daarop vernietigt het eerst de cijfers en dan tekent hij ze opnieuw met hun waarschijnlijk nieuwe waarde, en met de plaatjes gebeurt niets.

De eerste thread wordt aangeroepen als er iets veranderd bij de teams (daarom staat het oorspronkelijk ook bij updateTeamStatus() ), en de tweede thread regelt de huds. Ze zouden ook in 1 thread kunnen staan, maar ik laat nu even het verschil zien.


Manier 2 is met een while die om de X seconden, meestal 0.05, de huds opnieuw maakt:

script_teamnum()
{
level.aliveteam["axis"] = 0;
level.aliveteam["allies"] = 0;
level.onteam["axis"] = 0;
level.onteam["allies"] = 0;
level.playerss = 0;

players = getentarray("player", "classname");
for(a = 0; a < players.size; a++)
{
player = players[a];

if(isdefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing")
level.exist[player.pers["team"]]++;

if(isDefined(player.pers["team"]) && player.pers["team"] != "spectator")
level.onteam[player.pers["team"]]++;

if(isdefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing" && isAlive(player) && isPlayer(player))
level.aliveteam[player.pers["team"]]++;

level.playerss++;
}
}

hud_teams()
{

if(!isDefined(level.playerhud))
{
level.playerhud = newHudElem();
level.playerhud.archived = false;
level.playerhud.x = 585;
level.playerhud.y = 80;
level.playerhud.sort = 9998;
level.playerhud.alpha = .7;
level.playerhud setShader("gfx/hud/stance_stand.tga", 20, 17);
level.playerhud.color = (1,0,0);
}

if(!isDefined(level.allieshud))
{
level.allieshud = newHudElem();
level.allieshud.archived = false;
level.allieshud.x = 575;
level.allieshud.y = 100;
level.allieshud.sort = 9998;
level.allieshud.alpha = .7;
level.allieshud setShader("gfx/hud/allied_icon.tga", 12, 12);
}

if(!isDefined(level.axishud))
{
level.axishud = newHudElem();
level.axishud.archived = false;
level.axishud.x = 575;
level.axishud.y = 115;
level.axishud.sort = 9998;
level.axishud.alpha = .7;
level.axishud setShader("gfx/hud/axis_icon.tga", 12, 12);
}

while(1)
{
wait 0.05;

if(isDefined(level.teamallieshud))
level.teamallieshud destroy();

if(isDefined(level.teamaxishud))
level.teamaxishud destroy();

if(isDefined(level.teamallieslivehud))
level.teamallieslivehud destroy();

if(isDefined(level.teamaxislivehud))
level.teamaxislivehud destroy();

if(isDefined(level.playersshud))
level.playersshud destroy();

level.playersshud = newHudElem();
level.playersshud.archived = true;
level.playersshud.alignX = "right";
level.playersshud.alignY = "middle";
level.playersshud.x = 615;
level.playersshud.y = 87;
level.playersshud.sort = 9998;
level.playersshud.fontscale = 0.8;
level.playersshud setValue(level.playerss);
level.playersshud.color = (1,0,0);

level.teamallieshud = newHudElem();
level.teamallieshud.archived = true;
level.teamallieshud.alignX = "right";
level.teamallieshud.alignY = "middle";
level.teamallieshud.x = 600;
level.teamallieshud.y = 105;
level.teamallieshud.sort = 9998;
level.teamallieshud.fontscale = .8;
level.teamallieshud setValue(level.aliveteam["allies"]);
level.teamallieshud.color = (1,0,0);

level.teamallieslivehud = newHudElem();
level.teamallieslivehud.archived = true;
level.teamallieslivehud.alignX = "left";
level.teamallieslivehud.alignY = "middle";
level.teamallieslivehud.x = (level.teamallieshud.x + 2);
level.teamallieslivehud.y = 105;
level.teamallieslivehud.sort = 9998;
level.teamallieslivehud.fontscale = .8;
level.teamallieslivehud.label = &"/";
level.teamallieslivehud setValue(level.onteam["allies"]);
level.teamallieslivehud.color = (1,0,0);

level.teamaxishud = newHudElem();
level.teamaxishud.archived = true;
level.teamaxishud.alignX = "right";
level.teamaxishud.alignY = "middle";
level.teamaxishud.x = 600;
level.teamaxishud.y = 120;
level.teamaxishud.sort = 9998;
level.teamaxishud.fontscale = .8;
level.teamaxishud setValue(level.aliveteam["axis"]);
level.teamaxishud.color = (1,0,0);

level.teamaxislivehud = newHudElem();
level.teamaxislivehud.archived = true;
level.teamaxislivehud.alignX = "left";
level.teamaxislivehud.alignY = "middle";
level.teamaxislivehud.x = (level.teamaxishud.x + 2);
level.teamaxislivehud.y = 120;
level.teamaxislivehud.sort = 9998;
level.teamaxislivehud.fontscale = .8;
level.teamaxislivehud.label = &"/";
level.teamaxislivehud setValue(level.onteam["axis"]);
level.teamaxislivehud.color = (1,0,0);
}
}


Dit script werk gewoon, maar het nadeel is de loop, die als hij verkeerd gebruikt wordt problemen kan opleveren. Hier moet de eerste thread weer worden aangeroepen als er iets in het team veranderd, en de tweede thread moet eenmalig aangeroepen worden. Let er wel op dat de eerste thread voor de tweede thread wordt aangeroepen, anders hebben de vars in de hud nog geen waardes en krijg je errors.

Weer precachen!
Deze scripts zijn een goed voorbeeld van een hud dat zich moet updaten.


Voor voorbeeld twee gaan we huds verplaatsen en faden over tijd:
(DIT SCRIPT WERKT NIET ZO OP ZICHZELF!)

if(!isDefined(self.hud_plusscore))
{
self.hud_plusscore = newClientHudElem(self);
self.hud_plusscore.alignX = "center";
self.hud_plusscore.alignY = "middle";
self.hud_plusscore.fontscale = 1.5;
self.hud_plusscore.color = (1,1,0);
self.hud_plusscore.label = &"+";
self.hud_plusscore setValue(curval);
self.hud_plusscore.x = 318;
self.hud_plusscore.y = 140;
self.hud_plusscore.alpha = 0;
}


self.hud_plusscore fadeOverTime(0.2);
self.hud_plusscore moveOverTime(0.2);

self.hud_plusscore.y = 120;
self.hud_plusscore.alpha = 1;

wait 3;

self.hud_plusscore fadeOverTime(0.3);
self.hud_plusscore moveOverTime(0.3);

self.hud_plusscore.y = 100;
self.hud_plusscore.alpha = 0;

wait 0.3;

// eventuele destroy:
self.hud_plusscore destroy();


Dit script is een soort van iprintlnbold, maar dan op de plek waar jij het wilt, en voor hoelang jij het wilt.
Het maakt eerst een niet-zichtbare hud, daarna verplaatst het de hud 20 units naar beneden op de y as en terwijl dat gebeurt maakt hij hem ook zichtbaar, dan wacht het 3 seconden om te lezen, en daarna beweegt hij de text 20 units verder naar beneden en tegelijkertijd maakt hij hem onzichtbaar.

Wat ook nog wel eens gebruikt wordt is een progressbar, zoals in de plant/defuse script van sd, en in de capture/destroy script van hq.
Hier is een voorbeeld van zo een script:

while(1)
{
while(distancesquared(self.origin, level.crate.origin) < 70 * 70)
{
if(!isDefined(pick_crate))
{
pick_crate = newClientHudElem(self);
pick_crate.alignX = "center";
pick_crate.alignY = "middle";
pick_crate.x = 320;
pick_crate.y = 90;
pick_crate.archived = false;
pick_crate.sort = 9998;
pick_crate.label = &"Hold [USE] to Open Crate";
}

while(self useButtonPressed())
{
if(isDefined(pick_crate))
pick_crate destroy();

if(!isdefined(pick_crate_progressbackground))
{
pick_crate_progressbackground = newClientHudElem(self);
pick_crate_progressbackground.x = 250;
pick_crate_progressbackground.y = 400;
pick_crate_progressbackground.alpha = 0.5;
}
pick_crate_progressbackground setShader("black", (barsize + 4), 12);

if(!isdefined(pick_crate_progressbar))
{

pick_crate_progressbar = newClientHudElem(self);

pick_crate_progressbar.x = 251;
pick_crate_progressbar.y = 406;
pick_crate_progressbar.alignX = "left";
pick_crate_progressbar.alignY = "middle";

}

pick_crate_progressbar setShader("white", 0, 8);
pick_crate_progressbar scaleOverTime(picktime, barsize, 8);

self linkto(level.crate);

while((isAlive(self)) && (self usebuttonpressed()) && (progresstime < picktime))
{
progresstime += 0.05;
wait 0.05;
}
if(progresstime >= picktime)
{
//script hier
}
wait(0.05);
}

self unlink();
if(isDefined(pick_crate_progressbackground))
pick_crate_progressbackground destroy();
if(isDefined(pick_crate_progressbar))
pick_crate_progressbar destroy();
if(isDefined(pick_crate))
pick_crate destroy();
progresstime = 0;


wait(0.05);
}



wait(0.05);
}


Wat dit script doet, is ten eerste kijken of de speler in een bepaalde radius is, en zoja een hud maken dat zegt wat ze moeten doen, net als het sd script. Dan, als ze dat doen, de vorige hud destroyen, en dan maakt het twee nieuwe huds, namelijk 1 grotere grijze shader en 1 iets kleinere witte shader, die bovenop de grijze komt. Dan krijgt de witte de functie dat hij moet scalen over time, en dat betekent dat hij in de aangegeven tijd zichzelf over de aangegeven units gaat uitbreiden, en dit is altijd naar rechts. Ook zal de speler gelinkt worden aan het krat, aangezien we niet willen dat hij tijdens het pakken oook nog kan lopen. Dan komt dit gedeelte:

while((isAlive(self)) && (self usebuttonpressed()) && (progresstime < picktime))
{
progresstime += 0.05;
wait 0.05;
}


Text(string) en shaders precachen!

Dit gedeelte is erg belangrijk voor een progressbar, want dit gedeelte stelt namelijk vast onder welke omstandigheden de progressbar moet blijven bestaan. In dit geval, als de speler levend is, als de speler f(of een andere usekey bind) indrukt, en zolang de speler f nog niet lang genoeg heeft ingedrukt. Als een of meer van deze condities niet meer geld, dan stop de while, en dan gaan we verder met de rest van het script, namelijk kijken of de speler voordat de while stopte de usekey lang genoeg had ingedrukt, en dus de witte shader helemaal uitgerekt is, en dus de speler succesvol het krat heeft 'opgepakt'. En al had de speler de usekey niet lang genoeg ingedrukt, dan is het de huds vernietigen, de speler unlinken, de oppaktijd resetten en weer opnieuw beginnen.

Wat ook nog wel eens gezien wordt, is een hud met een timer erin, of een zakklok met een naald die afloopt, en daar zijn ook verscheidene scripts voor:

Gametype timer (aflopende tijd):
level.clock = newHudElem();
level.clock.x = 320;
level.clock.y = 460;
level.clock.alignX = "center";
level.clock.alignY = "middle";
level.clock.font = "bigfixed";
level.clock setTimer(level.timelimit * 60);


(mijn) Sd bomb timer (aflopende tijd met tiende secondes):
self.bomb_timer = newClientHudElem(self);
self.bomb_timer.archived = false;
self.bomb_timer.x = 15;
self.bomb_timer.y = 180;
self.bomb_timer.alignX = "center";
self.bomb_timer.alignY = "middle";
self.bomb_timer.fontScale = 1;
self.bomb_timer.sort = 2;
self.bomb_timer.alignX = "left";
self.bomb_timer setTenthsTimer(clocktime);


Oplopende tijd:
level.clock = newHudElem();
level.clock.x = 320;
level.clock.y = 460;
level.clock.alignX = "center";
level.clock.alignY = "middle";
level.clock.font = "bigfixed";
level.clock setTimerUp(level.timelimit * 60);


Oplopende tijd tiende secondes:
self.bomb_timer = newClientHudElem(self);
self.bomb_timer.archived = false;
self.bomb_timer.x = 15;
self.bomb_timer.y = 180;
self.bomb_timer.alignX = "center";
self.bomb_timer.alignY = "middle";
self.bomb_timer.fontScale = 1;
self.bomb_timer.sort = 2;
self.bomb_timer.alignX = "left";
self.bomb_timer setTenthsTimerUp(clocktime);


De zakklok aflopend:
self._stopwatch = newHudElem();
self._stopwatch.x = 36;
self._stopwatch.y = 240;
self._stopwatch.alignX = "center";
self._stopwatch.alignY = "middle";
self._stopwatch setClock(countdowntime, 60, "hudStopwatch", 48, 48);


De zakklok oplopend:
self._stopwatch = newHudElem();
self._stopwatch.x = 36;
self._stopwatch.y = 240;
self._stopwatch.alignX = "center";
self._stopwatch.alignY = "middle";
self._stopwatch setClockUp(countdowntime, 60, "hudStopwatch", 48, 48);


Wat meer info over setClock/setClockUp:

setClock( <time>, <full time>, <material>, <height>, <width> );
<time> de tijd die hij erover moet doen.
<full time> misschien een betere naam hiervoor is timescale. Want het plaatje geeft een klokje aan die in 1 minuut rond loopt, dus 60 seconden in 1 rondje, en als je dan time 15 doet en full time 60, dan is dat dus een kwart van de tijd en dus een kwart van het rondje.
<material> het plaatje voor de klok die gebruikt wordt.
<height> hoogte van het plaatje.
<width> breedte van het plaatje.

Al deze soorten klok kun je natuurlijk op ieder gewenst moment gebruiken.

Nou, ik hoop dat het weer nuttig is geweest, en dat je nu weer verder kan.

Inloggen

Online users
Nieuwste lid:
mericin

· usseliteOnline
· IzNoGoD<5 min
· Fristi00:11:22
· LazY00:13:21
· Niels00:22:31
· wollephoenix00:55:47
· BoydelaMorte01:12:09
· vinhui01:51:33
· Wolph02:05:00
· mericin02:12:14

Gasten online: 3


Link ons

Partners

Links


Naar Boven

© 2006-2012 Modbase. Alle rechten voorbehouden. Disclaimer | Gedragscode

Custom coding by Stijn, Image fixing by Derix