Я заберусь прямо в него. Я создал карту, используя список текстур и 2D-массив, я нарисовал игрока и движение, и теперь я пытаюсь используйте мои консоли игроков, чтобы получить доступ к местоположению в массиве, чтобы проверить, имеет ли он конкретную плитку, и если это произойдет, чтобы заставить моего игрока вернуться к своему ранее местоположению, давая своего рода столкновение.Уменьшение размеров игровых консолей, чтобы они вписывались в массив 2d для столкновения
Однако проблема заключается в том, что когда я конвертирую свои игровые комбинации в массив, он либо выходит за границы, либо слишком высок для реального массива. Мне почему-то нужно понизить мои координаты, чтобы они были точны для массива.
Вот как я нарисовал мои плитки
int tileWidth = 60;
int tileHeight = 60;
List<Texture2D> tileTextures = new List<Texture2D>();
public int[,] Map = new int[,]
{
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
};
public void Draw(SpriteBatch spriteBatch)
{
int tileMapWidth = Map.GetLength(1);
int tileMapHeight = Map.GetLength(0);
for (int x = 0; x < tileMapWidth; x++)
{
for (int y = 0; y < tileMapHeight; y++)
{
int textureIndex = Map[y, x];
Texture2D texture = tileTextures[textureIndex];
spriteBatch.Draw(
texture,
source = new Rectangle(x *myTile.Width,
y * myTile.Height,
tileWidth,
tileHeight),
Color.White);
}
}
}
Вот мой игрок движение
public void input(GameTime gameTime)
{
KeyboardState ks = Keyboard.GetState();
Vector2 motion = Vector2.Zero;
if (ks.IsKeyDown(Keys.W))
motion.Y--;
if (ks.IsKeyDown(Keys.S))
motion.Y++;
if (ks.IsKeyDown(Keys.D))
{
currentAnim = rightWalk;
Animate(gameTime);
motion.X++;
}
if (ks.IsKeyDown(Keys.A))
{
currentAnim = leftWalk;
Animate(gameTime);
motion.X--;
}
if (motion != Vector2.Zero)
motion.Normalize();
position += motion * speed;
}
И, наконец, мой игрок Update
public void Update(GameTime gameTime)
{
prevPosition = position;
input(gameTime);
if(CollidesWithWall((int)position.X, (int)position.Y))
{
position = prevPosition;
}
}
и моя CollidingWithWall функция
public bool CollidesWithWall(int x, int y)
{
if (x < 0 || x > (15) -1) return true;
if (y < 0 || y > (7) -1) return true;
if (tiles.Map[x, y] == 1) return true;
else return false;
}
Я дал ему эту функцию в своем последнем вопросе, и я не видел эту ошибку. +1 для просмотра этого @Vernier – Monset
Я также хотел бы напомнить @Spoingen, чтобы одобрить ваш ответ в этом вопросе, и мой в его последнем вопросе – Monset
Спасибо, хороший сэр, и мне просто жаль, что было поздно, до сих пор. – Spoingen