Denas.

[Pamoka] SA-MP Laikrodis

Recommended Posts

Šioje pamokoje parodysiu kaip sukurti sa-mp serveriui laikrodį, kuris rodo tik laiką. Ilgai netempsiu gumos, važiuojam!

 

 

Taigi visų pirma mums reikia susikurti textdraw kintamajį. Modifikacijos viršuje rašome šį kodą:
 

new text:laikrodistd; //textdraw kintamasis

 

 

Taip pat mums reikia susikurt forward'ą bei define'ą timeriui(Jo prireiks vėliau). Prie kitų define rašom šį kodą:

#define f_public:%0(%1) 	forward %0(%1);		public %0(%1)

 

 

Toliau mums reikės sukurti stock'ą, kuris užkraus visus textdraw. Tarp kitų stock'ų dedam šį kodą:

stock loadtextdraw()
{
	laikrodistd = TextDrawCreate(575.000122, 24.888891, "14:00");
	TextDrawLetterSize(laikrodistd, 0.468333, 1.579259);
	TextDrawAlignment(laikrodistd, 1);
	TextDrawColor(laikrodistd, -1);
	TextDrawSetShadow(laikrodistd, 0);
	TextDrawSetOutline(laikrodistd, 1);
	TextDrawBackgroundColor(laikrodistd, 51);
	TextDrawFont(laikrodistd, 3);
	TextDrawSetProportional(laikrodistd, 1);

	return 1;
}

 

 

sukurtą stock'ą prirašom prie ongamemodeinit public'o. Kodas turi atrodyti štai taip:

public OnGameModeInit()
{
  loadtextdraw();
  
  return 1;
}

 

 

Tada sukuriame stock'ą, kuris užkraus laikrodį. Kodas atrodo štai taip:

stock LoadClock(playerid)
{
	PlayerTextDrawShow(playerid, laikrodistd);

	return 1;
}

 

 

Norint užkrauti laikrodį, į OnPlayerSpawn public'ą pridedam "LoadClok(playerid);" Kodas turi atrodyti taip:

public OnPlayerSpawn(playerid)
{
  LoadClock(playerid);

  return 1;
}

 

 

Dabar sukuriame timer'į, kuris atnaujins laikrodį kas sekundę. Timerį kuriam į OnGamemodeInit public'ą. Kodas turi atrodyti taip:

public OnGameModeInit()
{
  loadtextdraw();
  SetTimer("settime",				1000, true);
  
  return 1;
}

 

 

Tada jau su sukurtu forward'u sukuriame f_public, kuris bus vykdomas, kas 1 sekundę. Kodas turi atrodyti taip:

f_public: settime()
{
	for(new p; p <= GetPlayerPoolSize(); p++)
	{
		new String[256], hours, minutes;

		gettime(hours, minutes);


		format(String, sizeof String, "%s%d:%s%d", (hours < 10) ? ("0") : (""), hours, (minutes < 10) ? ("0") : (""), minutes);
		PlayerTextDrawSetString(p, laikrodistd, String);
	}

	return 1;
}

 

 

Na ir vuolia! Turim veikiantį laikrodį. Radus klaidų praneškit, stengsiuosi pataisyt. Taip pat labai nesmerkit kadangi tai pirma mano pamoka :)

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

1. Sekundinis timeris nėra reikalingas, kadangi laikrodyje neatvaizduoji sekundžių, taip pat eini per visus žaidėjus neefektyviai.
2. Norint pereiti per visus žaidėjus, naudok foreach arba for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) , taip išvengsi per naują kviečiamo kintamojo (j).

3. Gali naudoti global textdrawą, taip išvengsi ciklo, kuris eina per žaidėjus.

 

Nenaudinga pamoka, nes sulipdytas kodas ir net pats nesupranti ką darai.

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
28 minutes prieš, mariusqw parašė:

1. Sekundinis timeris nėra reikalingas, kadangi laikrodyje neatvaizduoji sekundžių, taip pat eini per visus žaidėjus neefektyviai.
2. Norint pereiti per visus žaidėjus, naudok foreach arba for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) , taip išvengsi per naują kviečiamo kintamojo (j).

3. Gali naudoti global textdrawą, taip išvengsi ciklo, kuris eina per žaidėjus.

 

Nenaudinga pamoka, nes sulipdytas kodas ir net pats nesupranti ką darai.

new String[256], hours, minutes;
gettime(hours, minutes);

+ šitie turėtų būti už ciklo ribų. Masinė optimizacijos klaida.

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Kodėl sukuri globalų textdraw, bet naudoji žaidėjo textdraw funkcijas kaip "PlayerTextDrawShow"?

 

Kam bereikalingos f-jos ir daug kodo eilučių kaip "

stock LoadClock(playerid)

kai galima tiesiog tą vieną eilutę kurią įkiši į bereikalingą stocką įdėt ?

 

Paskui vėl gi, bereikalo eini per ciklą, kai nori suformatuot globalų textdrawą ir vėl naudoji žaidėjo textdraw funkcijas globaliam textdraw'ui, netgi nesubuildintu, mestu klaidas 

PlayerTextDrawSetString

 

ir taipogi dėl šito "

new text:laikrodistd;

mestu klaidą nes Text apibūdinimas turi būt iš didžiosios raidės.

 

 

Ir tokias f-jas, kurios neraikalauja ciklo apibūdinimu kaip

gettime(hours, minutes);

gali aktyvuot prieš ciklą, kad mažiau apkrautum serverio resursus

Redaguota , nario Hoonz

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį
prieš 6 valandas(-ų), D'Rokas parašė:

 

stock LoadClock(playerid)
{
	PlayerTextDrawShow(playerid, laikrodistd);

	return 1;
}

 

public OnPlayerSpawn(playerid)
{
  LoadClock(playerid);

  return 1;
}

 

 

 

kai pamatai tokius dalykus tikrai supranti, kad zmogus nieko nenusimano

Dalintis šį pranešimą


Nuoroda iki šio pranešimo
Dalintis per kitą puslapį

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti Å¡ioje temoje...

×   Ä®klijuotas tekstas turi teksto formatavimą.   PaÅ¡alinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiÅ¡kai įterpta.   Ä®terpti nuorodą paprastai

×   JÅ«sų ankstesnis praneÅ¡imas buvo atkurtas.   IÅ¡valyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.


  • Å iame puslapyje narÅ¡o:   0 nariai

    Nėra registruotų narių peržiūrinčių šį forumą.

  • eneba
  • eneba
  • eneba



  • SuperGames programele
  • SuperGames programele