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!

Diskuze: Xamarin - Blbne zatáčení doleva

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Šťastný
Tvůrce
Avatar
Petr Šťastný:30.9.2017 9:32

Zdravím, mám problém s kódem v C#. Dělám hru v Xamarinu (android), ale androidu se to netýká, potřebuji poradit s čistým C#. Zatím zkouším jenom vykreslovat, v androidu začínám. Ale mám problém s tím, že auto nemůže zatočit doleva. Může rotovat doleva, ale nezatočí tam. Tady je gif, je tam vidět, co myslím.

Tady jsou dvě metody, ve kterých by měla být chyba. Vůbec netuším, co s tím.

private void MoveCar(Car car, bool touchRight, bool touchLeft)
{
    // Rotate car
    if (touchRight)
        car.angle += angleChangePerTick;
    if (touchLeft)
        car.angle -= angleChangePerTick;

    // Move car
    // TODO: collisions
    float[] f = getVelocitiesFromAngle(car.angle, car.acceleration);
    if (Math.Sqrt(Math.Pow(car.velocityX + f[0], 2) + Math.Pow(car.velocityY + f[1], 2)) > car.maxVelocity)
    {
        float accelerationRemaining = car.maxVelocity - (float)Math.Sqrt(Math.Pow(car.velocityX, 2) + Math.Pow(car.velocityY, 2));
        if (accelerationRemaining > 0)
        {
            f = getVelocitiesFromAngle(car.angle, accelerationRemaining);
        }
        else
            f = new float[] { 0, 0 };
    }

    car.velocityX = f[0];
    car.velocityY = f[1];
    car.x += car.velocityX;
    car.y += car.velocityY;
}
private float[] getVelocitiesFromAngle(float angle, float velocity)
{
    while (angle < 0)
        angle += 360;
    while (angle >= 360)
        angle -= 360;
    if (angle == 0)
    {
        return new float[] { -velocity, 0 };
    }
    else if (angle < 90)
    {
        float velX = (angle / 90) * velocity;
        return new float[] { -(velocity - velX), -velX };
    }
    else if (angle == 90)
    {
        return new float[] { 0, -velocity };
    }
    else if (angle < 180)
    {
        float velX = ((angle - 90) / 90) * velocity;
        return new float[] { velX, -(velocity - velX) };
    }
    else if (angle == 180)
    {
        return new float[] { velocity, 0 };
    }
    else if (angle < 270)
    {
        float velX = ((angle - 180) / 90) * velocity;
        return new float[] { velocity - velX, velX };
    }
    else if (angle == 270)
    {
        return new float[] { 0, velocity };
    }
    else if (angle < 360)
    {
        float velX = ((angle - 270) / 90) * velocity;
        return new float[] { -velX, velocity - velX };
    }
    else
        return new float[0];
}

Díky, Petr

 
Odpovědět
30.9.2017 9:32
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Petr Šťastný
Petr Šťastný:30.9.2017 22:09

Tak jsem našel příčinu, ale pořád nevím, jak to mám opravit.

Mám tam nějaký omezovač rychlosti, aby to auto nejelo příliš rychle. Ten vypočítávám tak, že vezmu délku z rychlostí po osách X a Y (přes pythagorovu větu) a to auto nenechám zrychlit tak moc, aby překročilo tuto rychlost.

Ten problém je, že když se stane, že auto rotuje ale nezatáčí (v gifu co jsem sem posílal to je vidět), je rychlost tak blízká maximální, že nová rychlost je třeba jenom (něco)x10−6. Po chvíili se to spraví a už to funguje normálně (to nevím proč).

Taky bych rád řekl, že zatáčení doleva funguje, ale když uživatel zatáčí třeba doprava a chce začít zatáčet doleva, musí se orotovat o asi 180° a až potom to funguje. To samé, když chce uživatel najednou změnit směr zatáčení zleva doprava.

Zkoušel jsem vymyslet nějaký jiný omezovač rychlosti, ale vždy to vypadalo strašně divně, někdy auto jelo rychle, někdy pomalu, někdy se nemohlo vůbec hýbat, nebylo to použitelné.

 
Nahoru Odpovědět
30.9.2017 22:09
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 2 zpráv z 2.