Jump to content

Pozice spawnu pred seba


Recommended Posts

.Čau čau dufam že nerušim ?. Potreboval by som pomoct.  Chcem spravit prikaz /warp [vzdalenost]  ale neviem ako nastavím to aby ho to spawnulo o tu danu hodnotu pred seba. Ďakujem                PAWNO

Link to comment
Share on other sites

  • Globální moderátor

Ahoj, je to trocha matematiky.

Pro začátek budeš potřebovat směr, kterým se koukáš: https://sampwiki.blast.hk/wiki/GetPlayerFacingAngle a svojí pozici: https://sampwiki.blast.hk/wiki/GetPlayerPos

 

Co známe: Aktuální pozici, vzdálenost warpu a směr kterým se kouká. 

  • Aktuálně pozice je pro výpočet irelevantní, vynecháme

vzdálenost a směr kterým se kouká je užitečný při použití goniometrických funkcí: https://cs.wikipedia.org/wiki/Goniometrická_funkce

 

 

 

ilustrace-gonio-trojhelnik.png

Dle obrázku si představ, že ty jsi v levém rohu a znáš směr a vzdálenost, což je strana c. (Je to pravoúhlý trojúhelník) Znáš vzdálenost přepony a úhel. (GetPlayerFacingAngle). Díky tomu můžeš vypočítat stranu "b", takže se použije funkce cosinus kdy:

  • cos(α) = b/c
  • b = cos(α) * c

v tomto případě je b vzdálenost nové pozice od tvé stávající. Hodnotu "a" vypočítáš už klasickou pythagorovu větou:

  • c^2 = a^2 + b^2
  • a = sqrt(c^2 - b^2)

výpočtama získáš tvé posunutí vůči aktuální pozici. Pak je stačí sčítáním dopočítat a nastavit hráči novou pozici. Hráčovu pozici nastavíš přes https://sampwiki.blast.hk/wiki/SetPlayerPosFindZ jelikož neznáš Z level kam se warpoval. Nezapomeň správně přičítat nebo odečítat souřadnice podle toho kam se kouká (GetPlayerFasingAngle). Souřadnice sčítáš pouze pokud se hráč kouká někam mezi severem a východem. 

Pokud se bude koukat jiným směrem, musíš vymyslet, jak budeš výpočet počítat. Do goniometrické funkce můžeš dát maximální hodnotu 90 (stupňů). Jedna varianta je ta, že si vždy úhel snížíš o hodnotu kolik ti přebejvá: Úhel 120, odečteš 90 a máš 30 - můžeš použít do funkce. Úhel 195, odečteš 180 a máš 15. 310 odečteš 270 a máš 40. Pak můžeš použít výpočet výše ale jak jsem zmínil, musíš si dávat pozor jak vypočítaný souřadnice k sobě přičteš/odečteš. Jinak se budeš warpovat o správnou vzdálenost, ale špatným směrem

Link to comment
Share on other sites

On 8. 10. 2014 at 13:36, Polis_Polismanovic said:

Ďakujem za vysvetlenie ale som stoho fakt že deb*l ja by som to musel vidiet na tom tutorialu aby som to pochopil sin cosin tomu nechapu. Ale ďakujem za snahu

 

Link to comment
Share on other sites

Zdravím,
skúsim trochu doplniť Hipa.
Obrázok nižšie predstavuje pohľad zhora. Hráč stojí v bode A a jeho postava je natočená smerom α.
Hľadáme súradnice bodu X, ktorý je od hráča (bodu A) vzdialený 2 jednotky smerom α.
Pre zjednodušenie súradnicu z ignorujeme; predpokladáme, že body A a X sú v rovnakej výške; zaujímajú nás teda iba súradnice x a y bodu X.
Na obrázku sú už všetky hodnoty vyplnené, ale na začiatku poznáme iba hráčovu pozíciu (v tomto prípade [0;0]) a uhol α (v tomto prípade 37°). Zvyšok musíme dopočítať...
image.png.e0b6f5a701b56cacdeb5615897e9be2e.png

Začneme tým, že si okolo hráča predstavíme jednotkovú kružnicu (t.j. kružnicu s polomerom 1). Akonáhle vypočítame súradnice bodu B, ktorý je priesečníkom jednotkovej kružnice a úsečky spájajúcej body A a X, dostaneme jednotkový vektor (t.j. vektor dĺžky 1), ktorý potom stačí iba prenásobiť požadovanou vzdialenosťou, pripočítať ho k hráčovej pozícii a dostaneme tak súradnice bodu X.

Ako vypočítať súradnice bodu B...
Na obrázku je vyznačený pravouhlý trojuholník ABC, ktorý má strany a, b, c. Súradnica x bodu B je zhodná s dĺžkou strany b v trojuholníku. Podobne, súradnica y bodu B je zhodná s dĺžkou strany a.

Začnime výpočtom dĺžky strany a...
V pravouhlom trojuholníku platí, že sínus uhla = veľkosť protiľahlej strany / veľkosť prepony. V našom prípade to môžeme zapísať takto: sin(α) = a / c. Keďže v našom prípade má prepona (c) dĺžku 1, delenie číslom 1 môžeme vynechať a zjednodušiť to na: sin(α) = a. Po konzultácii s kalkulačkou zistíme, že sínus 37 stupňov; teda dĺžka strany a; je približne 0.6 (ako ukazuje obrázok).

Podobne výpočet dĺžky strany b...
V pravouhlom trojuholníku platí, že kosínus uhla = veľkosť priľahlej strany / veľkosť prepony. V našom prípade to môžeme zapísať takto: cos(α) = b / c. Keďže v našom prípade má prepona (c) dĺžku 1, delenie číslom 1 môžeme vynechať a zjednodušiť to na: cos(α) = b. Po konzultácii s kalkulačkou zistíme, že kosínus 37 stupňov; teda dĺžka strany b; je približne 0.8 (ako ukazuje obrázok).

Získali sme jednotkový vektor (0.8;0.6). V našom prípade nás zaujíma bod vzdialený 2 jednotky, takže k hráčovej pozícii [0;0] pripočítame 2-násobok jednotkového vektoru (0.8;0.6). Dostávame tak súradnice bodu X: [0 + 2*0.8; 0 + 2*0.6] = [1.6; 1.2]. Ak by nás zaujímal bod vzdialený napríklad 5 jednotiek, pripočítal by sa 5-násobok jednotkového vektoru (dostali by sme súradnice [0 + 5*0.8; 0 + 5*0.6] = [4;3].

Ak by si sa chcel hrať s GeoGebrou: https://www.geogebra.org/classic/dfydudkd

Ako to bude vyzerať v pawne...

stock GetPositionInFrontOfPlayer(playerid, &Float:x, &Float:y, &Float:z, Float:distance = 5.0)
{
    new Float:facingAngle;
    GetPlayerFacingAngle(playerid, facingAngle);
    facingAngle += 90.0; // 0° v GTA je sever, ale 0° na obrázku je východ, preto korekcia o 90°
    GetPlayerPos(playerid, x, y, z);
    x += distance * floatcos(facingAngle, degrees);
    y += distance * floatsin(facingAngle, degrees);
}

CMD:warp(playerid, params[])
{
    new Float:distance;
    if (sscanf(params, "f", distance))
        return SendClientMessage(playerid, -1, "Usage: /warp [distance]");
        
    new Float:x, Float:y, Float:z;
    GetPositionInFrontOfPlayer(playerid, x, y, z, distance);
    SetPlayerPos(playerid, x, y, z);
    return 1;
}

Ak chceš, aby sa výška cieľového bodu prispôsobila terénu (aby ťa newarplo do textúry), namiesto SetPlayerPos môžeš skúsiť https://sampwiki.blast.hk/wiki/SetPlayerPosFindZ ako radí Hip, alebo ideálnejšie MapAndreas plugin.

Edited by DuFF
zlý odsek
  • Paráda! (+1) 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...