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):
Kretanje aktora od tacke A do tacke B
1,402
pregleda
11
postova
11. Jun 2020.
11. Jun 2020.
á—ªå‚乂 wrote on June 11, 2020, 4:08 pm:
To se ne zove aktor nego NPC
https://forum.sa-mp.com/showthread.php?t=95034
https://forum.sa-mp.com/showthread.php?t=95034
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
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
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;
11. Jun 2020.
Moras da napises svoju skriptu, ti mu govoris gde ce se kreirati nemas odredjeno gde moras ...
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);
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