NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
David Šercl
Člen
Avatar
David Šercl:18.7.2016 15:31

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.7.2016 15:31
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:20.7.2016 10:36

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.7.2016 10:36
Nahoru Odpovědět
20.7.2016 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:20.7.2016 11:10

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.7.2016 11:10
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:20.7.2016 11:29

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.7.2016 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:20.7.2016 11:39

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.7.2016 11:39
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:20.7.2016 11:44

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

Nahoru Odpovědět
20.7.2016 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
Tvůrce
Avatar
TomBen:20.7.2016 12:57

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

Nahoru Odpovědět
20.7.2016 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:21.7.2016 14:58

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.7.2016 14:58
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:21.7.2016 23:29

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.7.2016 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
Tvůrce
Avatar
TomBen:21.7.2016 23:41

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

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
21.7.2016 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:22.7.2016 12:13

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.7.2016 12:13
Avatar
David Šercl
Člen
Avatar
David Šercl:22.7.2016 12:45

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.7.2016 12:45
Avatar
TomBen
Tvůrce
Avatar
Odpovídá na David Šercl
TomBen:22.7.2016 23:23

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.7.2016 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.