source: 2015/27/ohjaajat/TheLegendOfGabriel/TheLegendOfGabriel/TheLegendOfGabriel/TiledTileMap.cs @ 6536

Revision 6536, 4.4 KB checked in by sieerinn, 6 years ago (diff)

The Legend of Gabriel pelin pohjaa.

Line 
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Linq;
5using System.Text;
6using Jypeli;
7using TiledSharp;
8
9
10public class TiledTileMap
11{
12    public delegate void ObjectMethod(
13        Vector position, double width, double height, Angle angle, Shape shape,
14        Dictionary<string, string> properties);
15
16    public delegate void TileMethod(Vector position, double width, double height, Image image, string layerName);
17
18    private readonly Dictionary<string, ObjectMethod> objectLegend = new Dictionary<string, ObjectMethod>();
19
20    private readonly Dictionary<string, TileMethod> tileLegend = new Dictionary<string, TileMethod>();
21
22    private readonly TmxMap level;
23
24    private Image[] tileImages;
25
26    private TiledTileMap(TmxMap tmxMap)
27    {
28        this.level = tmxMap;
29    }
30
31    public static TiledTileMap FromLevelAsset(string assetName)
32    {
33        TmxMap tmxMap = new TmxMap(string.Format("Content/{0}.tmx", assetName));
34        TiledTileMap map = new TiledTileMap(tmxMap);
35        map.LoadTileImages();
36        return map;
37    }
38
39    public void SetObjectMethod(string layerName, ObjectMethod objectMethod)
40    {
41        objectLegend[layerName] = objectMethod;
42    }
43
44    public void SetTileMethod(string layerName, TileMethod tileMethod)
45    {
46        tileLegend[layerName] = tileMethod;
47    }
48
49    public void Execute()
50    {
51        Game game = Game.Instance;
52        game.Level.Width = level.Width * level.TileWidth;
53        game.Level.Height = level.Height * level.TileHeight;
54
55        foreach (var tmxLayer in level.Layers)
56        {
57            CreateTile(tmxLayer, game);
58        }
59
60        foreach (var group in level.ObjectGroups)
61        {
62            CreateObject(group, game);
63        }
64    }
65
66    private void CreateTile(TmxLayer layer, Game game)
67    {
68        TileMethod method;
69        if (!tileLegend.TryGetValue(layer.Name, out method)) return;
70
71        double tileWidth = level.TileWidth;
72        double tileHeight = level.TileHeight;
73
74        for (int i = 0; i < layer.Tiles.Count; i++)
75        {
76            var tile = layer.Tiles[i];
77            int gid = tile.Gid;
78            if (gid == 0)
79                continue;
80
81            int tileIndex = tile.Gid - 1;
82            double realX = game.Level.Left + (tile.X * tileWidth) + (tileWidth / 2);
83            double realY = game.Level.Top - (tile.Y * tileHeight) - (tileHeight / 2);
84            method(new Vector(realX, realY), tileWidth, tileHeight, tileImages[tileIndex], layer.Name);
85        }
86    }
87
88    private void CreateObject(TmxObjectGroup group, Game game)
89    {
90        ObjectMethod method;
91        if (!objectLegend.TryGetValue(group.Name, out method)) return;
92        foreach (var obj in group.Objects)
93        {
94            Shape shape = Shape.Rectangle;
95            if (obj.ObjectType == TmxObjectGroup.TmxObjectType.Ellipse)
96                shape = Shape.Circle;
97
98            var angle = Angle.FromDegrees(-obj.Rotation);
99            var topLeft = new Vector(game.Level.Left + obj.X, game.Level.Top - obj.Y);
100            var len = Math.Sqrt(Math.Pow(obj.Width * 0.5, 2) + Math.Pow(obj.Height * 0.5, 2));
101            var positionFix = Vector.FromLengthAndAngle(len, angle + Angle.FromRadians(-Math.Atan2(obj.Height, obj.Width)));
102            method(topLeft + positionFix, obj.Width, obj.Height, angle, shape, obj.Properties);
103        }
104    }
105
106    private void LoadTileImages()
107    {
108        int tileCount = level.Tilesets.Sum(t => (t.Image.Width.Value / t.TileWidth) * (t.Image.Height.Value / t.TileHeight));
109        tileImages = new Image[tileCount];
110
111        foreach (var tileSet in level.Tilesets)
112        {
113            Image tilesetImage = Game.LoadImage(Path.GetFileNameWithoutExtension(tileSet.Image.Source));
114            int tilesW = tileSet.Image.Width.Value / tileSet.TileWidth;
115            int tilesH = tileSet.Image.Height.Value / tileSet.TileHeight;
116            for (int y = 0; y < tilesH; y++)
117            {
118                for (int x = 0; x < tilesW; x++)
119                {
120                    int index = tileSet.FirstGid + (y * tilesW + x) - 1; // Tiled uses one-based indexing for tiles.
121                    tileImages[index] = tilesetImage.Area(x * tileSet.TileWidth, y * tilesH, (x + 1) * tileSet.TileWidth,
122                        (y + 1) * tileSet.TileHeight);
123                }
124            }
125        }
126    }
127}
Note: See TracBrowser for help on using the repository browser.