Avatar billede plugin- Nybegynder
05. juni 2005 - 01:11 Der er 9 kommentarer og
1 løsning

Kassen står ikke stille

Hej eksperter.
Jeg har de sidste mange nætter siddet og arbejdet med mit første c# program. Her har jeg fået lavet nogle små kasser som jeg så kan vælge ved at klikke på dem, hvorefter jeg trykker et andet sted på min form, som den valgte kasse så bevæger sig hen til.

Problemet er bare at det er rent tilfældigt om kassen står helt stille når den når hen til slutpunktet, eller om den står og "danser" - går en smule frem og tilbage... koden for bevægelsen af kassen ser ud som følger:

(loopes)

if(this.wantedX!=this.X || this.wantedY!=this.Y)
                {
                   
                    if(this.wantedX > this.X)
                    {
                        PlayerSpriteState = PlayerSpriteStates.Right;
                        this.X = this.X+1;
                    }
                    else
                    {
                        PlayerSpriteState = PlayerSpriteStates.Left;
                        this.X = this.X-1;
                    }
                    if(this.wantedY > this.Y)
                    {
                        if(this.wantedX == this.X)
                        {
                            PlayerSpriteState = PlayerSpriteStates.Down;
                        }
                        this.Y = this.Y+1;
                    }
                    else
                    {
                        if(this.wantedX == this.X)
                        {
                        PlayerSpriteState = PlayerSpriteStates.Up;
                        }
                        this.Y = this.Y-1;
                    }
                }
                else
                {
                    PlayerSpriteState = PlayerSpriteStates.Idle;
                    this.X = this.wantedX;
                    this.Y = this.wantedY;
                }

Her er this.X/Y kassens nuværende position, mens wantedX/Y er den position kassen søger hen imod.

wantedX/Y bliver tildelt på følgende måde:

Point location = PointToClient(MousePosition);

sprites[selectedBox].wantedX = location.X-sprites[selectedBox].Width/2;
                sprites[selectedBox].wantedY = location.Y-sprites[selectedBox].Width/2;

For mig lugter det lidt af at der er tale om noget med at kassens bevægelse bliver lavet ved at lægger 1 til kassens position, men at wantedX/Y godt kan være et tal med nogle decimaler bagpå... og derved vil this.X/Y aldrig blive det samme som this.wantedX/Y, derfor står den og hopper hele tiden... Jeg har prøvet at løse dette gennem konvertering af variable typer og nogle if-sætninger, men intet virker... Har I nogen forslag til hvordan dette kan løses?

NB! Er der brug for mere kode så poster jeg gerne...
Avatar billede roenving Novice
05. juni 2005 - 04:51 #1
Kan du ikke kaste en label på din form, så du kan se hvilke værdier, der aktuelt findes, for jeg ville også gætte på, at det havde noget med størrelserne på værdierne at gøre !-)
Avatar billede nielle Nybegynder
05. juni 2005 - 06:55 #2
Nej, du har næppe decimaler på din .X og .Y. Du styre jo trods alt selv data-typen, og hvis det er en Point så er det heltalskoordinater (PointF bruger float).

Dit problem består i din første if:

if (this.wantedX!=this.X || this.wantedY!=this.Y)

Denne kommer du ind i hvis blot en af dine koordinater er forskellig fra deres wanted-version. Den anden koordinat kan derimod sagtens være lig med sin wanted-version. Alligevel vil den så efterfølgende blive justeret væk fra wanted-versionen af den tilhørende if-sætning længere nede.

Prøv i stedet med noget i stil med:

if (this.wantedX != this.X || this.wantedY != this.Y)
{
    if (this.wantedX != this.X)
    {
        if (this.wantedX > this.X)
        {
            PlayerSpriteState = PlayerSpriteStates.Right;
            this.X++;
        }
        else
        {
            PlayerSpriteState = PlayerSpriteStates.Left;
            this.X--;
        }
    }

    if (this.wantedY != this.Y)
    {
        if (this.wantedY > this.Y)
        {
            if (this.wantedX == this.X)
                PlayerSpriteState = PlayerSpriteStates.Down;

            this.Y++;;
        }
        else
        {
            if (this.wantedX == this.X)
                PlayerSpriteState = PlayerSpriteStates.Up;

            this.Y--;
        }
    }
}
else
    PlayerSpriteState = PlayerSpriteStates.Idle;
Avatar billede roenving Novice
05. juni 2005 - 07:08 #3
Sæ'fø'li' !-)

-- men jeg ville så nok bruge en logik, som var mere simpel, f.eks.

if (this.wantedX != this.X)
{
    if (this.wantedX > this.X)
    {
        PlayerSpriteState = PlayerSpriteStates.Right;
        this.X++;
    }
    else
    {
        PlayerSpriteState = PlayerSpriteStates.Left;
        this.X--;
    }
}
else if(this.wantedY != this.Y)
{
    if (this.wantedY > this.Y)
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Down;
        this.Y++;;
    }
    else
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Up;
        this.Y--;
    }
}
else
    PlayerSpriteState = PlayerSpriteStates.Idle;
Avatar billede nielle Nybegynder
05. juni 2005 - 07:35 #4
roenving> Njaa, men så får du jo ikke justeret this.Y før at this.X er blevet lig wantedX - dvs. at spriten går vandret et stykke vej, og først derefter lodret. I den oprindelige kode går den skrå.

Jeg kan nu sagtens sætte mig ind i ønsket om en mere simpel kode:


PlayerSpriteState = PlayerSpriteStates.Idle;

if (this.wantedX != this.X)
{
        if (this.wantedX > this.X)
    {
        PlayerSpriteState = PlayerSpriteStates.Right;
        this.X++;
    }
    else
    {
        PlayerSpriteState = PlayerSpriteStates.Left;
        this.X--;
    }
}

if (this.wantedY != this.Y)
{
    if (this.wantedY > this.Y)
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Down;

        this.Y++;;
    }
    else
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Up;

        this.Y--;
    }
}
Avatar billede roenving Novice
05. juni 2005 - 07:38 #5
Yups !-)
Avatar billede plugin- Nybegynder
05. juni 2005 - 11:12 #6
Jamen................. DET VIRKER!! :D Rart at man kan komme herind og blive sat på plads når man har set sig blind på et problem. Jeg kan sagtens se problemet nu hvor du gør mig opmærksom på det.

Jeg har dog lige et lille spørgsmål. Hvorfor har det nogen indflydelse om man skriver if-sætningerne i dette stykke uden { } ?:

if (this.wantedY != this.Y)
{
    if (this.wantedY > this.Y)
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Down;

        this.Y++;;
    }
    else
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Up;

        this.Y--;
    }
}

Når jeg smider { } ind bevæger spriten sig først af X og derefter af Y, istedet for at gøre begge dele på engang (gå skråt). - Og så smid lige et svar nielle, mange tak for hjælpen ;)
Avatar billede plugin- Nybegynder
05. juni 2005 - 11:13 #7
Og tak for dit bidrag roenving.. det er dog ikke nok til points denne gang.
Avatar billede nielle Nybegynder
05. juni 2005 - 11:53 #8
Hvis en kodeblok består af en enkelt linje kan man udelade tuborg hvis man vil.

Det kan imidlertid være nødvendigt at have dem, når man begynder at blande en else ind i billeder, idet der så ville kunne opstå tvivl om hvilken if denne tilhøre. Og det er vist netop det som sker for dig:

Din kode – med tuborg:

if (this.wantedY != this.Y)
{
    if (this.wantedY > this.Y)  // [if-2]
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Down;

        this.Y++;;
    }
    else  // Hører sammen med [if-2]
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Up;

        this.Y--;
    }
}

Din kode – uden tuborg:

if (this.wantedY != this.Y)  // [if-1]
    if (this.wantedY > this.Y)
    {
        if (this.wantedX == this.X)
            PlayerSpriteState = PlayerSpriteStates.Down;

        this.Y++;;
    }
else  // Hører sammen med [if-1]
{
    if (this.wantedX == this.X)
        PlayerSpriteState = PlayerSpriteStates.Up;
            this.Y--;
}
Avatar billede nielle Nybegynder
05. juni 2005 - 11:54 #9
Og et svar. :^)
Avatar billede plugin- Nybegynder
05. juni 2005 - 11:57 #10
ahhh.. forstået og modtaget ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester