У меня проблемы с довольно простой платформерской игрой, которую я пытаюсь сделать. Я пытаюсь написать код столкновения, чтобы игрок мог приземлиться на отдельных случайных платформах, которые поступают из списка, но, несмотря на различные вещи, которые я пробовал, булево значение, которое я использую, чтобы контролировать, испытывает ли персонаж гравитацию или нет не достигает значения false, когда персонаж сходит с платформы, поэтому он может парить в воздухе в любом направлении. Они также погружаются в платформу, но я хотел бы заставить их стоять на вершине.
Класс игрока принимает вектор позиции, вектор скорости, строку направления и логическое значение для определения того, находится ли он в качестве параметров. Код в методе обновления выглядит следующим образом, но я также добавлю код, который определяет, находится ли объект сверху.
character.position += character.velocity;
if (character.landed == false)
character.velocity.Y = character.velocity.Y + 0.15f;
else character.velocity.Y = 0;
foreach (Platform p in Platforms)
{
for (int i = 0; i < p.size; i++)
{
if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
|| (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true))
{
character.landed = true;
}
if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
&& character.position.X + 3f > p.xPos + (32*p.size)
|| (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
&& character.position.X -3f < p.xPos)
{
character.landed = false;
}
}
}
if (InputHandler.KeyPressed(Keys.Left))
{
character.velocity.X = -3f;
character.direction = "Left";
}
if (InputHandler.KeyPressed(Keys.Right))
{
character.velocity.X = +3f;
character.direction = "Right";
}
if ((InputHandler.KeyPressed(Keys.Space) || InputHandler.KeyPressed(Keys.W)) && character.landed == true)
{
character.position.Y = character.position.Y - 10f;
character.velocity.Y = -7.5f;
character.landed = false;
}
if (character.position.Y > 3000)
{
GameRef.Exit();
}
}
Логическое столкновение выглядит следующим образом:
public bool isOnTopOf(Vector2 item1Position, Texture2D item1Sprite, Vector2 item2Position, Texture2D item2Sprite)
{
area1.X = (int)item1Position.X;
area1.Y = (int)item1Position.Y;
area2.X = (int)item2Position.X;
area2.Y = (int)item2Position.Y;
area1.Width = item1Sprite.Width;
area1.Height = item1Sprite.Height;
area2.Width = item2Sprite.Width;
area2.Height = item2Sprite.Height;
return (area1.Bottom >= area2.Top - 3 && area1.Bottom <= area2.Top + 3 && area1.Right >= area2.Left - 3
&& area1.Left <= area2.Right + 3);
}
Я бы очень признателен за любую помощь, которая не потребует от меня удаления всего кода, который я сделал до сих пор, но позволит мне немного адаптировать его. Я ограничен во времени ... Кроме того, следующий код (включенный в 1-й сегмент кода) был частью, которую я добавил, чтобы не дать персонажу уйти с платформы, который по какой-то причине не вернул true.
if ((isOnTopOf(character.position, charRSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
&& character.position.X + 3f > p.xPos + (32*p.size)
|| (isOnTopOf(character.position, charLSprite, new Vector2(p.xPos + (32 * i), p.yPos), grassBlock) == true)
&& character.position.X -3f < p.xPos)
{
character.landed = false;
}