[Ajuda] Discussгo: "Reto" SA:MP
#1

Choveu PM de gente aqui pedindo como se fazia isto:

[ame]http://www.youtube.com/watch?v=vYmV8j5P0X8[/ame]


Sйrio, eu estou tentando a alguns dias e realmente й algo muito, muito difнcil de se fazer.

Eu consegui fazer o bбsico, detecta quando olha direita esquerda e pega a angulaзгo certinho, o problema й que ao passar isto para pixel acaba dando problema na PROFUNDIDADE em que o jogador vк o carro e na altura. Os lados estгo quase perfeitos

Eu tentei via trigonometria, usando mesmo sistema do GetAngleZ onde o cateto adjacente й onde o player olha e a hipotenusa й a direзгo do carro ao player. Mas nгo deu certo

pawn Код:
// =============================================================================

Float:AngleBetweenPoints(Float:XA, Float:YA,Float:XB, Float:YB)
{
    new Float: angulo = atan2(YA - YB, XA - XB);

    if(angulo < 000.0) angulo += 360.0;
    if(angulo > 360.0) angulo -= 360.0;
       
    return angulo;
}

// =============================================================================

GetPosFromView(playerid, Float:distance, &Float:x, &Float:y, &Float:z)
{
  static Float:cx,Float:cy,Float:cz,Float:fx,Float:fy,Float:fz;
  GetPlayerCameraPos(playerid, cx, cy, cz);
  GetPlayerCameraFrontVector(playerid, fx, fy, fz);
  x = fx * distance + cx;
  y = fy * distance + cy;
  z = fz * distance + cz;
}

// =============================================================================


#if !defined MATH_PI
#define MATH_PI 3.14159265
#endif

#if !defined FULL_ANGLE
#define FULL_ANGLE 360.0
#endif

#if !defined PIT
#define PIT 7.5
#endif


public OnPlayerUpdate(playerid) {


    static
        Float:X_OBJETO,
        Float:Y_OBJETO,
        Float:Z_OBJETO;
       

    static
        Float:xPos,
        Float:yPos,
        Float:zPos,
        Float:distancia[2];

    GetPlayerPos(playerid, xPos, yPos, zPos);
    GetVehiclePos(carcriado, X_OBJETO, Y_OBJETO, Z_OBJETO);

    distancia[0] = GetDistance(X_OBJETO, Y_OBJETO, Z_OBJETO, xPos, yPos, zPos);

    if(distancia[0] < 100.0) {

        GetPosFromView (playerid, distancia[0], xPos, yPos,zPos);
       
        distancia[1] = GetDistance(X_OBJETO, Y_OBJETO, Z_OBJETO, xPos, yPos, zPos);

        if(distancia[0] < distancia[1]) return false;


            new Float: angulo[2];
            new Float: raio; // preciso arrumar o raio e dar um jeito de relacionar ele com a distancia do jogador
           
            // distancia[0] entre player e carro
            // distancia[1] entre lugar onde ele olha e carro

           
            angulo[1] = AngleBetweenPoints( xPos, yPos, X_OBJETO, Y_OBJETO) ;

            // angulo[1] angulo em que ele olha e carro
            // angulo[0] angulo em radianos em que ele olha e carro
            // raio й o raio que indica a distancia entre o centro da tela e o carro. Quando maior o raio mais distante o carro estб do centro da tela
           
           
            if(angulo[1] > 90.0) { // aqui FUNCIONA perfeitamente, detecta se o jogador olha para direita do carro ou para esquerda
                SendClientMessage(playerid, -1, "Direita do Carro");
            }
            else {
                SendClientMessage(playerid, -1, "Esquerda do Carro");
            }

            angulo[0] = (angulo[1] * MATH_PI) / 180.0; // converter para radianos

            new Float: px = 320 + floatcos(angulo[0] , radian) * (distancia[0]*distancia[1]) ; // pixel x
            new Float: py = 240 + floatsin(angulo[0] , radian) * (distancia[0]*distancia[1]) ; // pixel y

                new
                str[128]
            ;

            format( str, 128, "ANGULO: %f metros | RADIANOS: %f angulo | DISTANCIA DE VISГO: %f",  angulo[1], angulo[0] , distancia[1]);
            SendClientMessage(playerid, -1, str);

    }

    return true;
}



GetDistance(Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2)
{
    return floatround(floatsqroot(floatpower(floatabs(floatsub(x2,x1)), 2) + floatpower(floatabs(floatsub(y2,y1)),2) + floatpower(floatabs(floatsub(z2,z1)) ,2)));
}
Tenho QUASE certeza que isto envolve coisas que ainda nгo aprendi - estou ainda no primeiro ano do ensino mйdio. Por isto abro este tуpico para discussгo de quem pretende pensar em uma boa lуgica para fazer algo do tipo. O que tб quase lб.

https://sampforum.blast.hk/showthread.php?tid=314153
Reply
#2

Desculpe o UP. Mas alguйm aqui tem alguma ideia disponнvel?
Reply
#3

bem legal sa fita ai
Reply
#4

vc usou 5 td's?
Reply
#5

Sу usei 1 com texto O
Reply
#6

Aff o cara e do mexico olha musica .-.
Reply
#7

ah claro! :P

Edit: tendir...
Reply
#8

Acho que seria melhor criar o topico na area inglesa, 99% das pessoas daqui nao tem esse conhecimento (pelomenos eu acho nй).
Reply
#9

Pelo que parece esse "quadrado" se liga e desliga ao decorrer do movimento, ficaria mais interessante com a include TextDrawMove
Reply
#10

Quote:
Originally Posted by DrTHE
Посмотреть сообщение
Pelo que parece esse "quadrado" se liga e desliga ao decorrer do movimento, ficaria mais interessante com a include TextDrawMove
Descriзгo do vнdeo:

es un reto dificil pero no imposible, el reto consiste en hacer un textdraw que al actualizarse apunte al vehiculo.

Traduзгo do ******
й um desafio difнcil, mas nгo impossнvel, o desafio й fazer uma atualizaзгo TextDraw ponto no veнculo.

Foi o que eu pensei, espanhol й fбcil de entender u.u
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)