Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lukáš Křehula:1.11.2014 16:32

Ahoj,
chci si vytvořit hru. Hru už mám rozvrženou, ale potřeboval bych pomoct s otáčením hráče. Bude se jednat o 2D střílečku, kde hráč bude vypadat jako trojúhelník.
Potřeboval bych poradit s otáčením. Jelikož ho budu vykreslovat přes Polygon, tak nevím jak udělat, aby se otáčel za kurzorem myši. Je to spíš matematická otázka, takže za jakýkoliv návod/nápad jak na to budu vděčný.

Přikládám obrázek.
Černá = hráč (ten se bude otáčet za kurzorem)
Červená = kurzor myši
zelená = směr střely

Díky, kaczmi.

 
Odpovědět
1.11.2014 16:32
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Lukáš Hruda:1.11.2014 17:01

Udělej vektor od středu spodní hrany trojúhelníku ke kurzoru myši. Zkrať ho na vzdálenost od středu spodní strany k projetějšímu vrcholu a máš polohu tohoto vrcholu. Dále udělej kolmý vektor a zkrať ho na polovinu délky spodní hrany a máš polohu jednoho ze spodních dvou vrcholů. Obrať orientaci posledního vektoru a máš polohu druhého spodního bodu.

 
Nahoru Odpovědět
1.11.2014 17:01
Avatar
Odpovídá na Lukáš Hruda
Lukáš Křehula:1.11.2014 17:29

Ahoj,
díky za rychlou a srozumitelnou odpověď. Bohužel nevím, jak mám ten úplně první vektor od středu spodní strany zkrátit, nevím jak dostat ty souřadnice. Mohl bys mi ještě poradit?
Díky..

 
Nahoru Odpovědět
1.11.2014 17:29
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Lukáš Hruda:1.11.2014 18:08

Vektor zkrátíš tak, že ho vydělíš jeho délkou, tím dostaneš jednotkový vektor (tedy vektor s délkou 1). Pak ho jenom vynásobíš tou délkou, kterou chceš aby měl.

 
Nahoru Odpovědět
1.11.2014 18:08
Avatar
Odpovídá na Lukáš Hruda
Lukáš Křehula:1.11.2014 20:08

Hmm, nějak mi to nejde. Mohl bys mi to ukázat, když mám bod A (hráč/střed spodní strany) a bod B (kurzor)?

Editováno 1.11.2014 20:10
 
Nahoru Odpovědět
1.11.2014 20:08
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Lukáš Hruda:2.11.2014 12:52

První vektor bude u = (Bx - Ax, By - Ay)
Pokud vzdálenost od středu spodní strany k protějšímu vrcholu je d, pak druhý vektor bude v = ((ux / |u|) * d, (uy / |u|) * d)
Pokud délka spodní strany je k, pak třetí vektor bude w = ((-uy / |u|) * (k / 2), (ux / |u|) * (k / 2))
Poslední vektor bude z = (-wx, -wy)
Souřadnice bodů trojúhelníku pak budou:
[vx + Ax, vy + Ay], [wx + Ax, wy + Ay], [zx + Ax, zy + Ay]

 
Nahoru Odpovědět
2.11.2014 12:52
Avatar
Odpovídá na Lukáš Hruda
Lukáš Křehula:2.11.2014 15:10

Tvoje řešení mi otáčí ten trojúhelník pouze do čtyř směrů (doleva, doprava, nahoru a dolů), jinak mizí.

Tohle je jen můj "náčrt" kódu, abych se přesvědčil, jestli to funguje:

private void pbVykreslovaciPlatno_Paint(object sender, PaintEventArgs e)
{
    Point A = new Point(pbVykreslovaciPlatno.Width / 2, pbVykreslovaciPlatno.Height / 2);
    Point B = new Point(x, y);

    Point U = new Point(B.X - A.X, B.Y - A.Y);
    double u = Math.Sqrt(Math.Pow(U.X, 2) + Math.Pow(U.Y, 2));
    Point v = new Point((U.X / (int)(u)) * 50, (U.Y / (int)(u)) * 50);
    Point w = new Point((-U.Y / (int)(u)) * 25, (-U.X / (int)(u)) * 25);
    Point z = new Point(-w.X, -w.Y);

    Point pt1 = new Point(v.X + A.X, v.Y + A.Y);
    Point pt2 = new Point(w.X + A.X, w.Y + A.Y);
    Point pt3 = new Point(z.X + A.X, z.Y + A.Y);

    Point[] hrac = {
                       pt1,
                       pt2,
                       pt3
                   };

    e.Graphics.DrawPolygon(new Pen(Color.Black), hrac);
}

Netuším, co mám špatně o_O

 
Nahoru Odpovědět
2.11.2014 15:10
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Lukáš Hruda:2.11.2014 16:46

Troufnu si odhadnout, že chyba bude v celočíselném dělení, prováděj všechny výpočty v doublech nebo floatech. Dej pryč tu konverzi na int.

 
Nahoru Odpovědět
2.11.2014 16:46
Avatar
Odpovídá na Lukáš Hruda
Lukáš Křehula:2.11.2014 17:10

Máš pravdu, moje blbost :[
Opravil jsem to na toto:

Point A = new Point(pbVykreslovaciPlatno.Width / 2, pbVykreslovaciPlatno.Height / 2);
Point B = new Point(x, y);

Point U = new Point(B.X - A.X, B.Y - A.Y);
double u = Math.Sqrt(Math.Pow(U.X, 2) + Math.Pow(U.Y, 2));
double vX = (U.X / u) * 50; double vY = (U.Y / u) * 50;
Point v = new Point((int)(vX), (int)(vY));
double wX = (-U.Y / u) * 25; double wY = (-U.X / (u)) * 25;
Point w = new Point((int)(wX),(int)(wY));
Point z = new Point(-w.X, -w.Y);

Point pt1 = new Point(v.X + A.X, v.Y + A.Y);
Point pt2 = new Point(w.X + A.X, w.Y + A.Y);
Point pt3 = new Point(z.X + A.X, z.Y + A.Y);

Point[] hrac = {
                   pt1,
                   pt2,
                   pt3
               };

e.Graphics.DrawPolygon(new Pen(Color.Black), hrac);

Problém je ale, že ten trojúhelník mění svůj tvar
Raději přikládám obrázky:

 
Nahoru Odpovědět
2.11.2014 17:10
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Lukáš Hruda:2.11.2014 17:36

U vektoru w je mínus pouze u jedné souřadnice, ty ho máš u obou.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
2.11.2014 17:36
Avatar
Odpovídá na Lukáš Hruda
Lukáš Křehula:2.11.2014 17:39

Jsi bůh, díky moc 8-)

 
Nahoru Odpovědět
2.11.2014 17:39
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Lukáš Křehula
Lukáš Hruda:2.11.2014 17:40

Nemáš zač.

 
Nahoru Odpovědět
2.11.2014 17:40
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 12 zpráv z 12.