Kretanje aktora od tacke A do tacke B

Započeo Sinner.man
11. Jun 2020. Zaključano
1,402
pregleda
11
postova
KasperD
4
Shot Caller
11. Jun 2020.
Problem(error/warning): Pitanje, kako da ubacim aktora u igru koji se krece od tacke A do tacke B i nazad i na kojem mjestu u modu, (ATH MOD)
Dio skripte: [ pawn ]vaš odgovor[ /pawn ]
Debug iz server_log(ukoliko je u pitanju crashanje servera - crashdetect log): [ code ][ /code ]
Slika/video ingame problema(obavezno ako je ingame problem):
Grebovic_Danijel
5
Godfather
11. Jun 2020.
To se ne zove aktor nego NPC
https://forum.sa-mp.com/showthread.php?t=95034
Exnas.pwn
5
Godfather
11. Jun 2020.
ᗪ卂乂 wrote on June 11, 2020, 4:08 pm:

Tehnicki ako ne zelis NPC-a mozes i sa actorom da uradis posto imas one animacije za hodanje i slicno, upotreba tajmera, animacija moze da uradi nesto slicno sto i NPC-ovi rade a da ti pritom ostane slot
KasperD
4
Shot Caller
11. Jun 2020.
znam ja to sve, nebitno jel actor ili NPC, pitanje je kako ??
Exnas.pwn
5
Godfather
11. Jun 2020.
Sinner.man wrote on June 11, 2020, 4:36 pm:
znam ja to sve, nebitno jel actor ili NPC, pitanje je kako ??


new actorid;
CMD:startactor(playerid)
{
    actorid = CreateActor(294,5,5,5,5);
    ApplyActorAnimation(actorid,"PED","WALK_gang1",4.1,1,1,1,1,1);
    // procenis koliko mu vremena treba da ode do tacke b
    SetTimerEx("StopActorAnim",10000,false,"i",actorid);
    return(true);
}

forward StopActorAnim(actor);
public StopActorAnim(actor)
{
    printf("Actor je stigao na lokaciju");
    ClearActorAnimations(actor);
    return(true);
}


Za NPC-ove imas pun kurac tutorijala, udjes ig snimis ga stavis ucitavanje rute koju si snimio konektujes itd
KasperD
4
Shot Caller
11. Jun 2020.
//>> Vedran wrote on June 11, 2020, 4:41 pm:


new actorid;
CMD:startactor(playerid)
{
    actorid = CreateActor(294,5,5,5,5);
    ApplyActorAnimation(actorid,"PED","WALK_gang1",4.1,1,1,1,1,1);
    // procenis koliko mu vremena treba da ode do tacke b
    SetTimerEx("StopActorAnim",10000,false,"i",actorid);
    return(true);
}

forward StopActorAnim(actor);
public StopActorAnim(actor)
{
    printf("Actor je stigao na lokaciju");
    ClearActorAnimations(actor);
    return(true);
}


Za NPC-ove imas pun kurac tutorijala, udjes ig snimis ga stavis ucitavanje rute koju si snimio konektujes itd

Pitanja,
gdje u skripti tu podesavam lokacije, odakle-dokle ide,
I treba mi da stalno se krece da se ne zaustavlja, gdje ubacujem ovo new actorid;
Exnas.pwn
5
Godfather
11. Jun 2020.
Moras da napises svoju skriptu, ti mu govoris gde ce se kreirati nemas odredjeno gde moras ...
Grebovic_Danijel
5
Godfather
12. Jun 2020.
Ne moze sa aktorom jer ne može da se kreće radi animaciju u mestu
Dellenzi_Car
5
Underboss
12. Jun 2020.
Koji kurac trazis kad nemas blage veze
Grebovic_Danijel
5
Godfather
12. Jun 2020.
Malo je teze za tebe ovo da odradis, nauci jos malo pa onda probaj ili smisli neki drugi nacin da uradis to sto hoces...
algorhitmically
4
Shot Caller
12. Jun 2020.
Moguce je pomeranje actora.
Na ovaj nacin mu postavljas ugao gledista ka putanji, imas odredjivanje sledeceg koraka i kada se priblizi dovoljno pozvace se cusom callback OnActorMoved.
Dole sam ti napravio komande za test pa mozes isprobati. Ako planiras da koristis ovo uzmi mapandreas i za svaki korak actora mu nadji odredjenu Z poziciju za odredjene XY koordinate kako bi se on kretao uvek po podlozi.  Mozes mu povecati i brzinu(povecas 4 parametar iz funkcije GetXYInFrontOfActor u HandleActorMovement callback-u), takodje i animaciju ali ako je budes menjao lockx i locky parametre drzi na 0 kako se actor ne bi vracao na prvobitne pozicije.
Ovde vidis koncept i kako se radi, na tebi je da li ces koristiti i unaprediti ovo.

Koristenje:
new actor = CreateActor(skin, X, Y, Z, ugao);
MoveActor(actor, 15.0, 15.0);

forward HandleActorMovement(actorid, Float:dX, Float:dY);
forward OnActorMoved(actorid);

new actor, a_timer;

static Float:absoluteangle(Float:a)
{
while(a < 0.0) a += 360.0;
while(a > 360.0) a -= 360.0;

return a;
}

static Float:GetAngleToPoint(Float:fPointX, Float:fPointY, Float:fDestX, Float:fDestY)
{
return absoluteangle(-(90-(atan2((fDestY - fPointY), (fDestX - fPointX)))));
}

static Float:GetDistanceBetweenTwoPoints(Float:x1, Float:y1, Float:x2, Float:y2)
{
    return floatsqroot(floatabs((floatpower((x2 - x1), 2) + floatpower((y2 - y1), 2))));
}

static GetXYInFrontOfActor(actorid, &Float:x, &Float:y, Float:distance)
{
    new Float:a;
    GetActorPos(actorid, x, y, a);
    GetActorFacingAngle(actorid, a);
    x += (distance * floatsin(-a, degrees));
    y += (distance * floatcos(-a, degrees));
}

static MoveActor(actorid, Float:PosX, Float:PosZ)
{
if(IsValidActor(actorid))
{
    if(a_timer)
    {
        KillTimer(a_timer);
    }
    a_timer = SetTimerEx("HandleActorMovement", 800, true, "iff", actorid, PosX, PosZ);
    return 1;
    }
    return 0;
}

public HandleActorMovement(actorid, Float:dX, Float:dY)
{
    new Float:X, Float:Y, Float:Z, Float:x, Float:y;
    GetActorPos(actorid, X, Y, Z);
    SetActorFacingAngle(actorid, GetAngleToPoint(X, Y, dX, dY));
    GetXYInFrontOfActor(actorid, x, y, 0.9);
    SetActorPos(actorid, x, y, Z);
    ApplyActorAnimation(actorid, "PED", "WALK_civi", 4.0, 1, 1, 1, 0, 0);
    if(GetDistanceBetweenTwoPoints(X, Y, dX, dY) <= 3.0)
    {
        if(a_timer)
        {
            KillTimer(a_timer);
}
        ClearActorAnimations(actorid);
OnActorMoved(actorid);
}
return 1;
}

public OnActorMoved(actorid)
{
SendClientMessageToAll(-1, "Pomerio se.");
// Kada actor zavrsi sa kretanjem
return 1;
}

/*----------------------------
Komande za testiranje
-----------------------------*/

CMD:newactor(playerid, params[])
{
CreateActor(294, 15.0, 15.0, 5.0, 0.0);
return 1;
}

CMD:moveactor(playerid, params[])
{
    MoveActor(actor, 30.0, 30.0);
return 1;
}

CMD:moveactor2(playerid, params[])
{
    MoveActor(actor, 45.0, 15.0);
return 1;

Morate biti prijavljeni da biste odgovorili na ovu temu.

Prijava

© 2026 SmartShark. All rights reserved.

Powered by Momentum|v2026.3.001 Alpha