chenxin
2020-11-16 895e6764872749a2a26415d17697b19ee2587ea9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using Core.Utilities;
using UnityEngine;
using KTGMGemClient;
 
namespace TowerDefense.Towers.Placement
{
    /// <summary>
    /// An interface for a placement area that can contain a tower
    /// </summary>
    public interface IPlacementArea
    {
        /// <summary>
        /// Gets this object's transform
        /// </summary>
        Transform transform { get; }
 
        /// <summary>
        /// 获取当前PlaceMentArea的Size.
        /// </summary>
        IntVector2 getdimsize();
 
        /// <summary>
        /// 获取一个可以放置塔防的位置.
        /// </summary>
        /// <returns></returns>
        IntVector2 getFreePos(int xdim, int ydim, bool forceGet = false);
 
 
        /// <summary>
        /// 获取对应位置的充能子弹界面指针.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        BulletUICtl GetBulletUICtl(int x, int y);
 
        /// <summary>
        /// 获取对应位置的能量条界面指针.
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        EnergyUICtl GetEnergyUICtl(int x, int y);
 
        /// <summary>
        /// 获取对应位置的水精灵充能条
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        FreezeBreath GetFreezeBreath(int x, int y);
 
        /// <summary>
        /// 是否空置的攻击位
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool isFreeAtackPos(int x, int y);
 
        /// <summary>
        /// 是否有已开启的可放置攻击位置。
        /// </summary>
        /// <returns></returns>
        bool hasFreeAttackPos();
 
        /// <summary>
        /// 是否是等待购买的攻击塔位.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool isWaitBuyGrid(int x, int y);
 
        void startCoinGenMode();
 
        /// <summary>
        /// 购买对应的待购攻击塔位.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool buyWaitBuyGrid(int x, int y);
 
        /// <summary>
        /// 设置某一个格子为已破坏塔位。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool SetDestroyedGrid(int x, int y);
 
        /// <summary>
        /// 设置格子为合成状态。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        bool SetComboGrid(int x, int y);
 
        /// <summary>
        /// 设置塔位的血条血量数据
        /// </summary>
        /// <param name="ix"></param>
        /// <param name="health"></param>
        void setTowerPosHealth(int ix, float health);
 
        /// <summary>
        /// Calculates the grid position from a given world position, offset to center for a specific size object
        /// </summary>
        IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset);
 
        /// <summary>
        /// Calculates the snapped world position from a given grid position
        /// </summary>
        Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset);
 
        /// <summary>
        /// 当前是否是反方的TowerPlacementGrid.
        /// </summary>
        bool isOpponent();
 
 
        /// <summary>
        /// Gets whether an object of a given size would fit on this grid at the given location
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        /// <returns>True if the item would fit at <paramref name="gridPos"/></returns>
        TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size);
 
        /// <summary>
        /// Occupy the given space on this placement area
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        void Occupy(IntVector2 gridPos, IntVector2 size);
 
        /// <summary>
        /// Clear the given space on this placement area
        /// </summary>
        /// <param name="gridPos">The grid location</param>
        /// <param name="size">The size of the item</param>
        void Clear(IntVector2 gridPos, IntVector2 size);
    }
 
    public static class PlacementAreaExtensions
    {
        /// <summary>
        /// Snaps a given world positionn to this grid
        /// </summary>
        public static Vector3 Snap(this IPlacementArea placementArea, Vector3 worldPosition, IntVector2 sizeOffset)
        {
            // Calculate the nearest grid location and then change that back to world space
            return placementArea.GridToWorld(placementArea.WorldToGrid(worldPosition, sizeOffset), sizeOffset);
        }
    }
}