2016-05-03 6 views
0

В моем предыдущем посте я рассказывал об изучении C# с библиотекой XNA в свое свободное время, это всегда так; Тем не менее, я долго задерживался на чем-то, что у меня есть, чтобы понять логику!Перемещение персонажа в соответствии с плитами

Вот резюме текущей ситуации, на самом деле мой персонаж перемещается 2 за 2 пикселя, это значение сохраняется в переменной я назвал «скорость» в Player.cs:

private Texture2D texture; 
private Vector2 position, previousPosition; 
private Rectangle sourceRect; 
private KeyboardState currentInput, previousInput; 

private int currentFrame = 0, frameLine = 0; 
private float speed = 2f, elapsedTime, animationTime = 128f; 

(Мои Входы ZQSD для Azerty Клавиатуры, кстати, D)

public void Update(GameTime gameTime) 
{ 
    currentInput = Keyboard.GetState(); 

    if (currentInput.IsKeyDown(Keys.Z)) 
    { 
     if (!Map.isColliding(position.X, position.Y - speed)) 
      position.Y -= speed; 

     this.Animate(gameTime, 3); 
    } 
    else if (currentInput.IsKeyDown(Keys.Q)) 
    { 
     if (!Map.isColliding(position.X - speed, position.Y)) 
      position.X -= speed; 

     this.Animate(gameTime, 1); 
    } 
    else 
     sourceRect = new Rectangle(32, (32 * frameLine), 32, 32); 

    previousInput = currentInput; 
} 

public void Animate(GameTime gameTime, int m_frameLine) 
{ 
    elapsedTime += (float)gameTime.ElapsedGameTime.TotalMilliseconds; 
    frameLine = m_frameLine; 

    if (elapsedTime > animationTime) 
    { 
     if (currentFrame >= 2) 
      currentFrame = 0; 
     else 
      currentFrame++; 

     elapsedTime = 0; 
    } 

    sourceRect = new Rectangle((32 * currentFrame), (32 * frameLine), 32, 32); 
} 

Map.cs строит всю карту с набором плитки, конечно, так как мне было трудно выяснить, «хороший» журнал IC, я наблюдал обучающие программы на YouTube, так вот результат все равно:

MAP PREVIEW

Теперь я могу объяснить, куда я иду с этим! Я могу нормально передвигаться по карте, столкновение работает, но когда персонаж хочет пройти между двумя столбиками (между стенами, например), он не будет работать, если один пиксель слишком много слева или справа (или вверх и вниз, в зависимости от направления):

Это потому, что скорость персонажа есть два пикселя в то время, а иногда (в основном всегда) это своего рода сложно получить его совершенно в середине, чтобы пройти через проход.

Так что мой вопрос: как я могу справиться с перемещением плеера так, чтобы он сохранял скорость, но останавливался только каждые 32 пикселя и так далее? Я пробовал так много возможностей, что это уже не смешно, я в логике застрял, я уверен, что посмотрю неправильно, бесполезно ...

Если бы кто-нибудь мог просветить меня в этой ситуации, где начать или что изменить, я бы очень признателен, также, спасибо за чтение меня!

+0

Объект перемещается из плитки в плитку? я имею в виду, что объект перемещается (скорость * время) на каждый кадр, который вы обнаруживаете в нажатом состоянии или когда вы обнаруживаете нажатие клавиши, и объект не движется, вы запускаете анимацию от текущей плитки до следующей плитки? возможно, вы можете добавить код функции Animate ... – Gusman

+0

Да, я думаю, вы видите мою мысль! Я бы по всему миру был похож на плитку для смещения плитки с заданной скоростью :) Код анимации был добавлен! –

+0

С моей точки зрения, ваша анимация испорчена ... если вы хотите переместиться с A на B, вам нужен какой-то класс анимации, который имеет начальную и конечную позиции, время начала и продолжительность, если ваш объект анимируется, не запускать любые другие анимации для объекта. Тогда у меня будет список анимаций, а на этапе обновления я обновил бы анимацию, возвращающую истинное или ложное, истинное значение анимации закончено, в этом случае анимация будет перемещаться от А до В точно. И для обеспечения конечной позиции я использовал бы Lerp (начало, конец, математика.Min ((currentTime - startTime)/animationLength, 1). – Gusman

ответ

1

Если я правильно понимаю ваш вопрос, вы должны рассчитать свою назначенную будущую позицию на основе фактического положения вашего плеера, а затем перейти к своей будущей позиции. Иными словами: у вашего игрока есть позиция, хранящаяся в Vector2. Поэтому вам нужно рассчитать свою следующую позицию в зависимости от того, куда вы хотите переместиться. Итак, если вы хотите переместиться вправо, вычислите actual_position + new Vector2 (32,0), для левой вам нужно actual_position + new Vector2 (-32,0), для top actual_position + new Vector2 (0,32), для бота actual_position + новый вектор2 (0, -32). Затем просто примените скорость, и если игрок достигнет расчетного вектора, просто прекратите движение

+0

Да, я вижу вашу мысль! Спасибо, я попытаюсь это сделать, и о моем вопросе, как я сказал в комментариях выше, я хотел бы иметь черепицу смещения с определенной скоростью, поскольку английский не является моим основным языком, я стараюсь быть точным, насколько я могу:] –