2015-12-11 3 views
2

Я делаю небольшое приложение в Ruby On Rails, что давайте вы создаете RPG игры карты, как это:магазин матрица элементов, которые могут быть похожи

enter image description here

На вопрос: «Как должен спасти меня эти данные? », моя первая мысль заключалась бы в создании модели Tile и модели Map, которая has_many :tiles. Вероятно, задав параметр x и y до Tile, чтобы узнать, где их найти на карте.

Но опять же, я смотрю на карту, и я вижу, что есть много плиток, которые точно такие же. Например, «травяные плитки», которые повторяются снова и снова около 40% карты.

Так что мне было интересно. Есть ли более умный способ сохранить эту информацию, которая может сэкономить мне пространство?

ответ

2

Я хотел бы использовать TileType модель для хранения «прототип» из плитки:

tile_types: 
    name (String) 
    id (Integer) 
    sprite (String) 
    travel_cost (Float) 
    # ... 

Они могут быть созданы разработчиками или доверенных пользователей. Затем используйте таблицу соединений (tiles), чтобы связать фактические экземпляры фрагментов с картой.

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 таблицы. Скажем, например, вы хотите, чтобы двигаться по высокой траве плитки медленной:

TileType.find_by(name: 'Tall Grass').update(travel_cost: 1.8) 

В противном случае вы должны найти все плитки, принадлежащие к каждой карте и обновлять их.

+0

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association – max

+0

Немой вопрос. Я знал это. -_- Удаление комментария! –

+0

Зачем устанавливать отношения между 'Map' и' TileType'? –