Pohyb spritu - C# XNA – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Pohyb spritu - C# XNA – .NET – Fórum – Programujte.comPohyb spritu - C# XNA – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Andus
~ Anonymní uživatel
7 příspěvků
10. 8. 2011   #1
-
0
-

Dobrý den, pracuji na jedné hře v XNA. Jedná se o vesmírnou loď která létá po vesmíru. Normálně se loď pohybuje v pořádku jak bych si představoval, ale když vložím do hry omezovač rychlosti, který má omezit maximální rychlost pod daným úhlem (jinak by mi loď šikmo mohla letět dvojnásobnou rychlostí). Loď tehdy při zatáčení okamžitě zpomaluje, což je zde nechtěné.
Zde je problematický kus kódu:

//speed = 1.0f
//angle = aktualni sklon lodi vuci ose v radianech
//acceleration = 0.001f

Vector2 move = MoveUnderAngle(angle, speed);
Vector2 maxMove = new Vector2(Math.Abs(move.X), Math.Abs(move.Y));
velocity += move * acceleration;

if (Math.Abs(velocity.X + move.X*acceleration) > maxMove.X) {
  velocity.X = (velocity.X > 0 ? maxMove.X : maxMove.X * -1);
}
if (Math.Abs(velocity.Y + move.Y * acceleration) > maxMove.Y)
{
  velocity.Y = (velocity.Y > 0 ? maxMove.Y : maxMove.Y * -1);
}
//.....
sprite.Position += velocity;

Chtěl bych, aby loď zpomalovala plynule když změní směr aby se daným směrem nepřestala při otočení ihned pohybovat. Zde přikládám ještě 2 videa s ukázkou jak se loď pohybuje s omezovačem a jak bez něj. 

Videa zde

Nahlásit jako SPAM
IP: 80.251.252.–
Reklama
Reklama
zlz
~ Anonymní uživatel
634 příspěvků
11. 8. 2011   #2
-
0
-

Nechápu, jak by šikmo mohla letět dvojnásobnou rychlostí (pokud máš MoveUnderAngle správně). Když chceš omezit rychlost, tak prostě omez tu rychlost a hotovo :)

speed += ...
if (speed > maxSpeed)
    speed = maxSpeed;

velocity += MoveUnderAngle(angle, speed);
Nahlásit jako SPAM
IP: 213.211.51.–
zlz
~ Anonymní uživatel
634 příspěvků
11. 8. 2011   #3
-
0
-

Aha, ono se to pořád přičítá, snad už jsem to pochopil správně. Tak to můžeš oříznout ještě třeba takhle.

if (velocity.Length > maxSpeed)
{
    velocity.Normalize();
    velocity *= maxSpeed;
}
Nahlásit jako SPAM
IP: 213.211.51.–
Andus
~ Anonymní uživatel
7 příspěvků
11. 8. 2011   #4
-
0
-

Jak by sis představoval ale velocity.Normalize(); a co by tady byla ta maxSpeed?

Metoda MoveUnderAngle mi vrátí posun o jeden pixel (speed == 1) pod úhlem angle a tak postupně zrychluje, ovšem když otočím loď o  180 stupňů změním tak onen angle a metoda MoveUnderAngle mi vrací hodnoty opačné a díky špatně navrženému omezovači rychlosti okamžitě v daném směru zpomalí ...

Zde kód té metody jestli to k nečemu bude:

public Vector2 MoveUnderAngle(float angle, float distance) {
float alfa = (float)((Math.PI / 180) * 90 - ((Math.PI / 180) * 180 - angle));
float y = (float)(Math.Sin(alfa) * distance);
float x = (float)(Math.Cos(alfa) * distance);
return new Vector2(x, y);
}
Nahlásit jako SPAM
IP: 80.251.252.–
zlz
~ Anonymní uživatel
634 příspěvků
11. 8. 2011   #5
-
0
-

Normalize bych si představoval tak jak je :) Jako transformaci na jednotkový vektor, tedy vektor se stejným směrem, ale délkou 1.

Nahlásit jako SPAM
IP: 213.211.51.–
Andus
~ Anonymní uživatel
7 příspěvků
14. 8. 2011   #6
-
0
-

Ok díky o Normalize() a Lenght() jsem nevěděl. A možnost překročení maximální rychlosti udělám trošku jinak.

Díky Andus

Nahlásit jako SPAM
IP: 80.251.252.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 58 hostů

Podobná vlákna

Problikávání spritů — založil Sony

XNA — založil petr143

XNA — založil Honza

Kniha o XNA — založil davous267

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý