Diskuze: Otáčení hráče

C# .NET .NET (C# a Visual Basic) Otáčení hráče American English version English version

Avatar
Lukáš Křehula
Redaktor
Avatar
Lukáš Křehula:

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
Odpovídá na Lukáš Křehula
Lukáš Hruda (Luckin):

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
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Lukáš Křehula:

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
Odpovídá na Lukáš Křehula
Lukáš Hruda (Luckin):

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
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Lukáš Křehula:

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
Odpovídá na Lukáš Křehula
Lukáš Hruda (Luckin):

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
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Lukáš Křehula:

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
Odpovídá na Lukáš Křehula
Lukáš Hruda (Luckin):

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
Lukáš Křehula
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Lukáš Křehula:

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
Odpovídá na Lukáš Křehula
Lukáš Hruda (Luckin):

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

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 2.11.2014 17:36
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.