[XNA / C#] Method voor springen

Status
Niet open voor verdere reacties.

Pino1990

Gebruiker
Lid geworden
5 aug 2006
Berichten
93
Hallo allemaal,

Als beginnend programmeur op t gebied van C# en XNA (heb wel al ervaring met PHP, wat er qua logica wel een beetje op lijkt), kom ik niet uit het volgende probleem. Ik ben bezig een method te schrijven waarin een object kan springen. De parameters bestaan uit de y positie (een ref) en een spring hoogte. Hieronder de code so far:
Code:
        static void jump(ref float charPosY, float jumpHeight)
        {
            //Temporary vars
            float charStartPosY = charPosY;
            float jumpStartHeight = jumpHeight;
            bool goDown = false;

            //Check if character is not going down, let the man jump!
            while (!goDown)
            {
                for (float i = 0; i <= jumpStartHeight; i++)
                {
                    charPosY -= jumpHeight;
                    jumpHeight--;
                    if (i >= jumpStartHeight)
                    {
                        //If the man finished jumping, set goDown true
                        goDown = true;
                        jumpHeight = 0;
                    }
                }
            }

            //If our man jumped high enough, let him fall down again
            if (goDown)
            {
                for (float i = 0; i <= jumpStartHeight; i++)
                {
                    charPosY += jumpHeight;
                    jumpHeight++;
                }
            }
        }

Het springen werkt als ik het "goDown" gedeelte uit zet met comments en ook het val gedeelte werkt als ik het spring gedeelde uit zet met comments. Tegelijk werkt het echter niet. Het lijkt wel of alles tegelijk wordt uitgevoerd, dus dat de twee gedeeltes elkaar weer opheffen. En dit terwijl goDown pas wordt ingeschakeld als het eerste gedeelte klaar is...

Iemand een idee?

Alvast bedankt!
 
Hoe bepaal je succes?

je mixed ook een aantal instructies die niet geheel logisch zijn. Waarom de IF in de FOR loop? die instructies kunnen prima onder de for loop.
ook is de IF voor het laatste blok onnodig, daar de while niet afloopt voordat de juiste conditie wordt bereikt.
 
Die laatste if heb ik later toegevoegd, omdat ik zo het probleem van het "tegelijk uitvoeren" wilde tackelen. Toch beweegt het object niet eerst op en dan pas weer neer. Maar ook al hoort een if niet in de for loop, of is die laatste if niet nodig, toch zou het anders moeten werken dan het nu doet... Toch?!

Succes wordt overigens bepaald als i <= jumpStartHeight in de eerste for loop. De springhoogte is dan bereikt en het object kan dan weer omlaag vallen. Als dat omlaag vallen de oude positie weer heeft bereikt (of als het een obstakel raakt, dat er later nog bijkomt) stopt het met omlaag vallen en "is de method klaar"
 
Maar je werkt die hoogte nergens bij. dus aan het einde van de routine staat de figuur gewoon weer op de grond. Ik snap dus niet dat je denkt dat het tegelijkertijd wordt uitgevoerd?

Als je een messagebox tussen de routines zet met height zul je zien dat het wel degelijk serieel wordt uitgevoerd
 
Ik dacht dat het scherm tijdens het uitvoeren van mijn method steeds weer opnieuw opgebouwd werd, omdat ik gebruik maakte van een ref. Daarom dacht ik dat het tegelijkertijd werd uitgevoerd, terwijl nu dus blijk dat de method eerst helemaal wordt uitgevoerd en dat daarna pas het scherm opnieuw wordt getekend. Daarom heb ik het nu in twee functies gesplitst, en die aangeroepen als er op een bepaalde toets wordt gedrukt. Helaas werkt t nog niet en gaat mn object nu naar beneden, ipv dat ie stil blijft staan of naar boven gaat :(

Code:
            if (keyboardState.IsKeyDown(Keys.RightShift))
            {

                if (jumpUp(ref sjefkePosition.Y, ref jumpHeight))
                    jumpDown(ref sjefkePosition.Y, jumpHeight);
            }

En daaronder:
Code:
        static bool jumpUp(ref float charPosY, ref float jumpHeight)
        {
            //Temporary vars
            float charStartPosY = charPosY;
            float jumpStartHeight = jumpHeight;
            bool goDown = false;

            //Check if character is not going down, let the man jump!
            while (!goDown)
            {
                for (float i = 0; i <= jumpStartHeight; i++)
                {
                    charPosY -= jumpHeight;
                    jumpHeight--;
                }

                //If the man finished jumping, set goDown true
                goDown = true;
            }
            jumpHeight = jumpStartHeight;

            return goDown;
        }

        static void jumpDown(ref float charPosY, float jumpHeight)
        {
            float jumpStartHeight = jumpHeight;

            //If our man jumped high enough, let him fall down again
            for (float i = 0; i <= jumpStartHeight; i++)
            {
                charPosY += jumpHeight;
                jumpHeight++;
            }
        }
 
Beide instructies worden nog steeds uitgevoerd voordat je scherm update. Indien je updates wil tijdens het uitvoeren zul je dit in de instructies mee moeten nemen. Mogelijk ook een kleine vertraging inbouwen, daar dit erg snel wordt uitgevoerd. Indien je jumpheight op exact 1 instelt, ga je dan nog steeds naar beneden?
 
Ik zou het heel anders aanpakken

Pseudocode

Vector2 characterVelocity

if (keys.space.pressed && onground)
charachtervelocity.y += jumpstrength
else
velocity.y-= gravity;

if onground
velocity.y = 0

character pos += velocity
 
Als ik de goDown method als eerste aanroep, doet ie het op zich wel, alleen is het spring effect weg haha. En hij blijft in de lucht hangen zolang ik op toets blijf drukken. Daar nog even aan sleutelen dus...
 
Probleem is opgelost:

In update:
Code:
if (keyboardState.IsKeyDown(Keys.Space))
{
    //If not already jumping, set character to jumping.
    if (!isJumping)
    {
        isJumping = True;
    }
}

if(isJumping)
{
        jump(ref sjefkePosition.Y, jumpHeight);
}

En de method:
Code:
static int jumpStep = 0;    //controls moving character through each step of jump process

static void jump(ref float charPosY, float jumpHeight)
{
    int totalSteps = 6;    //this is a "magic number" that I've chosen for the example. nothing special about it 

    //This example has the character moving up for the first half of the sequence (3 steps with this math) and then
    //moving down the other half.
    if (jumpStep < (totalSteps / 2))
    {
        charPosY = charPosY - (jumpHeight  / (totalSteps / 2));
        jumpStep++;
    }

    //This means we've gone over half the steps, so we want the character to fall back down.
    else
    {
        //This is the same principle as the up code, it just moves down instead.
        charPosY = charPosY + (jumpHeight / (totalSteps / 2));
        jumpStep++;

        //This resets our jump counter for the next jump once we've completed all of the steps.
        if (jumpStep == totalSteps)
        {
            jumpStep = 0;
            isJumping = False;
        }
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan