我目前正在创建一个数据库来存储像Clash Of Clans / Pokemon Go这样的游戏中生成的树。我创建了以下表格:
Trees (tree_id PK, type_id FK, loc_lat, loc_lng);
Tree_Types (tree_type_id PK, name);
Users (user_id PK, loc_lat, loc_lng, visability_radius)
我使用PHP作为API来为我正在创建的游戏提供服务。我需要在用户表中存储的设定半径内随机定位玩家周围的GPS位置(纬度/经度)。我创建了以下查询以将树添加到数据库中:
INSERT INTO Trees (loc_lat, loc_lng, type_id) SELECT ? AS loc_lat, ? as loc_lng, type_id FROM Tree_Types ORDER BY RAND() LIMIT 1;
但是,考虑到这一点,因为我需要在游戏过程中稍后添加更多树类型,我需要在区域中重新生成树以添加新添加的树类型。但我宁愿用一种记录树木生成位置的方法,以及是否添加了树木类型来生成它们。
我想添加的一种方法是存储lat,lngs和radius,以形成一个产生树木的圆形区域。以下是表结构的示例:
Circle (circle_id PK, loc_lat, loc_lng, radius)
Circle_Spawned_Trees (id PK, circle_id FK, tree_type_id FK)
这将允许在现有圆圈中生成新添加的树,并且还会在非圆形位置生成所有树。为此,我需要一种方法来检查一个位置是否在一个圆圈内,然后检查在预生成的圆圈内需要生成哪些树并添加到Trees表。然后在玩家当前位置的半径范围内产生所有其他树,排除圆桌内的所有其他圆半径。
所以我正在寻找的是一种在玩家当前位置周围随机添加这些树并存储到数据库中的方法,该数据库与任何其他预先生成的区域不重叠。我需要一种在产生区域时存储圆圈的方法,在玩家GPS和半径内产生随机树,而不是存储在数据库中的任何其他圆圈。