缩小玩家坐标,使其适合二维数组以进行碰撞
Downscaling player coords so they fit in 2d array for collision
我马上开始我已经使用纹理列表和二维数组创建了一张地图,我已经绘制了玩家和运动,现在我正在尝试使用我的玩家坐标来访问一个位置数组以检查它是否具有特定的图块,以及它是否会使我的玩家返回到他之前的位置并产生某种碰撞。
但是我遇到的问题是,当我将我的播放器坐标转换为数组时,它要么超出范围,要么对于实际数组来说太高了我需要以某种方式缩小我的坐标,以便它们对数组准确.
这是我绘制瓷砖的方式
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;
}
最后是我的播放器更新
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;
}
您似乎试图通过玩家位置访问您的二维数组。
你的图块是 60x60px,所以如果你的玩家在坐标上:x=30; y=40 例如,
它应该在第一个图块 [0,0] 中,因为它们都 < 60.
在这里你尝试向你的数组询问索引 [30,40],这是越界的,但正确的图块编号是你的 position / tileSize.
所以,
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;
}
变成:
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 / tiles.tileWidth, y / tiles.tileHeight] == 1) return true;
else return false;
}
我马上开始我已经使用纹理列表和二维数组创建了一张地图,我已经绘制了玩家和运动,现在我正在尝试使用我的玩家坐标来访问一个位置数组以检查它是否具有特定的图块,以及它是否会使我的玩家返回到他之前的位置并产生某种碰撞。
但是我遇到的问题是,当我将我的播放器坐标转换为数组时,它要么超出范围,要么对于实际数组来说太高了我需要以某种方式缩小我的坐标,以便它们对数组准确.
这是我绘制瓷砖的方式
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;
}
最后是我的播放器更新
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;
}
您似乎试图通过玩家位置访问您的二维数组。 你的图块是 60x60px,所以如果你的玩家在坐标上:x=30; y=40 例如, 它应该在第一个图块 [0,0] 中,因为它们都 < 60.
在这里你尝试向你的数组询问索引 [30,40],这是越界的,但正确的图块编号是你的 position / tileSize.
所以,
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;
}
变成:
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 / tiles.tileWidth, y / tiles.tileHeight] == 1) return true;
else return false;
}