В моем предыдущем посте я рассказывал об изучении 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, так вот результат все равно:
Теперь я могу объяснить, куда я иду с этим! Я могу нормально передвигаться по карте, столкновение работает, но когда персонаж хочет пройти между двумя столбиками (между стенами, например), он не будет работать, если один пиксель слишком много слева или справа (или вверх и вниз, в зависимости от направления):
Это потому, что скорость персонажа есть два пикселя в то время, а иногда (в основном всегда) это своего рода сложно получить его совершенно в середине, чтобы пройти через проход.
Так что мой вопрос: как я могу справиться с перемещением плеера так, чтобы он сохранял скорость, но останавливался только каждые 32 пикселя и так далее? Я пробовал так много возможностей, что это уже не смешно, я в логике застрял, я уверен, что посмотрю неправильно, бесполезно ...
Если бы кто-нибудь мог просветить меня в этой ситуации, где начать или что изменить, я бы очень признателен, также, спасибо за чтение меня!
Объект перемещается из плитки в плитку? я имею в виду, что объект перемещается (скорость * время) на каждый кадр, который вы обнаруживаете в нажатом состоянии или когда вы обнаруживаете нажатие клавиши, и объект не движется, вы запускаете анимацию от текущей плитки до следующей плитки? возможно, вы можете добавить код функции Animate ... – Gusman
Да, я думаю, вы видите мою мысль! Я бы по всему миру был похож на плитку для смещения плитки с заданной скоростью :) Код анимации был добавлен! –
С моей точки зрения, ваша анимация испорчена ... если вы хотите переместиться с A на B, вам нужен какой-то класс анимации, который имеет начальную и конечную позиции, время начала и продолжительность, если ваш объект анимируется, не запускать любые другие анимации для объекта. Тогда у меня будет список анимаций, а на этапе обновления я обновил бы анимацию, возвращающую истинное или ложное, истинное значение анимации закончено, в этом случае анимация будет перемещаться от А до В точно. И для обеспечения конечной позиции я использовал бы Lerp (начало, конец, математика.Min ((currentTime - startTime)/animationLength, 1). – Gusman