Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class TileMapView : GameState
- {
- static readonly float[] ROTATIONS = {
- 0f,
- MathHelper.PiOver2,
- MathHelper.Pi,
- MathHelper.PiOver2 * 3
- };
- public static ushort MakeTileID(int x, int y, SpriteEffects m = SpriteEffects.None, int r = 0)
- {
- return (ushort)(
- (x & 63) | ((y & 63) << 6) | ((r & 3) << 12) | ((int)m << 14)
- );
- }
- public TileMapView(GameStateMachine gsm, GraphicsDevice gd, ContentManager cm) : base(gsm)
- {
- spriteBatch = new SpriteBatch(gd);
- tileset = cm.Load<Texture2D>("proto-tileset");
- width = 24;
- height = 16;
- layers = new ushort[3, width, height];
- for (int x = 0; x < width; x++)
- for (int y = 0; y < height; y++)
- {
- layers[0, x, y] = MakeTileID(5, 18);
- layers[1, x, y] = layers[2, x, y] = 0xFFF;
- }
- for (int i = 3; i < 10; i++)
- layers[0, i + 4, i] = MakeTileID(3, 25);
- for (int i = 5; i < 11; i++)
- layers[0, i + 6, i] = MakeTileID(3, 25);
- for (int i = 4; i < 9; i++)
- layers[0, i + 8, i] = MakeTileID(3, 25);
- layers[1, 7, 9] = MakeTileID(1, 0, SpriteEffects.FlipHorizontally | SpriteEffects.FlipVertically, 2);
- }
- SpriteBatch spriteBatch;
- int width, height;
- Texture2D tileset;
- ushort[,,] layers;
- public override void Draw()
- {
- DrawLayer(0);
- DrawLayer(1);
- DrawLayer(2);
- }
- void DrawLayer(int layerIndex)
- {
- spriteBatch.Begin();
- Rectangle source = new Rectangle(0, 0, 16, 16);
- Rectangle destin = new Rectangle(0, 0, 16, 16);
- int rot = 0;
- Vector2 origin = new Vector2(8, 8);
- SpriteEffects mirroring = SpriteEffects.None;
- for (int x = 0; x < width; x++)
- for (int y = 0; y < height; y++)
- {
- destin.X = x * 16;
- destin.Y = y * 16;
- source.X = (layers[layerIndex, x, y] & 63) * 16;
- source.Y = ((layers[layerIndex, x, y] >> 6) & 63) * 16;
- mirroring = (SpriteEffects)((layers[layerIndex, x, y] >> 14) & 3);
- rot = (layers[layerIndex, x, y] >> 12) & 3;
- spriteBatch.Draw(tileset, destin, source, Color.White, ROTATIONS[rot], origin, mirroring, 0);
- }
- spriteBatch.End();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement