存储可能类似的元素矩阵

时间:2015-12-11 14:13:57

标签: ruby-on-rails ruby database data-structures

我正在使用Ruby On Rails创建一个小应用程序,让你创建这样的RPG游戏地图:

enter image description here

关于问题,"我应该如何保存这些数据?",我首先想到的是创建模型Tile和模型Map,{{1 }}。可能会向has_many :tiles提供x和y参数,以了解将它们放置到地图中的位置。

但话又说回来,我看看地图,我看到有很多瓷砖完全相同。例如,"草砖",在地图的大约40%中反复重复。

所以我在想。是否有更智能的方法来保存这些可能为我节省空间的信息?

1 个答案:

答案 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)

否则你必须找到属于每张地图的所有瓷砖并更新它们。