Diskuze: MonoGame/Xna - problém s tile kolizí

C# .NET .NET (C# a Visual Basic) MonoGame/Xna - problém s tile kolizí American English version English version

Avatar
Maxx
Člen
Avatar
Maxx:

Ahoj, mám menší problém s kolizí v mé 2D tile hře v MonoGame. Po stisknutí kláves WSAD se postava normálně pohybuje a v kolizi s ostatními překážkami taky nemá problém. Co je ale problém, pokud stisknu 2 klávesy naráz vedle sebe (W,A;D,S) a zároveň koliduji. Postava se jakoby nalepí na překážku a nepohybuje se na druhou stranu, kde žádná překážka není.

Zde je můj kód:

var delta = (float)gameTime.ElapsedGameTime.TotalSeconds;
            KeyboardState keyState = Keyboard.GetState();

            bool charMoveUP, charMoveDOWN, charMoveLEFT, charMoveRIGHT, posunoutUP,posunoutDOWN,posunoutRIGHT,posunoutLEFT;
            rectFkolizeHrace = new RectangleF(poziceHrace.X, poziceHrace.Y, 32, 32);
            RectangleF updatedUP = rectFkolizeHrace; RectangleF updatedDOWN = rectFkolizeHrace; RectangleF updatedLEFT = rectFkolizeHrace; RectangleF updatedRIGHT = rectFkolizeHrace;
            charMoveUP = false; charMoveDOWN = false; charMoveLEFT = false; charMoveRIGHT = false; posunoutDOWN = true; posunoutUP = true; posunoutRIGHT = true; posunoutLEFT = true;
            #if MAC || WINDOWS
            if (keyState.IsKeyDown(Keys.S))
            {
                charMoveDOWN = true;
                updatedDOWN.Y += delta * rychlostHrace;
            }
            if (keyState.IsKeyDown(Keys.W))
            {
                charMoveUP = true;
                updatedUP.Y -= delta * rychlostHrace;
            }
            if (keyState.IsKeyDown(Keys.A))
            {
                charMoveLEFT = true;
                updatedLEFT.X -= delta * rychlostHrace;
            }
            if (keyState.IsKeyDown(Keys.D)) {
                charMoveRIGHT = true;
                updatedRIGHT.X += delta * rychlostHrace;
            }
            #endif

            foreach (RectangleF kolize in aktMAPA_listKolizi)
            {
                if (updatedDOWN.Intersects(kolize) && charMoveDOWN)
                {
                    posunoutDOWN = false;
                }
                else if (updatedUP.Intersects(kolize) && charMoveUP)
                {
                    posunoutUP = false;
                }
                if (updatedRIGHT.Intersects(kolize) && charMoveRIGHT)
                {
                    posunoutRIGHT = false;
                }
                else if (updatedLEFT.Intersects(kolize) && charMoveLEFT)
                {
                    posunoutLEFT = false;
                }
            }

            if (posunoutDOWN && charMoveDOWN)
            {
                poziceHrace.Y += rychlostHrace * delta;
            }
            if (posunoutUP && charMoveUP)
            {
                poziceHrace.Y -= rychlostHrace * delta;
            }
            if (posunoutRIGHT && charMoveRIGHT)
            {
                poziceHrace.X += rychlostHrace * delta;
            }
            if (posunoutLEFT && charMoveLEFT)
            {
                poziceHrace.X -= rychlostHrace * delta;
            }

Díky moc za pomoc, snažím se to tu už vyřešit delší dobu, ale nic nepomáhá.

 
Odpovědět 8.8.2014 23:12
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 1 zpráv z 1.