Jump to content

pomoc 2x Speed peší


PapikSVK52

Recommended Posts

ahojte ako spravim aby 2 krat rychlejse by som bezal? viem že sa tam použiva SetPlayerVelocity ale neviem to spraviť vopred dík

 

a ešte niečo chcem aby server poznal moj Nick ked sa spawnem až my dal specialny bonus ako spravim aby ma poznal? pri spawne?

Link to comment
Share on other sites

velice ty dakujem a to stim speed som skusil toto:

 

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{

if (HOLDING(KEY_SPRINT))
{
  if (!IsPlayerInAnyVehicle(playerid))
  {
   new Float:runx,Float:runy,Float:runz;
GetPlayerVelocity(playerid,runx,runy,runz);
SetPlayerVelocity(playerid,runx*2,runy*2,runz*2);
  }
  return 1;
  }

return 1;

}

 

a chyba je taka funguje to iba ked som vo vzduchu na zemi nie


aj ked som odtial vymazal if (!IsPlayerInAnyVehicle(playerid))
  {

tak nič stale to iste

Edited by PapikSVK52
Link to comment
Share on other sites

velice ty dakujem a to stim speed som skusil toto:

 

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)

{

if (HOLDING(KEY_SPRINT))

{

  if (!IsPlayerInAnyVehicle(playerid))

  {

   new Float:runx,Float:runy,Float:runz;

GetPlayerVelocity(playerid,runx,runy,runz);

SetPlayerVelocity(playerid,runx*2,runy*2,runz*2);

  }

  return 1;

  }

return 1;

}

 

a chyba je taka funguje to iba ked som vo vzduchu na zemi nie

aj ked som odtial vymazal if (!IsPlayerInAnyVehicle(playerid))

  {

tak nič stale to iste

nevím teď která ale jedna je výška. tak tu smaž

Link to comment
Share on other sites

~> A dostane varování. Ne "smazat", ale vepsat jen nulu. Aby se to nezvyšovalo spolu s tím.

~> A předešlé (defautlní) velocity je 0. A 0*2 ti to opravdu nezvýší. Nic nezjišťuj a zvyšuj to rovnou:

 

SetPlayerVelocity(playerid, 0.2, 0.2, 0.0);

len toto tam vložit?

Link to comment
Share on other sites

Dáme si trochu teorie, protože vaše řešení jsou špatná.

new Float:runx,Float:runy,Float:runz;
GetPlayerVelocity(playerid,runx,runy,runz);
SetPlayerVelocity(playerid,runx*2,runy*2,runz*2);

Pěkné.. hráč běží rychlostí například 10km/h, po aplikování tvého kódu se rychlost zvýší na 20km/h, poté na 40km/h atd. Takže toto nebude nejšťastnější řešení.

(Toto by mělo být stejné jako moje řešení, akorát mé má fixní rychlost, ale tu bude problém vysvětlen na konci)

-

nevím teď která ale jedna je výška. tak tu smaž

Pokud by "smazal" (berme to jako nastavil na 0) rychlost na ose z, jak by hráč běhal do kopce a z kopce?

-

SetPlayerVelocity(playerid, 0.2, 0.2, 0.0);

Zde to stejné co výše. Plus by rychlost nebyla dvojnásobek rychlosti hráče při sprintu + by byl hráč nucen se pohybovat pouze na severovýchod. (hráč na pozici 0,0,0 s rychlostí 0.2, 0.2, 0 se pohne na 0.2, 0.2, 0, pak na 0.4, 0.4, 0 atd. to znamená pouze jedním směrem).

 

 

Musíme si tedy určit fixní velikost rychlosti (Testoval jsem to, a takto mi to přibližně vyšlo (na rovince, styl běhaní Cj))

#define DEFAULT_PLAYER_VELOCITY 0.19 // 0.17 až 0.2, nejčastěji 0.19

-

Pokud tedy chceme dvojnásobek této rychlost bude to (překvapivě)

#define DEFAULT_PLAYER_VELOCITY 0.19 * 2

pozn. Není to roznásobené, kvůli lehké úpravě defaultní rychlosti a násobku rychlosti, kterého chceme dosáhnout.

 

Toto je tedy naše fixní rychlost, které hráč za každých okolností (pokud se pohybuje a my to tak chceme) musí dosáhnout.

Zjistíme jeho rychlosti na všech osách.

new Float:x, Float:y, Float:z;
GetPlayerVelocity(playerid, x, y, z);

-

Použijeme pomocnou proměnnou pro velikost rychlosti (u know, vektory..)

new Float:pom = VectorSize(x, y, z);

-

A zjistíme zda není nula

if(pom != 0)
{
   // zbytek
}

nebo 

if(pom == 0) return 1;

-

Toto zjišťujeme, protože v následujícím kroku budeme dělit (a nulou dělit nechceme). Pro úsporu paměti hodíme výsledek zase do naší pomocné proměnné.

pom = DEFAULT_PLAYER_VELOCITY / pom;

-

Nyní když naší proměnnou 'pom' vynásobíme rychlosti na osách, zachováme směr výsledného vektoru, ale změníme délku na DEFAULT_PLAYER_VELOCITY, tudíž zhruba dvojnásobek sprintu.

V následujícím kroku to rovnou i nastavím.

SetPlayerVelocity(playerid, x*pom, y*pom, z*pom);

-

Nyní pokud si printneme velikost vektoru rychlosti získáme zhruba dvojnásobek rychlosti hráče při sprintu a máme zachovaný směr.

Pro nevěřící:

printf("%f", VectorSize(x*pom, y*pom, z*pom));

-

Výsledný kód bude vypadat nějak takto

new Float:x, Float:y, Float:z;
GetPlayerVelocity(playerid, x, y, z);
new Float:pom = VectorSize(x, y, z);
if(pom != 0)
{
    pom = DEFAULT_PLAYER_VELOCITY / pom;
    SetPlayerVelocity(playerid, x*pom, y*pom, z*pom);
    // printf("%f", VectorSize(x*pom, y*pom, z*pom)); pokud jste hnidopich 
}

-

Bohužel tu nastává problém. OnPlayerKeyStateChange(..) se volá pokud hráč stiskl klávesu. Tudíž aby hráč dostal boost musí neustále mačkat KEY_SPRINT (při použití výše uvedených řešení). Autorovi to ale nejspíš nevadilo ani u předešlých řešení. 

Další problém je, že hráč nedokáže mačkat neustále klávesu KEY_SPRINT proto není naboostovaný pořád, rychlost tedy kolísá.

Testoval jsem to i v OnPlayerUpdate(..), ale tam zas nebyl prostor pro změnu směru běhu, rychlost ale byla zachována na naší fixní a směr byl zachován. 

 

 

Takže tu máte výpočet správné rychlosti a aplikování je na vás. GL.

(Asi bude nutno zjistit kam hráč kouká, zrotovat vektor, pak zde ale bude problém s rychlostí na ose z, takže hráče držet nějak při zemi atd..)

 

 

 

 

 

 

Edited by Lukasz
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

takže toto všetko mam dat do PWN ? a malo by to zhruba ist?


takže su tam 2 tie iste  errory:                                   error 017: undefined symbol "VectorSize"

                                                                 error 017: undefined symbol "VectorSize"

 

ako ich definovat?


asi to chce novšiu verziu :d


*Lock

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...