source: 2015/26/MikkoL/JRPG/JRPG/JRPG/Overworld/CollisionMap.cs @ 6415

Revision 6415, 4.4 KB checked in by mijoliim, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6
7public class CollisionMap
8{
9    public Tile[,] CollisionMapArray { get; set; }
10
11    public CollisionMap()
12        : base()
13    {
14
15    }
16
17    public CollisionMap(string CMap)
18        : base()
19    {
20        Image _CollisionMap = Game.LoadImage(CMap);
21        CollisionMapArray = new Tile[_CollisionMap.Width, _CollisionMap.Height];
22        LoadCollisionMap(CMap);
23    }
24
25    void LoadCollisionMap(string CMap)
26    {
27        ColorTileMap _CollisionMap = ColorTileMap.FromLevelAsset(CMap);
28        if (_CollisionMap.ColumnCount != CollisionMapArray.GetLength(0) || _CollisionMap.RowCount != CollisionMapArray.GetLength(1)) throw new Exception("Array's size and ColorMap's size doesn't match");
29        _CollisionMap.SetTileMethod("000000", SetWallTile);
30        _CollisionMap.SetTileMethod("ffffff", SetFloorTile);
31        _CollisionMap.SetTileMethod("0000ff", SetWaterTile);
32        _CollisionMap.SetTileMethod("00ffff", SetWalkableWaterTile);
33        _CollisionMap.SetTileMethod("0080ff", SetUnpassableWaterTile);
34        _CollisionMap.SetTileMethod("ff80ff", SetExit01);
35        _CollisionMap.SetTileMethod(Color.Transparent, SetEmptyTile);
36        _CollisionMap.ColorTolerance = 0;
37        _CollisionMap.Execute(1, 1);
38
39        CheckForEmptyTiles();
40    }
41
42    void SetEmptyTile(Vector Position, double Width, double Height)
43    {
44        Tile Empty = new Tile(TileType.Blank);
45        CollisionMapArray.SetValue(Empty, (int)Math.Floor(Position.X) + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
46    }
47
48    void SetWallTile(Vector Position, double Width, double Height)
49    {
50        Tile Wall = new Tile(TileType.Wall);
51        CollisionMapArray.SetValue(Wall, (int)Math.Floor(Position.X) + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
52    }
53    void SetFloorTile(Vector Position, double Width, double Height)
54    {
55        Tile Floor = new Tile(TileType.Floor);
56        CollisionMapArray.SetValue(Floor, (int)Math.Floor(Position.X) + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
57    }
58    void SetWaterTile(Vector Position, double Width, double Height)
59    {
60        Tile Water = new Tile(TileType.Water);
61        CollisionMapArray.SetValue(Water, (int)Math.Floor(Position.X) + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
62    }
63    void SetWalkableWaterTile(Vector Position, double Width, double Height)
64    {
65        Tile WalkableWater = new Tile(TileType.WalkableWater);
66        CollisionMapArray.SetValue(WalkableWater, (int)Math.Floor(Position.X) + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
67    }
68    void SetUnpassableWaterTile(Vector Position, double Width, double Height)
69    {
70        Tile UnpassableWater = new Tile(TileType.WaterUnpassable);
71        CollisionMapArray.SetValue(UnpassableWater, (int)Position.X + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
72    }
73    void SetExit01(Vector Position, double Width, double Height)
74    {
75        Tile Exit = new Tile(TileType.Exit);
76        Exit.ExitNum = 0;
77        CollisionMapArray.SetValue(Exit, (int)Math.Floor(Position.X) + (int)Math.Floor((double)CollisionMapArray.GetLength(0) / 2), (int)Math.Floor(Position.Y) + (int)Math.Floor((double)CollisionMapArray.GetLength(1) / 2));
78    }
79
80    void CheckForEmptyTiles()
81    {
82        if (CollisionMapArray == null) throw new NullReferenceException("Array hasn't been created yet.");
83
84        for (int ix = 0; ix < CollisionMapArray.GetLength(0); ix++)
85        {
86            for (int iy = 0; iy < CollisionMapArray.GetLength(1); iy++)
87            {
88                if (CollisionMapArray.GetValue(ix, iy) == null)
89                {
90                    Tile Blank = new Tile();
91                    CollisionMapArray.SetValue(Blank, ix, iy);
92                }
93            }
94        }
95    }
96}
Note: See TracBrowser for help on using the repository browser.