[Pedido] otimizar cуdigo
#1

Fiz um cуdigo, mas quero deixa-lo 100 por cento funcional, o problema й que, quando eu me aproximo de um veiculo ele verifica outro veiculo mais longe do que o que eu desejo, a funзгo as vezes verifica o veiculo mais longe mesmo tendo um em sua frente.. como posso consertar?

PHP код:
public PlacaVeiculoPerto(playerid)
{
    for( new 
iMAX_VEHICLESi++) {
        new 
Float:Pos[3];
        
GetVehiclePos(iPos[0], Pos[1], Pos[2]);
        if(
IsPlayerInRangeOfPoint(playerid7.0Pos[0], Pos[1], Pos[2])) {
            return 
i;
        }
    }
    return 
0;

Reply
#2

De acordo com o cуdigo, ele vai ver o veiculo mais proximo, entre tanto, ele vai pegar o que foi criado primeiro.

@EDIT

Criei um cуdigo rapidamente, testa ai, qualquer coisa me avisa.
pawn Код:
public PlacaVeiculoPerto(playerid)
{
    new Float:Pos[3], Float:Distancia, Perto;
    Distancia = 999999.9;
    for( new i; i < MAX_VEHICLES; i++)
    {
        GetVehiclePos(i, Pos[0], Pos[1], Pos[2]);
        if(IsPlayerInRangeOfPoint(playerid, 7.0, Pos[0], Pos[1], Pos[2]))
        {
            if(Distancia < GetPlayerDistanceFromPoint(playerid, Pos[0], Pos[1], Pos[2]))
            {
                Distancia = GetPlayerDistanceFromPoint(playerid, Pos[0], Pos[1], Pos[2]);
                Perto = i;
            }
        }
    }
    return Perto;
}
Reply
#3

Parar de criar variбveis em cada volta do loop й um bom comeзo.

PHP код:
stock PlacaVeiculoPerto(playerid) {
    static 
Float:Pos[3], i;
    for(
0MAX_VEHICLES; ++i) {
        
GetVehiclePos(iPos[0], Pos[1], Pos[2]);
        if(
IsPlayerInRangeOfPoint(playerid7.0Pos[0], Pos[1], Pos[2])) {
            return 
i;
        }
    }
    return 
INVALID_VEHICLE_ID;

Reply
#4

Desculpe, mas nгo era aquele cуdigo acima que estava com erros, й o cуdigo abaixo, aquele verifica o id do veiculo, e este verifica, onde esta realmente o veiculo(PlayerPertoVeiculo), este й o cуdigo com o bug:

PHP код:
public PlayerPertoVeiculo(playerid)
{
    static 
Float:Pos[3];
    for( new 
iMAX_VEHICLESi++) {
        
GetVehiclePos(iPos[0], Pos[1], Pos[2]);
        if(
IsPlayerInRangeOfPoint(playerid7.0Pos[0], Pos[1], Pos[2])) {
            return 
1;
        }
    }
    return 
0;

Reply
#5

Mesma coisa filho, sу muda que nгo й variavel e sim static, e estб fora do loop.
Reply
#6

Quote:
Originally Posted by JoshNudock
Посмотреть сообщение
Fiz um cуdigo, mas quero deixa-lo 100 por cento funcional, o problema й que, quando eu me aproximo de um veiculo ele verifica outro veiculo mais longe do que o que eu desejo, a funзгo as vezes verifica o veiculo mais longe mesmo tendo um em sua frente.. como posso consertar?

PHP код:
public PlacaVeiculoPerto(playerid)
{
    for( new 
iMAX_VEHICLESi++) {
        new 
Float:Pos[3];
        
GetVehiclePos(iPos[0], Pos[1], Pos[2]);
        if(
IsPlayerInRangeOfPoint(playerid7.0Pos[0], Pos[1], Pos[2])) {
            return 
i;
        }
    }
    return 
0;

O que estб acontecendo no seu cуdigo й que ele roda um loop nos veнculos de forma crescente.

Ou seja, ele roda do veнculo id 0, atй o veнculo 2000 (se existir).

Entгo a sua verificaзгo estб falha pelo simples motivo, ele vai retornar e cancelar o loop assim que encontrar um veнculo que supra a condiзгo que vocк criou. Exemplo: vocк tem 2 veнculos, o id 0 e o id 1, o id 1 tб mais perto que o id 0, porйm o id 0 estб dentro do `7.0` que vocк indicou na verificaзгo, logo ele vai retornar o id 0, apesar do id 1 estar mais perto.

Oque vocк pode fazer й criar um indicador para armazenar o veнculo que estiver mais perto, seguindo a lуgica que o RiqueP indicou no seu primeiro post.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)