Diskuze: Vyhýbání se objektům

Ostatní jazyky GameMaker GameMaker Vyhýbání se objektům

Avatar
David Šercl
Člen
Avatar
David Šercl:

Programuji inteligentní vyhýbání dvou objektů, ale chtěl bych aby rotace probíhala logicky (např. ovládám člověka a kliknu myší za budovu a chci aby jí obešel. Ten člověk musí logicky rotovat, jako by ten dům obcházel např. po chodníku).

Zatím jsem použil tyto příklady a moc to nefungovalo:
1.
ourdir=direction;
image_angle=ourdir;

2.
ourdir=point_di­rection(x,y,poz­x,pozy);
image_angle=ourdir;

3. a šílený script, ale to je moc nepraktické:
///scr_pohyb
if dirour <= 0{
dirour = 359;
}
if dirour >= 360{
dirour = 0;
}

if dirtarget > dirour{
if dirour >= 90{
if spd = 4{
dirour += 1.5;
}
if spd = 5{
dirour += 1;
}
if spd = 6{
dirour += 0.5;
}
}
if dirtarget < 270 and dirour <= 90{
if spd = 4{
dirour += 1.5;
}
if spd = 5{
dirour += 1;
}
if spd = 6{
dirour += 0.5;
}
}
if dirtarget > 270 and dirour <= 90{
if spd = 4{
dirour -= 1.5;
}
if spd = 5{
dirour -= 1;
}
if spd = 6{
dirour -= 0.5;
}
}
}
if dirtarget < dirour{
if dirour <= 270{
if spd = 4{
dirour -= 1.5;
}
if spd = 5{
dirour -= 1;
}
if spd = 6{
dirour -= 0.5;
}
}
if dirour >= 270 and dirtarget > 90{
if spd = 4{
dirour -= 1.5;
}
if spd = 5{
dirour -= 1;
}
if spd = 6{
dirour -= 0.5;
}
}
if dirour >= 270 and dirtarget < 90{
if spd = 4{
dirour += 1.5;
}
if spd = 5{
dirour += 1;
}
if spd = 6{
dirour += 0.5;
}
}
}

image_angle = dirour;
direction = image_angle;

 
Odpovědět 18. července 15:31
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Šercl
TomBen:

Tohle dost záleží na ostatním kódu ( kódu pohybu a kódu zobrazování ).
Na běžné případy stačí umístit do EndStep eventu:

image_angle=point_direction(xprevious,yprevious,x,y);
Editováno 20. července 10:36
Nahoru Odpovědět 20. července 10:36
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:

Koukal jsem do nápovědy i po netu a ty kolize tam nikde nejsou moc vysvětlené(pro SOLID objekty). Dobře to funguje pokud nepoužiješ image_angle, pak se stává, že to buď klepe, nebo se to zasekne, či nesmyslně rotuje. Pokud zkusím tu budovu objed, tak se ta jednotka nesmyslně klepe. Funguje to jako standatní rts, označení levým tl. myši, pravým tl. myši je pohyb.

Ukázka projektu:
https://ulozto.cz/…arak-rts-gmz

 
Nahoru Odpovědět 20. července 11:10
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Šercl
TomBen:

Klikej odpovědi pomocí tlačítka Odpovědět, aby přicházelo oznámení a zkus trochu napravit gramatiku. Slovo objed mi krutě připomnělo, že je čas polední a bude třeba taky něco sníst. :D

Máš pravdu, že přímé natáčení image_angle záleží na pohybu a to jsem ostatně taky psal už v odpovědi. Pokud je pohyb sekaný, bude se i směr cukat. Pokud je pohyb plynulý, k cukání nedochází.

Nahoru Odpovědět 20. července 11:29
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
Odpovídá na TomBen
David Šercl:

Taky mě to bije do očí, ale když si to slovo vyskloňuji, tak si řeknu objed jako jedu okolo něčeho, ne? Mno asi jsem měl použít jiné slovo :)
Mno takže to vypadá, že dobře to funguje jen když kolidují dvě tzv. kostky vedle sebe. S rotací je to funguje dost problematicky, mno ještě si s tím nějak zaexperimentuji.

 
Nahoru Odpovědět 20. července 11:39
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Šercl
TomBen:

Občas není špatné použít vestavěné možnosti Game Makeru. Např. mp_grid.

Nahoru Odpovědět 20. července 11:44
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
TomBen
Redaktor
Avatar
TomBen:

Kdybys hledal tutoriál, tak zkus HeartBeastův:
https://www.youtube.com/watch?…

Nahoru Odpovědět 20. července 12:57
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
David Šercl:

Jojo, o něm vím, má celkem pěkně udělané tutoriály :). Už jsem to tak trochu vyřešil, sice jsem si přidělal o hodně víc práce, ale funguje to obstojně. image_angle už nevyužívám vůbec, pouze dle direction mám nadefinované 4 směry(sprite k nim přiřazené).

 
Nahoru Odpovědět 21. července 14:58
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Šercl
TomBen:

Asi sis vážně přidělal práci. S image_angle problém nebyl. I v tom tvém projektu se mi harvester otáčí správně a plynule. Jen blbě jezdí, protože funkce potencial_step kterou tam máš, často nenajde dobrou cestu.

Nahoru Odpovědět 21. července 23:29
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
TomBen
Redaktor
Avatar
TomBen:

https://www.dropbox.com/…Arak-RTS.exe?dl=0

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 21. července 23:41
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
David Šercl
Člen
Avatar
Odpovídá na TomBen
David Šercl:

Koukám, že tobě to jede v pohodě....a co jsi teda použil za příkaz? Jsem zkusil ty základní, ale s nimi mi to nefunguje (move_toward_point, mp_linear_step), a kombinaci:

STEP EVENT:
image_angle=di­rection;
END STEP EVENT:
image_angle=po­int_direction(xpre­vious,ypreviou­s,x,y);

mi taky nefungovalo.

 
Nahoru Odpovědět 22. července 12:13
Avatar
David Šercl
Člen
Avatar
David Šercl:

Už vím, mám trochu máslo na hlavě :-D . Pathfinding to vyřeší krásně. Jinak dík za rady i kritiku :-)

 
Nahoru Odpovědět 22. července 12:45
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Šercl
TomBen:

Ono jde udělat i z nespojitého pohybu plynulé otáčení tím, že se zvolí maximální velikost rotace během jednoho Stepu. Pak se objekt plynule otáčí a klidně i na místě. Většinou se používá funkce angle_difference, která vrací rozdíl v úhlech v nejkratším směru.

Kód by vypadal nějak takhle:

new_image_angle=point_direction(xprevious,yprevious,x,y);
image_angle=image_angle-(angle_difference(image_angle,new_image_angle)/10);
// kde číslo 10 dělá jemnost rotace ( čím vyšší, tím jemnější, ale taky pomalejší )
Nahoru Odpovědět 22. července 23:23
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.