我正在使用Ruby On Rails创建一个小应用程序,让你创建这样的RPG游戏地图:
关于问题,"我应该如何保存这些数据?",我首先想到的是创建模型Tile
和模型Map
,{{1 }}。可能会向has_many :tiles
提供x和y参数,以了解将它们放置到地图中的位置。
但话又说回来,我看看地图,我看到有很多瓷砖完全相同。例如,"草砖",在地图的大约40%中反复重复。
所以我在想。是否有更智能的方法来保存这些可能为我节省空间的信息?
答案 0 :(得分:1)
我会使用TileType
模型来存储图块的“原型”:
tile_types:
name (String)
id (Integer)
sprite (String)
travel_cost (Float)
# ...
这些可以由开发人员或可信用户创建。
然后使用连接表(tiles
)将实际的tile实例链接到地图。
tiles:
map_id (Integer, foreign key)
tile_id (Integer, foreign key) # you may want an index on [map_id, tile_id]
x (Integer, index)
y (Integer, index) # you may want an index on [x, y]
然后,您将使用具有has_many through:
关系的联接表。
class Map < ActiveRecord::Base
has_many :tiles
has_many :tile_types, through: :tiles
end
class Tile < ActiveRecord::Base
belongs_to :map
belongs_to :tile_type
# example of a geospatial query method
def self.at(x:, y:)
find_by(x: x, y: y)
end
end
class TileType < ActiveRecord::Base
has_many :map_tiles
has_many :maps, through: :tiles
end
除了节省空间,它还允许您通过编辑tile_types
表来调整游戏逻辑。比如说你想要慢慢穿过Tall Grass瓷砖:
TileType.find_by(name: 'Tall Grass').update(travel_cost: 1.8)
否则你必须找到属于每张地图的所有瓷砖并更新它们。