Additions problem - Compound assignment

Diskussion i 'Frågor, support och diskussion' startad av TheSLASH, 29 dec 2011.

  1. TheSLASH

    TheSLASH Infant Droid Medlem

    Blev medlem:
    29 dec 2011
    Inlägg:
    5
    Mottagna gillanden:
    0

    MINA ENHETER

    Jag tänkte implementera så att det jag flyttar i mitt spel flyttas rätt distans oberoende av skärmens uppdateringsfrekvens, och som då även fungerar i emulatorn. Men av någon anledning så fungerar inte det nya jag lagt till, det gamla som fungerar men som inte bryr sig om tiden är bortkommenterat.

    public void animate(long elapsedTime)
    {
    // Move the missile
    /*
    mX += mLenght * Math.cos(mTargetAngle);
    mY += mLenght * Math.sin(mTargetAngle);
    */
    mMove = mLenght * (System.currentTimeMillis() - elapsedTime);

    xAdd = mMove * Math.cos(mTargetAngle);
    yAdd = mMove * Math.sin(mTargetAngle);

    mX += xAdd;
    mY += yAdd;
    }

    Det som händer är att värdet som ligger i mX och mY ersätts helt av xAdd och yAdd, den adderar alltså inte till *Add värdena till mX och mY, exempel:

    // mX = 220, mY = 100, xAdd = 3.2, yAdd = 4.7 (alla värden är double)

    mX += xAdd; // Resulterar i: mX = 3.2 och inte i 223.2 som det är tänkt
    mY += yAdd; // Resulterar i: mY = 4.7 och inte 104.7 som det är tänk

    Har testat alla varianter jag kan komma på, som mX = mX + xAdd, och även casta om alla värden, men det är uppenbarligen något jag missat, och jag är van vid C++ och C#, och vad jag förstått så är Java mer känsligt/noggrann då det gäller casting.
     
  2. Buzz

    Buzz Android Apprentice Medlem

    Blev medlem:
    14 maj 2010
    Inlägg:
    4 938
    Mottagna gillanden:
    2 228

    MINA ENHETER

    Är du säker på att mX verkligen har värdet du förväntar dig innan du blandar in xAdd? Dvs kontrollerat med utskrift, debugger eller nåt sånt.
     
  3. TheSLASH

    TheSLASH Infant Droid Medlem

    Blev medlem:
    29 dec 2011
    Inlägg:
    5
    Mottagna gillanden:
    0

    MINA ENHETER

    Jo, har testat att logga och sätta breakpoints innan dess värde ändras, så långt stämmer det, så det är de två sista raderna som inte fungerar.
     
  4. ViLANDER

    ViLANDER Senior Droid Medlem

    Blev medlem:
    12 dec 2009
    Inlägg:
    1 594
    Mottagna gillanden:
    172

    MINA ENHETER

    Den stora frågan är vad mLength gör? Gissar på att den är problemet, men jag ser även felet att du inte heller kör en "Euler-integration", på din nuvarande mX och mY vilket gör att att positionen (och spelet i övrigt) inte fungerar för olika frekvenser.

    Om man vill vara extra noggrann med just tidsaspekten och noggrannheten för din spelmotor så kan man implementera något som kräver fyra derivator för att sedan ta fram en approximerad tidsskillnad. Skillnaden blir då att accelerationen kan variera utan något större tidsfel, medan Euler-integrationen är till för statisk acceleration (exempelvis g-faktorn), och då blir det heller inget tidsfel.

    Läs mer om detta här.
     
    Last edited: 30 dec 2011
  5. gibbon

    gibbon Kid Droid Medlem

    Blev medlem:
    29 jul 2009
    Inlägg:
    59
    Mottagna gillanden:
    0

    MINA ENHETER

    Som Buzz var inne på litar jag inte riktigt på din slutsats där. Mer troligt är att felet ligger någon annanstans (sätter du mX/Y på något annat ställe?) och att du loggat lite galet.

    ViLANDER: mLength ser ut att vara en hastighet.

    Som ViLANDER även var inne på är det alltid en bra idé att köra med fix timestep. Jag tycker även att (System.currentTimeMillis() - elapsedTime) ser lite udda ut. Är elapsedTime tiden vid förra framen? Bäst vore som sagt om du gjorde något i stil med:

    tidSkillnad = tidNu - tidFörraFramen
    while(tidSkillnad>0)
    {
    foreach(dina objekt) objekt.animate(10ms)
    tidSkillnad -= 10ms
    }

    Fast du får vara mer försiktig än så såklart.. Du ska alltså inte behöva ta System.currentEtc mer än en gång innan du börjar animera/integrera.