[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


Messages In This Thread
Discussгo: "Reto" SA:MP - by ipsBruno - 04.10.2012, 17:56
AW: Discussгo: "Reto" SA:MP - by ipsBruno - 05.10.2012, 00:16
Re: Discussгo: "Reto" SA:MP - by book1 - 05.10.2012, 00:20
Re: Discussгo: "Reto" SA:MP - by jpeg - 05.10.2012, 00:25
AW: Discussгo: "Reto" SA:MP - by ipsBruno - 05.10.2012, 00:28
Re: Discussгo: "Reto" SA:MP - by ViictorDaay- - 05.10.2012, 00:30
Re: Discussгo: "Reto" SA:MP - by jpeg - 05.10.2012, 00:32
Re: Discussгo: "Reto" SA:MP - by Kmatsu - 05.10.2012, 15:23
Re: Discussгo: "Reto" SA:MP - by DrTHE - 05.10.2012, 15:39
Re: Discussгo: "Reto" SA:MP - by humildadeforever - 05.10.2012, 15:51

Forum Jump:


Users browsing this thread: 4 Guest(s)