SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese

Reply
 
Thread Tools Display Modes
Old 03/08/2019, 11:16 PM   #1
ImNext
Big Clucker
 
ImNext's Avatar
 
Join Date: Jul 2018
Posts: 56
Reputation: 0
Default Getar angulo

Boa noite, dei uma vasculhada rápida no fórum e não encontrei nada relacionado a minha dúvida.

Como posso getar o angulo entre o jogador e um objeto específico?
Preciso disso para fazer com que esse objeto vire em direção ao jogador, esse foi o único método que pensei para fazer isso, caso exista outro diga.

Fiz um desenho básico no paint para melhor entendimento:
ImNext is offline   Reply With Quote
Old 04/08/2019, 12:09 AM   #2
SpikeCompiler
Huge Clucker
 
SpikeCompiler's Avatar
 
Join Date: Dec 2017
Location: Brazil
Posts: 317
Reputation: 20
Default Re: Getar angulo

GetPlayerFacingAngle(playerid, 100.0);

Tente por o personagem centralizado à posição do objeto, e depois pegue o ângulo no /save.
SpikeCompiler is offline   Reply With Quote
Old 04/08/2019, 12:12 AM   #3
ImNext
Big Clucker
 
ImNext's Avatar
 
Join Date: Jul 2018
Posts: 56
Reputation: 0
Default Re: Getar angulo

Infelizmente isso não é útil para mim pois o sistema que estou a desenvolver nem sempre terá o mesmo ângulo.
ImNext is offline   Reply With Quote
Old 04/08/2019, 12:26 AM   #4
SpikeCompiler
Huge Clucker
 
SpikeCompiler's Avatar
 
Join Date: Dec 2017
Location: Brazil
Posts: 317
Reputation: 20
Default Re: Getar angulo

Quote:
Originally Posted by ImNext View Post
Infelizmente isso não é útil para mim pois o sistema que estou a desenvolver nem sempre terá o mesmo ângulo.
Explica um pouco sobre esse sistema. Talvez alguma função para pegar o ângulo do player com SetTimer.
SpikeCompiler is offline   Reply With Quote
Old 04/08/2019, 12:42 AM   #5
ImNext
Big Clucker
 
ImNext's Avatar
 
Join Date: Jul 2018
Posts: 56
Reputation: 0
Default Re: Getar angulo

O sistema é irrelevante para essa dúvida, e também quero manter sigilo e infelizmente não existe nenhuma função, pelo menos nativa, para isso.

Um exemplo para isso é que cada vez que o jogador digitar o comando /angulo(Exemplo) o sistema irá comparar/fazer cálculos entre a posição do jogador e a do objeto e me retornar o ângulo desse jogador em relação ao objeto.

Não sei muito bem explicar mas enfim, vou tentar recorrer para a boa e velha matemática e ver se consigo resolver essa questão.
ImNext is offline   Reply With Quote
Old 04/08/2019, 12:48 AM   #6
willttoonn
Gangsta
 
willttoonn's Avatar
 
Join Date: Nov 2011
Location: Brazil
Posts: 932
Reputation: 88
Default Re: Getar angulo

SetPlayerLookAtPos(playerid, x, y);
Direciona o ângulo do player para uma posição especifica.
GetPlayerAngleAtPos(playerid, x, y);
Obtém o ângulo necessário para que o jogador consiga olhar para uma posição especifica.
SetPlayerLookAtObject(playerid, objectid);
Direciona o ângulo do player para um objeto especifico.
GetPlayerAngleAtObject(playerid, objectid);
Obtém o ângulo necessário para que o jogador consiga olhar para um objeto especifico.

pawn Code:
stock SetPlayerLookAtPos(playerid, Float:pos_x, Float:pos_y)
{
    new
        Float:w_px,
        Float:w_py,
        Float: angle;

    GetPlayerPos(playerid, w_px, w_py, angle);
    angle = floatabs(atan((pos_y-w_py)/(pos_x-w_px)));

    if (pos_x <= w_px && pos_y >= w_py)
        angle = floatsub(180.0, angle);
    else if (pos_x < w_px && pos_y < w_py)
        angle = floatadd(angle, 180.0);
    else if (pos_x >= w_px && pos_y <= w_py)
        angle = floatsub(360.0, angle);
   
    angle = floatsub(angle, 90.0);

    if (angle >= 360.0)//Prevent angle more than at 360°
        angle = floatsub(angle, 360.0);
   
    SetPlayerFacingAngle(playerid, angle);
    return 1;
}

stock GetPlayerAngleAtPos(playerid, Float:pos_x, Float:pos_y)
{
    new
        Float:w_px,
        Float:w_py,
        Float: angle;

    GetPlayerPos(playerid, w_px, w_py, angle);
    angle = floatabs(atan((pos_y-w_y)/(pos_x-w_px)));

    if (pos_x <= w_px && pos_y >= w_py)
        angle = floatsub(180.0, angle);
    else if (pos_x < w_px && pos_y < w_py)
        angle = floatadd(angle, 180.0);
    else if (pos_x >= w_px && pos_y <= w_py)
        angle = floatsub(360.0, angle);
   
    angle = floatsub(angle, 90.0);

    if (angle >= 360.0)//Prevent angle more than at 360°
        angle = floatsub(angle, 360.0);
   
    return angle;
}

stock SetPlayerLookAtObject(playerid, objectid)
{
    if(!IsPlayerConnected(playerid))
        return 0;

    new
        Float:w_px,
        Float:w_py,
        Float:w_ox,
        Float:w_oy,
        Float:w_oz,
        Float: angle;

    GetPlayerPos(playerid, w_px, w_py, angle);
    GetObjectPos(objectid, w_ox, w_oy, w_oz);

    angle = floatabs(atan((w_oy-w_py)/(w_ox-w_px)));

    if (w_ox <= w_px && w_oy >= w_py)
        angle = floatsub(180.0, angle);
    else if (w_ox < w_px && w_oy < w_py)
        angle = floatadd(angle, 180.0);
    else if (w_ox >= w_px && w_oy <= w_py)
        angle = floatsub(360.0, angle);
   
    angle = floatsub(angle, 90.0);

    if (angle >= 360.0)//Prevent angle more than at 360°
        angle = floatsub(angle, 360.0);
   
    SetPlayerFacingAngle(playerid, angle);
    return 1;
}

stock GetPlayerAngleAtObject(playerid, objectid)
{
    if(!IsPlayerConnected(playerid))
        return 0;

    new
        Float:w_px,
        Float:w_py,
        Float:w_ox,
        Float:w_oy,
        Float:w_oz,
        Float: angle;

    GetPlayerPos(playerid, w_px, w_py, angle);
    GetObjectPos(objectid, w_ox, w_oy, w_oz);

    angle = floatabs(atan((w_oy-w_py)/(w_ox-w_px)));

    if (w_ox <= w_px && w_oy >= w_py)
        angle = floatsub(180.0, angle);
    else if (w_ox < w_px && w_oy < w_py)
        angle = floatadd(angle, 180.0);
    else if (w_ox >= w_px && w_oy <= w_py)
        angle = floatsub(360.0, angle);
   
    angle = floatsub(angle, 90.0);

    if (angle >= 360.0)//Prevent angle more than at 360°
        angle = floatsub(angle, 360.0);
   
    return angle;
}
__________________
Sometimes a captain has to make the unpopular call because that's his responsibility

_________ Development Manager ______________________ Administrator
____________________ Brazilian Hard Roleplay Server ___________ Unofficial discord of the Brazilian/Portuguese SA-MP board

____________ _

willttoonn is offline   Reply With Quote
Old 04/08/2019, 12:55 AM   #7
1sbedx
Huge Clucker
 
Join Date: Dec 2015
Posts: 324
Reputation: 41
Default Re: Getar angulo

Use atan2, um exemplo abaixo usando Actor.
PHP Code:
#include <a_samp>

new gs_Actor;

main() {
  
gs_Actor CreateActor(00.00.03.00.0);
}

public 
OnPlayerUpdate(playerid) {
  new 
FloatxFloatyFloatx2Floaty2Float__;

  
GetPlayerPos(playeridxy__);
  
GetActorPos(gs_Actorx2y2__);

  
SetActorFacingAngle(gs_Actor, -atan2(x2 xy2 y) + 180.0);
  return 
1;

1sbedx is offline   Reply With Quote
Old 04/08/2019, 01:08 AM   #8
ImNext
Big Clucker
 
ImNext's Avatar
 
Join Date: Jul 2018
Posts: 56
Reputation: 0
Default Re: Getar angulo

Obrigado Wil, i1sbedx e Spike!
Especialmente ao Wil, testei o seu código aqui e funcionou perfeitamente.

+REP a todos.
ImNext is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Pedido] pegar angulo Andinho Português/Portuguese 1 13/05/2019 07:59 PM
[Ajuda] Angulo do Veiculo Joey_R Português/Portuguese 5 02/07/2017 02:31 AM
[Ajuda] Ângulo do Drift? caiom1999 Português/Portuguese 2 23/08/2014 03:40 PM
[Ajuda] Angulo UzumakiNaruto Português/Portuguese 2 29/06/2014 08:21 PM
[Ajuda] Angulo VenoN Português/Portuguese 6 15/10/2012 04:07 AM


All times are GMT. The time now is 03:03 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.