Obiekt niezależny, zmiana pozycji

0

Mam mały problem z aktualizacją trasy poruszania się obiektu w XNA 4.0. Problem polega na tym, że mam obiekt, który ma się poruszać w lewo i prawo o określoną odległość. Jeżeli dojdzie do miejsca X to zmienia kierunek i idzie w drugą stronę, aż nie dojdzie do drugiego punktu. Obecnie jednak gdy dojdzie do punktu zamiast zmienić kierunek na przeciwny zaczyna się krzaczyć. Tutaj wizualizacja problemu:

Obecnie zmiana kierunku jest ustawiona gdy napotka na obiekt (cegiełka w tym przypadku). Kod odpowiedzialny za poruszanie się obiektu:

private void UpdateMovement(GameTime theGameTime, List<Brick> mBrick)
        {
            foreach (Brick brick in mBrick)
            {
                if (this.CollisionBox.Intersects(brick.element.CollisionBox) == true)
                {
                    mDirection.X = MOVE_LEFT;
                }
                else
                {
                    mSpeed.X = MONSTER_SPEED;
                    mDirection.X = MOVE_RIGHT;
                }
            }

            Position += mDirection * mSpeed * (float)theGameTime.ElapsedGameTime.TotalSeconds;
        }

Widzę w kodzie, że błąd jest jak na patelni ponieważ sprawdzam czy obiekt koliduje z drugim. Jeżeli tak to zmieniam kierunek, obiekt jednak przestaje od razu kolidować i znowu zaczyna iść w prawo. Nie mogę jednak dojść do rozwiązania tego problemu.

0

Ja bym to zrobił w ten sposób:

        private void UpdateMovement(GameTime theGameTime, List<Brick> mBrick)
        {
            foreach (Brick brick in mBrick)
            {
                if (this.CollisionBox.Intersects(brick.element.CollisionBox) == true)
                {
                    if(mDirection.X = MOVE_LEFT) mDirection.X = MOVE_RIGHT;
                    else mDirection = MOVE_LEFT;
                }
            }
            Position += mDirection * mSpeed * (float)theGameTime.ElapsedGameTime.TotalSeconds;
        }

lub

        private void UpdateMovement(GameTime theGameTime, List<Brick> mBrick)
        {
            foreach (Brick brick in mBrick)
            {
                if (this.CollisionBox.Intersects(brick.element.CollisionBox) == true)
                {
                    mDirection.X = mDirection.X == MOVE_LEFT ? MOVE_RIGHT : MOVE_LEFT; 
                }
            }
            Position += mDirection * mSpeed * (float)theGameTime.ElapsedGameTime.TotalSeconds;
        }

Oba sposoby działają identycznie, tylko są inaczej zapisane - Twój wybór, którego użyjesz. Mam nadzieję, że to zadziała ;)

0

Hm. A czy do pozycji "potworka" doliczasz szerokość jego textury?

0
if (this.CollisionBox.Intersects(brick.element.CollisionBox) == true)

Po tym kawałku kodu można stwierdzić, że mniej lub więcej dolicza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1